web-dev-qa-db-fra.com

Jeton de périphérique non reçu lors de l'enregistrement de notifications à distance dans Swift

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? 

11
Samuel B.

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)
}
23
Mohammad Nurdin

Pour Swift 3.0, vous pouvez utiliser:

let deviceTokenString = message.reduce("", {$0 + String(format: "%02X", $1)})
4
vedrano

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)")  
} 
1
Priti Kanauziya

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)

}
1
Princes

Faire ceci:

   UIApplication.sharedApplication().registerForRemoteNotifications()
1
phnmnn

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. 

0
Lucas Huang