Маркер устройства не принимается при регистрации для удаленных уведомлений в 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. И сделайте это снова.