在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中清除它。 然后再做一遍。