Регистрация для push-уведомлений в Xcode 8 / Swift 3.0?

Я пытаюсь заставить мое приложение работать вXcode 8.0и сталкиваюсь с ошибкой. Я знаю, что этот код работал хорошо в предыдущих версиях swift, но я предполагаю, что код для этого изменился в новой версии. Вот код, который я пытаюсь запустить:

let settings = UIUserNotificationSettings(forTypes: [.Sound, .Alert, .Badge], categories: nil)     
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
UIApplication.shared().registerForRemoteNotifications()

Я получаю сообщение об ошибке: «Метки аргументов» (forTypes :, Categories :) «не соответствуют ни одной доступной перегрузке»

Есть ли другая команда, чтобы я мог попытаться заставить это работать?

 Elad Nava07 окт. 2016 г., 09:48
Я написал руководство о том, как это сделать:eladnava.com/...

Ответы на вопрос(11)

В iOS10 вместо вашего кода вы должны запросить авторизацию для уведомления со следующим: (Не забудьте добавитьUserNotifications Фреймворк)

if #available(iOS 10.0, *) {
        UNUserNotificationCenter.current().requestAuthorization([.alert, .sound, .badge]) { (granted: Bool, error: NSError?) in
            // Do something here
        }
    }

Кроме того, правильный код для вас (используйте вelse предыдущего условия, например):

let setting = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
UIApplication.shared().registerUserNotificationSettings(setting)
UIApplication.shared().registerForRemoteNotifications()

Наконец, убедитесь, чтоPush Notification активируется подtarget->Capabilities ->Push notification, (установите его наOn)

 Asher Hawthorne22 июн. 2016 г., 03:02
И большое спасибо за документацию, блаблабла! Я не видел этого на их сайте, я рад, что он существует. : D
 Asher Hawthorne22 июн. 2016 г., 03:42
Подожди, я думаю, я понял! Просто пришлось импортировать фреймворк уведомлений. XD
 Asher Hawthorne22 июн. 2016 г., 03:02
Большое спасибо за ответ! Однако, используя код, он говорит: «Использование неразрешенного идентификатора« UNUserNotificationCenter »»
 tsnkff22 июн. 2016 г., 09:22
Ага. Я отредактирую свой ответ, чтобы добавить его для будущего читателя. Также читайте о новых уведомлениях, теперь есть более мощный и интерактивный. :)
 Dilip Tiwari27 сент. 2017 г., 14:42
Я хочу отображать Push-уведомления в Foreground State для iOS 8.0, я получаю уведомления в фоновом состоянии @tsnkff
 Asher Hawthorne22 июн. 2016 г., 21:36
Я так взволнован, я хотел добавить push-уведомления в свое приложение (изучал Xcode как хобби в прошлом году, но есть еще так много вещей, которые мне нужно знать), и с новыми уведомлениями я фигура сейчас самое время. Я получил уведомления, работающие с моим iPhone разработчика, теперь мне просто нужно выяснить, как получить токены для телефонов с рабочей версией и передать их в скрипт php, который я использую.
 tsnkff22 июн. 2016 г., 02:39
см. стр. 73 изApple Doc здесь
 Honey20 февр. 2017 г., 23:01
Каково дополнительное преимущество этой новой структуры? То, что я вижу здесь, - это использование подхода «завершение и делегирование поверх делегата», и затем вам сразу же предоставляется решение: ошибка, предоставлена ​​или не предоставлена ​​.... В 6 <iOS <10 вам пришлось сделать ‍application.isRegisteredForRemoteNotifications() чтобы узнать, предоставлено ли это, и используйте другой метод делегата на случай, если у вас возникла ошибка. Правильно? Что-нибудь еще?

Просто сделайте следующее вdidFinishWithLaunching::

if #available(iOS 10.0, *) {

    let center = UNUserNotificationCenter.current()

    center.delegate = self
    center.requestAuthorization(options: []) { _, _ in
        application.registerForRemoteNotifications()
    }
}

Помните об утверждении импорта:

