2015-05-03 7 views
11

In qualche modo non riesco a ricevere il token del dispositivo durante la registrazione per le notifiche remote. Ricevo il modale che dice "Vuoi consentire a App X di essere in grado di inviarti notifiche", ma quando lo accetto, la funzione didRegisterForRemoteNotifications non viene chiamata.Token del dispositivo non ricevuto durante la registrazione per le notifiche remote in Swift

Quando la registrazione a notifiche remote in iOS 8/Swift utilizzando questo codice:

UIApplication.sharedApplication().registerForRemoteNotifications() 
    let settings = UIUserNotificationSettings(forTypes: UIUserNotificationType.Badge | UIUserNotificationType.Alert | UIUserNotificationType.Sound, categories: nil) 
    UIApplication.sharedApplication().registerUserNotificationSettings(settings) 
    UIApplication.sharedApplication().registerForRemoteNotifications() 

Queste funzioni non vengono attivate affatto:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!) 

e

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError!) 

tuttavia quando registro questo

println("current settings \(UIApplication.sharedApplication().currentUserNotificationSettings()) and \(UIApplication.sharedApplication().isRegisteredForRemoteNotifications())") 

ricevo

"current settings <UIUserNotificationSettings: 0x170437120; types: (UIUserNotificationTypeAlert UIUserNotificationTypeBadge UIUserNotificationTypeSound);> and true" 

mio profilo di provisioning e certificati ar tutto in ordine.

Qualcun altro ha avuto questo problema?

+0

Perché si chiama 'registerForRemoteNotifications()' due volte? – ricardopereira

+0

1) creare notifica push e allegare con il proprio profilo 2) on in funzionalità push notification 3) Invia token dispositivo vedere di più in basso la mia risposta è lì –

risposta

22

Si può provare questo

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: Aggiornamento per 2.x Swift

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: Aggiornamento per 3.x Swift

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) 
} 
+1

Ancora non funziona! Potrebbe avere qualcosa a che fare con un certificato? –

+0

sì, quello che devi fare, creare di nuovo da zero. –

+0

please upvote :) –

0

Se si ottiene questo messaggio, significa che si è già registrato e il metodo verrà chiamato solo quando l'applicazione viene avviata o il token viene modificato. Ha una leggera possibilità che il token venga aggiornato.

Probabilmente, puoi provare a eliminare l'applicazione dal tuo dispositivo di prova e provare a cancellarla da Xcode. E fallo di nuovo.

+0

Grazie per la risposta, ma l'ho già provato e provato su più dispositivi. –

1

Do questo:

UIApplication.sharedApplication().registerForRemoteNotifications() 
1

Assicurati che i tuoi certificati siano validi e l'app sia registrata correttamente, fai un po 'di ricerca su Google e troverai sicuramente la strada giusta. Questo codice ha funzionato per me.

(in AppDelegate.swift metodo didFinishLaunchingWithOptions)

var notify : UIUserNotificationSettings = UIUserNotificationSettings(forTypes:UIUserNotificationType.Alert|UIUserNotificationType.Sound, categories: nil) 
    UIApplication.sharedApplication().registerUserNotificationSettings(notify) 
    UIApplication.sharedApplication().registerForRemoteNotifications() 

// Aggiungere metodi delegato di UIApplication

func application(application: UIApplication,didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData){ 
//send this device token to server 

    println("\(deviceToken)") 
} 

// Chiamato se in grado di registrare per APNS.

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) { 

    println(error) 

} 
4

Per Swift 3.0 è possibile utilizzare:

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