Маркер устройства не принимается при регистрации для удаленных уведомлений в Swift
Я как-то не могу получить токен устройства при регистрации для удаленных уведомлений. Я получаю модальное высказывание "Вы хотите, чтобы приложение X могло отправлять вам уведомления", но когда я его принимаю, функция 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()
Эти функции не запускаются вообще:
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData!)
и
func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError!)
однако, когда я регистрирую это
println("current settings \(UIApplication.sharedApplication().currentUserNotificationSettings()) and \(UIApplication.sharedApplication().isRegisteredForRemoteNotifications())")
Я получаю
"current settings <UIUserNotificationSettings: 0x170437120; types: (UIUserNotificationTypeAlert UIUserNotificationTypeBadge UIUserNotificationTypeSound);> and true"
Мой профиль и сертификаты профилей все в порядке.
У кого-то еще была эта проблема?
Ответы
Ответ 1
Вы можете попробовать это
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: обновление для 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: обновление для 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)
}
Ответ 2
Для Swift 3.0 вы можете использовать:
let deviceTokenString = message.reduce("", {$0 + String(format: "%02X", $1)})
Ответ 3
Сделайте это:
UIApplication.sharedApplication().registerForRemoteNotifications()
Ответ 4
Пожалуйста, убедитесь, что ваши сертификаты действительны, и приложение зарегистрировано успешно, выполните некоторые действия в Google и убедитесь, что найдете правильный путь. Этот код работал у меня.
(в приложении 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)
}
Ответ 5
Если вы получили это сообщение, вы уже зарегистрировались, и метод будет вызван только тогда, когда приложение запустится или токен будет изменен. У него есть небольшая вероятность, что токен будет обновлен.
Возможно, вы можете попытаться удалить приложение с вашего тестового устройства и попытаться очистить его от Xcode. И сделайте это снова.