import UserNotifications
 Bocaxica28 июн. 2017 г., 09:59
Я считаю, что это должен быть принятый ответ. Кажется правильным назватьregisterForRemoteNotifications() в обработчике завершенияrequestAuthorization(), Вы можете даже захотеть окружитьregisterForRemoteNotifications() сif granted заявление:center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in if granted { UIApplication.shared.registerForRemoteNotifications() } }

Ответ отast1 это очень просто и полезно. Это работает для меня, большое спасибо. Я просто хочу показать это здесь, чтобы люди, которым нужен этот ответ, могли легко его найти. Итак, вот мой код регистрации локальных и удаленных (push) уведомлений.

    //1. In Appdelegate: didFinishLaunchingWithOptions add these line of codes
    let mynotif = UNUserNotificationCenter.current()
    mynotif.requestAuthorization(options: [.alert, .sound, .badge]) {(granted, error) in }//register and ask user's permission for local notification

    //2. Add these functions at the bottom of your AppDelegate before the last "}"
    func application(_ application: UIApplication, didRegister notificationSettings: UNNotificationSettings) {
        application.registerForRemoteNotifications()//register for push notif after users granted their permission for showing notification
}
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    print("Device Token: \(tokenString)")//print device token in debugger console
}
    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("Failed to register: \(error)")//print error in debugger console
}
import UserNotifications  

Затем перейдите в редактор проекта для своей цели и на вкладке Общие найдите раздел Связанные фреймворки и библиотеки.

Нажмите + и выберите UserNotifications.framework:

// iOS 12 support
if #available(iOS 12, *) {  
    UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound, .provisional, .providesAppNotificationSettings, .criticalAlert]){ (granted, error) in }
    application.registerForRemoteNotifications()
}

// iOS 10 support
if #available(iOS 10, *) {  
    UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound]){ (granted, error) in }
    application.registerForRemoteNotifications()
}
// iOS 9 support
else if #available(iOS 9, *) {  
    UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
    UIApplication.shared.registerForRemoteNotifications()
}
// iOS 8 support
else if #available(iOS 8, *) {  
    UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
    UIApplication.shared.registerForRemoteNotifications()
}
// iOS 7 support
else {  
    application.registerForRemoteNotifications(matching: [.badge, .sound, .alert])
}

Используйте методы делегата уведомления

// Called when APNs has assigned the device a unique token
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {  
    // Convert token to string
    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    print("APNs device token: \(deviceTokenString)")
}

// Called when APNs failed to register the device for push notifications
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {  
    // Print the error to console (you should alert the user that registration failed)
    print("APNs registration failed: \(error)")
}

Для получения push-уведомления

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    completionHandler(UIBackgroundFetchResult.noData)
}

Настройка push-уведомлений включает функцию в Xcode 8 для вашего приложения. Простоперейти к редактору проекта для вашей цели а затем нажмите наВкладка «Возможности», ИщуВсплывающие уведомления и переключить его значение наНА.

Проверьте ссылку ниже для большего количества методов делегата Уведомления

Обработка локальных и удаленных уведомленийUIApplicationDelegate - Обработка локальных и удаленных уведомлений

https://developer.apple.com/reference/uikit/uiapplicationdelegate

Первыйпрослушать статус уведомления пользователя, т.е.registerForRemoteNotifications() получить токен устройства APNs;
второй, запрос авторизации. Когда санкционировано пользователем, deviceToken будет отправлен слушателю,AppDelegate;
В третьих, сообщите токен устройства на ваш сервер.

extension AppDelegate {
    /// 1. 监听 deviceToken
    UIApplication.shared.registerForRemoteNotifications()

