En quelque sorte, je ne peux pas recevoir le jeton de périphérique lors de l’enregistrement des notifications à distance. Je reçois le message modal "Voulez-vous autoriser App X à pouvoir vous envoyer des notifications", mais lorsque je l'accepte, la fonction didRegisterForRemoteNotifications n'est pas appelée.
Lorsque je m'inscris pour les notifications à distance dans iOS 8/Swift en utilisant ce code:
UIApplication.sharedApplication().registerForRemoteNotifications()
let settings = UIUserNotificationSettings(forTypes: UIUserNotificationType.Badge | UIUserNotificationType.Alert | UIUserNotificationType.Sound, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
UIApplication.sharedApplication().registerForRemoteNotifications()
Ces fonctions ne sont pas déclenchées du tout:
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!)
et
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError!)
mais quand je me connecte cette
println("current settings \(UIApplication.sharedApplication().currentUserNotificationSettings()) and \(UIApplication.sharedApplication().isRegisteredForRemoteNotifications())")
Je reçois
"current settings <UIUserNotificationSettings: 0x170437120; types: (UIUserNotificationTypeAlert UIUserNotificationTypeBadge UIUserNotificationTypeSound);> and true"
Mon profil d'approvisionnement et mes certificats sont tous en ordre.
Quelqu'un at-il eu ce problème?
Tu peux essayer ça
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
var types: UIUserNotificationType = UIUserNotificationType.Badge |
UIUserNotificationType.Alert |
UIUserNotificationType.Sound
var settings: UIUserNotificationSettings = UIUserNotificationSettings(forTypes: types, categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
return true
}
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
var characterSet: NSCharacterSet = NSCharacterSet(charactersInString: "<>")
var deviceTokenString: String = (deviceToken.description as NSString)
.stringByTrimmingCharactersInSet(characterSet)
.stringByReplacingOccurrencesOfString( " ", withString: "") as String
println(deviceTokenString)
}
EDIT: mise à jour pour Swift 2.x
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
return true
}
EDIT: mise à jour pour Swift 3.x
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
return true
}
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
let characterSet = CharacterSet(charactersIn: "<>")
let deviceTokenString = deviceToken.description.trimmingCharacters(in: characterSet).replacingOccurrences(of: " ", with: "");
print(deviceTokenString)
}
Pour Swift 3.0, vous pouvez utiliser:
let deviceTokenString = message.reduce("", {$0 + String(format: "%02X", $1)})
Pour Swift 4.0, veuillez suivre les étapes suivantes:
1) .On notification Push en capacités (TARGET)
2) .Utilisez ce code dans didFinishLaunchingWithOptions
let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings(settings)
application.registerForRemoteNotifications()
3) .Add cela aussi
func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let tokenParts = deviceToken.map { data -> String in
return String(format: "%02.2hhx", data)
}
let token = tokenParts.joined()
print("Device Token: \(token)")
}
Assurez-vous que vos certificats sont valides et que l'application est enregistrée avec succès, faites des recherches sur Google et vous trouverez le moyen correct.
(dans la méthode AppDelegate.Swift didFinishLaunchingWithOptions)
var notify : UIUserNotificationSettings = UIUserNotificationSettings(forTypes:UIUserNotificationType.Alert|UIUserNotificationType.Sound, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notify)
UIApplication.sharedApplication().registerForRemoteNotifications()
// Ajouter des méthodes déléguées d'UIApplication
func application(application: UIApplication,didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData){
//send this device token to server
println("\(deviceToken)")
}
// Appelé s'il est impossible de s'enregistrer pour APNS.
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
println(error)
}
Faire ceci:
UIApplication.sharedApplication().registerForRemoteNotifications()
Si vous recevez ce message, vous vous êtes déjà inscrit et la méthode ne sera appelée que lorsque l'application sera lancée ou le jeton modifié. Il y a peu de chance que le jeton soit mis à jour.
Probablement, vous pouvez essayer de supprimer l'application de votre appareil de test et d'essayer de la supprimer de Xcode. Et refais-le.