【问题标题】:Get the push notification token - iOS 10, Swift 3获取推送通知令牌 - iOS 10、Swift 3
【发布时间】:2017-01-26 16:06:25
【问题描述】:

如何在 iOS 10 中从新的 xCode 8Swift 3 获取设备令牌?

这里是注册通知的代码:

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

    DispatchQueue.main.async {
        let settings = UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(settings)
    }
    return true
}

func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) {

    if notificationSettings.types != UIUserNotificationType() {
        application.registerForRemoteNotifications()
    }
}

在这里我得到了令牌,但我得到了以下错误

Cannot invoke initializer for type 'UnsafePointer<CChar>' with an argument list of type '(UnsafeRawPointer)':

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

    let chars = UnsafePointer<CChar>((deviceToken as NSData).bytes)
    var token = ""

    for i in 0..<deviceToken.count {
        token += String(format: "%02.2hhx", arguments: [chars[i]])
    }

    print("Registration succeeded!")
    print("Token: ", token)
}

谁能帮我解决?

【问题讨论】:

标签: push-notification notifications swift3 ios10


【解决方案1】:

由于您可能在不同的方法中需要此令牌(例如 firebase、web 参与、分支等),您可以使用自定义类从包含 datastring 的数据中初始化 APNS

public class APNS {
    public init(deviceToken data: Data) {
        self.data = data
        self.string = data.map { data in String(format: "%02.2hhx", data) } .joined()
    }

    public let data: Data
    public let string: String
}

那么你可以在任何你需要的地方使用它:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = APNS(deviceToken: deviceToken)
    print(token.string)
}

【讨论】:

    【解决方案2】:

    一行:

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let apnsDeviceToken = deviceToken.map {String(format: "%02.2hhx", $0)}.joined()
    }
    

    From this tutorial.

    或者模块化/封装/OOP方式:

    extension Data {
      var string: String {
        return map {String(format: "%02.2hhx", $0)}.joined()
      }
    }
    

    那么你可以这样做:

    let token = deviceToken.string
    

    【讨论】:

      【解决方案3】:

      来自 Mixpanel 库的代码

          let tokenChars = (deviceToken as NSData).bytes.assumingMemoryBound(to: CChar.self)
          var tokenString = ""
          for i in 0..<deviceToken.count {
              tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
          }
      

      【讨论】:

        【解决方案4】:

        获取推送通知令牌的工作代码 - iOS 11 或更高版本,Swift 4

        请求用户权限

        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        
            let notificationTypes: UIUserNotificationType = [UIUserNotificationType.alert,UIUserNotificationType.badge, UIUserNotificationType.sound]
            let pushNotificationSettings = UIUserNotificationSettings(types: notificationTypes, categories: nil)
        
            application.registerUserNotificationSettings(pushNotificationSettings)
            application.registerForRemoteNotifications()
        
            return true        
        }
        

        获取设备令牌

        func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        
            let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
            print(token) 
        }
        

        出现错误时

        func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        
            print("i am not available in simulator \(error)")
        }
        

        【讨论】:

          【解决方案5】:

          此方法可能会解决您在 iOS 10 及更高版本中的问题:

          func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
              var token = ""
              for i in 0..<deviceToken.count {
                  token = token + String(format: "%02.2hhx", arguments: [deviceToken[i]])
              }
              print(token)
          }
          

          【讨论】:

          • 我没有投反对票。但也许是因为没有解释为什么/如何 Data 需要像这样转换为 String
          【解决方案6】:

          它可以工作:

          let chars = UnsafePointer<CChar>((deviceToken as NSData).bytes.assumingMemoryBound(to:CChar.self))
          

          谢谢!

          【讨论】:

            【解决方案7】:

            以下 snnipet 正在使用 Eric Aya 解决方案:

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

            感谢大家的帮助:)

            【讨论】:

              【解决方案8】:

              Swift 3 示例取自 raywenderlich.com

              func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
                  let tokenParts = deviceToken.map { data -> String in
                      return String(format: "%02.2hhx", data)
                  }  
                  let token = tokenParts.joined()
                  print(token)
              }
              

              【讨论】:

                【解决方案9】:

                面临同样的问题,这是唯一帮助我的事情:

                func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
                    let token = String(format: "%@", deviceToken as CVarArg)
                        .trimmingCharacters(in: CharacterSet(charactersIn: "<>"))
                        .replacingOccurrences(of: " ", with: "")
                }
                

                【讨论】:

                  【解决方案10】:
                  var pushToken = String(format: "%@", deviceToken as CVarArg)
                  pushToken = pushToken.trimmingCharacters(in: CharacterSet(charactersIn: "<>"))
                  pushToken = pushToken.replacingOccurrences(of: " ", with: "")
                  

                  【讨论】:

                    猜你喜欢
                    • 2016-12-20
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-03-30
                    • 2012-02-06
                    相关资源
                    最近更新 更多