    /// 2. 向操作系统索要推送权限(并获取推送 token)
    static func registerRemoteNotifications() {
        if #available(iOS 10, *) {
            let uc = UNUserNotificationCenter.current()
            uc.delegate = UIApplication.shared.delegate as? AppDelegate
            uc.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
                if let error = error { // 无论是拒绝推送,还是不提供 aps-certificate,此 error 始终为 nil
                    print("UNUserNotificationCenter 注册通知失败, \(error)")
                }
                DispatchQueue.main.async {
                    onAuthorization(granted: granted)
                }
            }
        } else {
            let app = UIApplication.shared
            app.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil)) // 获取用户授权
        }
    }

    // 在 app.registerUserNotificationSettings() 之后收到用户接受或拒绝及默拒后,此委托方法被调用
    func application(_ app: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {
        // 已申请推送权限,所作的检测才有效
        // a 征询推送许可时,用户把app切到后台,就等价于默拒了推送
        // b 在系统设置里打开推送,但关掉所有形式的提醒,等价于拒绝推送,得不token,也收不推送
        // c 关掉badge, alert和sound 时,notificationSettings.types.rawValue 等于 0 和 app.isRegisteredForRemoteNotifications 成立,但能得到token,也能收到推送(锁屏和通知中心也能看到推送),这说明types涵盖并不全面
        // 对于模拟器来说,由于不能接收推送,所以 isRegisteredForRemoteNotifications 始终为 false
       onAuthorization(granted: app.isRegisteredForRemoteNotifications)
    }

    static func onAuthorization(granted: Bool) {
        guard granted else { return }
        // do something
    }
}

extension AppDelegate {
    func application(_ app: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        //
    }

    // 模拟器得不到 token,没配置 aps-certificate 的项目也得不到 token,网络原因也可能导致得不到 token
    func application(_ app: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        //
    }
}
 ArgaPK05 мар. 2018 г., 11:50
как добавить несколько уведомлений?
 DawnSong05 мар. 2018 г., 12:53
@ArgaPK, отправлять push-уведомления - это то, что делает ваша серверная платформа.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    if #available(iOS 10, *) {

        //Notifications get posted to the function (delegate):  func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void)"


        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in

            guard error == nil else {
                //Display Error.. Handle Error.. etc..
                return
            }

            if granted {
                //Do stuff here..

                //Register for RemoteNotifications. Your Remote Notifications can display alerts now :)
                DispatchQueue.main.async {
                    application.registerForRemoteNotifications()
                }
            }
            else {
                //Handle user denying permissions..
            }
        }

        //Register for remote notifications.. If permission above is NOT granted, all notifications are delivered silently to AppDelegate.
        application.registerForRemoteNotifications()
    }
    else {
        let settings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        application.registerUserNotificationSettings(settings)
        application.registerForRemoteNotifications()
    }

    return true
}
 Honey21 февр. 2017 г., 00:14
О, хорошо ... интересно .... Вы имеете в виду полезную нагрузку будет иметьURL из гифки? или отправляется какData?
 DawnSong09 нояб. 2017 г., 13:11
error вrequestAuthorization(options:completionHandler:) всегда равен нулю, когда я отказываюсь получать уведомление или не предоставляю aps-сертификат. Как получить реальную ошибку?
 DawnSong12 февр. 2018 г., 04:04
Ваш ответ не очень понятен.application.registerForRemoteNotifications() идет первым, затем запросить разрешение. Первый шаг просто может получить несколько обратных вызовов из системы iOS в didRegisterForRemoteNotificationsWithDeviceToken из AppDelegate, если вы включите и выключите переключатель уведомлений несколько раз.
 ArgaPK05 мар. 2018 г., 11:51
Как добавить / запустить несколько уведомлений?
 Dilip Tiwari27 сент. 2017 г., 14:44
Я хочу отображать Push-уведомления в Foreground State для iOS 8.0, я получаю уведомления в фоновом режиме @ChrisAllinson
 Brandon21 февр. 2017 г., 00:17
@ Почтовое уведомление будет отображаться в виде GIF-файла при его получении и открытии. Если это видео, оно будет отображать эскиз, как изображение. URL будет загружен принимающим устройством. Если он локальный, он будет отправлен как данные, и принимающее устройство отобразит его правильно. Я считаю, что видео будут отправляться только в виде URL, но с предварительным просмотром (как в iMessage). Я еще не попробовал их все; только картинки и гифки.
 Honey20 февр. 2017 г., 23:33
