在Swift中注册远程通知时未收到设备令牌

注册远程通知时,我无法收到设备令牌。 我得到的模态说:“你想让App X能够发送notificaitons”,但是当我接受它,didRegisterForRemoteNotifications函数不会被调用。

当我使用以下代码在iOS 8 / Swift中注册远程通知时:

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

这些function根本不被触发:

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

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

但是当我login这个

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

我收到

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

我的configuration文件和证书都是按顺序排列的。

有其他人有这个问题吗?

你可以试试这个

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

编辑:更新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 } 

编辑:更新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) } 

对于Swift 3.0,你可以使用:

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

做这个:

  UIApplication.sharedApplication().registerForRemoteNotifications() 

请确保您的证书是有效的,应用程序注册成功,做一些谷歌search,你一定会find正确的方式。这个代码为我工作。

(在AppDelegate.swift didFinishLaunchingWithOptions方法中)

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

//添加UIApplication的委托方法

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

//如果无法注册APNS,则调用。

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

如果您收到此消息,则说明您已经注册,并且只有在应用程序启动或令牌被更改时才会调用该方法。 令牌很有可能会被更新。

也许,你可以尝试从你的testing设备上删除应用程序,并尝试从Xcode中清除它。 然后再做一遍。