почему ваш отличается от принятого ответа? У него естьapplication.registerForRemoteNotifications() после егоcenter.requestAuthorization
 Smartcat12 апр. 2018 г., 19:07
@DawnSong Я не верю, что порядок имеет значение для iOS. Это может иметь значение для вашего приложения. Если вы не запрашиваете и не получаете разрешения, iOS автоматически уведомит ваше приложение. Поэтому, как правило, лучше запрашивать разрешение у пользователя ДО регистрации (а затем только при наличии разрешения), если вы не хотите получать уведомления без вывода сообщений.
 Chris Allinson27 сент. 2017 г., 22:50
@DilipTiwari В последний раз я проверял, что вы можете «услышать», что получен толчок, но вы должны вручную обработать этот случай вdidReceiveRemoteNotification Метод AppDelegate (и что-то отображается вручную для пользователя) ... некоторые дальнейшие чтения SO:stackoverflow.com/questions/14872088/...
 Brandon20 февр. 2017 г., 23:46
Чтобы добавить вложения, вы делаете:notification.content.attachments = [UNNotificationAttachment(identifier: "png_identifier", url:imageURL , options: nil)] или жеUNNotificationAttachment(identifier: "audio_identifier", url:imageURL , options: [UNNotificationAttachmentOptionsTypeHintKey:kUTTypeMP3])и т. д. например.
 Brandon20 февр. 2017 г., 23:41
@Мед; Это добавляется, если вы хотите, чтобы «Удаленные» уведомления были включены. Когда я писал свой ответ, другого ответа не было, и @OP не указывал, нужна ли им удаленная или локальная поддержка или поддержка iOS 10, поэтому я добавил столько, сколько смог. Примечание. Не следует регистрироваться для удаленных уведомлений до тех пор, пока пользователь не предоставит доступ (в противном случае все удаленные уведомления доставляются без уведомления (если это не то, что вам нужно) - без всплывающих окон). Кроме того, преимущество нового API заключается в том, что он поддерживает вложения. Другими словами, вы можете добавить GIF и другие изображения, видео и т. Д. В ваши уведомления.
 Codenator8104 окт. 2018 г., 13:44
Преимущество этого решения, когда использование не в AppDelegate, чтобы сделать то же самое в коде
 Chris Allinson23 февр. 2017 г., 03:43
В заключение вам необходимо выполнить задачи, связанные с пользовательским интерфейсом, в главном потоке ... DispatchQueue.main.async {... делать что-то здесь ...}
 Honey20 февр. 2017 г., 22:56
Каково дополнительное преимущество этой новой структуры? То, что я вижу здесь, - это использование подхода «завершение и делегирование поверх делегата», и затем вам сразу же предоставляется решение: ошибка, предоставлена ​​или не предоставлена ​​.... В 6 <iOS <10 вам пришлось сделать ‍application.isRegisteredForRemoteNotifications() чтобы узнать, предоставлено ли это, и используйте другой метод делегата на случай, если у вас возникла ошибка. Правильно? Что-нибудь еще?

Ну, это работа для меня. Первый в AppDelegate

import UserNotifications

Затем:

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        registerForRemoteNotification()
        return true
    }

    func registerForRemoteNotification() {
        if #available(iOS 10.0, *) {
            let center  = UNUserNotificationCenter.current()
            center.delegate = self
            center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
                if error == nil{
                    UIApplication.shared.registerForRemoteNotifications()
                }
            }
        }
        else {
            UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.sound, .alert, .badge], categories: nil))
            UIApplication.shared.registerForRemoteNotifications()
        }
    }

Чтобы получить, устройство deviceken:

  func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

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

}

Взгляните на этот закомментированный код:

import Foundation
import UserNotifications
import ObjectMapper

class AppDelegate{

    let center = UNUserNotificationCenter.current()
}

extension AppDelegate {

    struct Keys {
        static let deviceToken = "deviceToken"
    }

    // MARK: - UIApplicationDelegate Methods
    func application(_: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

        if let tokenData: String = String(data: deviceToken, encoding: String.Encoding.utf8) {
            debugPrint("Device Push Token \(tokenData)")
        }

        // Prepare the Device Token for Registration (remove spaces and < >)
        setDeviceToken(deviceToken)
    }

    func application(_: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        debugPrint(error.localizedDescription)
    }

    // MARK: - Private Methods
    /**
     Register remote notification to send notifications
     */
    func registerRemoteNotification() {

        center.requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in

            // Enable or disable features based on authorization.
            if granted  == true {

                DispatchQueue.main.async {
                    UIApplication.shared.registerForRemoteNotifications()
                }
            } else {
                debugPrint("User denied the permissions")
            }
        }
    }

    /**
     Deregister remote notification
     */
    func deregisterRemoteNotification() {
        UIApplication.shared.unregisterForRemoteNotifications()
    }

    func setDeviceToken(_ token: Data) {
        let token = token.map { String(format: "%02.2hhx", arguments: [$0]) }.joined()
        UserDefaults.setObject(token as AnyObject?, forKey: “deviceToken”)
    }

    class func deviceToken() -> String {
        let deviceToken: String? = UserDefaults.objectForKey(“deviceToken”) as? String

        if isObjectInitialized(deviceToken as AnyObject?) {
            return deviceToken!
        }

        return "123"
    }

    func isObjectInitialized(_ value: AnyObject?) -> Bool {
        guard let _ = value else {
                return false
         }
            return true
    }
}

extension AppDelegate: UNUserNotificationCenterDelegate {

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping(UNNotificationPresentationOptions) -> Swift.Void) {

        ("\(notification.request.content.userInfo) Identifier: \(notification.request.identifier)")

        completionHandler([.alert, .badge, .sound])
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Swift.Void) {

        debugPrint("\(response.notification.request.content.userInfo) Identifier: \(response.notification.request.identifier)")

    }
}

Дайте мне знать, если есть какие-либо проблемы!

Решение Вопроса

ИмпортироватьUserNotifications рамки и добавитьUNUserNotificationCenterDelegate в AppDelegate.swift

Запросить разрешение пользователя

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {


        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
            // Enable or disable features based on authorization.
        }
        application.registerForRemoteNotifications()
        return true
}

Получение токена устройства

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

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

В случае ошибки

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {

        print("i am not available in simulator \(error)")
}

В случае, если вам нужно знать предоставленные разрешения

UNUserNotificationCenter.current().getNotificationSettings(){ (settings) in

            switch settings.soundSetting{
            case .enabled:

                print("enabled sound setting")

            case .disabled:

                print("setting has been disabled")

            case .notSupported:
                print("something vital went wrong here")
            }
        }
 LC 웃28 сент. 2016 г., 05:56
@BrianFLeighty Спасибо, я отредактировал как комментарий ast1
 Ayaz20 сент. 2016 г., 08:50
Hay вы можете предоставить сохранить в цель c
 Brian F Leighty27 сент. 2016 г., 22:04
Просто заметка, больше не возвращает токен устройства. По крайней мере, в моем случае он просто возвращает «32 байта»
 LC 웃23 февр. 2017 г., 03:53
@ChrisAllinson обратный вызов всегда находится в главном потоке после завершения операции
 KML14 нояб. 2016 г., 12:58
@ Anish 웃 Привет, это было бы здорово, если бы вы могли предложить ответ на мои вопросы здесь! :)stackoverflow.com/questions/40587598/...
 KML13 нояб. 2016 г., 22:42
Как я могу зарегистрироваться для удаленных уведомлений за пределами AppDelegate? Я не хочу, чтобы всплывающие окна были первым делом, когда пользователь открывает приложение.
 n3wbie05 окт. 2016 г., 18:59
Не забудьте связать UserNotifications.framework с вашей целью и импортировать ее в ваш AppDelegate. ;)
 LukeSideWalker04 февр. 2017 г., 17:50
Сначала спасибо, и прошу прощения за следующий вопрос, который возникает просто из-за недостатка опыта и знаний: каково назначение устройства Token, для чего оно используется?
 Dilip Tiwari19 сент. 2017 г., 14:03
@ThatlazyiOSGuy 웃 Можете ли вы сказать мне пошаговую процедуру, если пользователь, зарегистрировавшийся в веб-приложении, получит уведомления
 ArgaPK05 мар. 2018 г., 11:50
Как добавить / запустить несколько уведомлений?
 Pavlos23 апр. 2017 г., 16:38
У меня есть неразрешенный идентификатор: «UNUserNotificationCenter», знаете, почему? Я использую Swift 3.1
 Allen29 сент. 2016 г., 20:45
@ Async - вы не видите current (), потому что он работает только в Swift 3.
 Chris Allinson23 февр. 2017 г., 03:42
В заключение вам нужно будет выполнить задачи, связанные с пользовательским интерфейсом, в главном потоке ... DispatchQueue.main.async {... обновить метку ...}
 LC 웃05 февр. 2017 г., 04:33
@LukeSideWalker Маркер устройства представляет собой идентификатор устройства, получающего уведомление. APNs использует токены устройства для идентификации каждой уникальной комбинации приложения и устройства.Вот
 Async-02 авг. 2016 г., 15:16
Я получаю сообщение об ошибке в Swift 2.3: UNUserNotificationCenter не имеет текущего члена
 DawnSong12 февр. 2018 г., 04:03
application.registerForRemoteNotifications() идет первым, затем запросить разрешение. Первый шаг просто может получить несколько обратных вызовов из системы iOS вAppDelegate«sdidRegisterForRemoteNotificationsWithDeviceToken если вы включите и выключите уведомление несколько раз.
 LC 웃23 апр. 2017 г., 18:00
@PavlosNicolaou Импорт инфраструктуры пользовательских уведомлений
 LC 웃14 нояб. 2016 г., 13:09
@KML просто оберните этот блок утвержденийlet center = UNUserNotificationCenter.current() center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in // Enable or disable features based on authorization. } application.registerForRemoteNotifications() внутри метода в AppDelegate. И вызовите метод-обертку из любого места, получив ссылку на AppDelegate. Сохраняйте эти методы наdidFinishLaunchingWithOptions запросить разрешение, как только приложение будет запущено. Сделайте, как я уже говорил ранее

У меня были проблемы с ответами здесь при преобразовании объекта DeviceToken Data в строку для отправки на мой сервер с текущей бета-версией Xcode 8. Особенно тот, который использовал deviceToken.description, как в 8.0b6, который возвращал бы «32 байта», который не очень полезно :)

Это то, что сработало для меня ...

Создайте расширение в Data для реализации метода «hexString»:

extension Data {
    func hexString() -> String {
        return self.reduce("") { string, byte in
            string + String(format: "%02X", byte)
        }
    }
}

И затем используйте это при получении обратного вызова от регистрации для удаленных уведомлений:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let deviceTokenString = deviceToken.hexString()
    // Send to your server here...
}
 Aviel Gross14 сент. 2016 г., 13:55
Абсурд, что нет никакого решения, исходящего от самого API
 tomwilson03 нояб. 2016 г., 08:19
Да, это всегда было довольно странно, что API ... удивлен, что они не исправили это при создании новой платформы уведомлений в iOS10
 alain.s31 авг. 2016 г., 10:24
У меня также была проблема «32 байта». Отличное решение, вы можете сделать преобразование в строке без создания расширения. Как это:let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})

Heads up, вы должны использовать основной поток для этого действия.

let center = UNUserNotificationCenter.current()
center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
        if granted {
            DispatchQueue.main.async(execute: {
                UIApplication.shared.registerForRemoteNotifications()
            })
        }
    }

Ваш ответ на вопрос