Ios 正在Swift 4中获取远程通知设备令牌?

Ios 正在Swift 4中获取远程通知设备令牌?,ios,swift,apple-push-notifications,devicetoken,Ios,Swift,Apple Push Notifications,Devicetoken,我正在使用此代码获取通知中心设备令牌 它在Swift 3中工作,但在Swift 4中不工作。什么改变了 if #available(iOS 10.0, *) { let center = UNUserNotificationCenter.current() center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in } } func application(_

我正在使用此代码获取通知中心设备令牌

它在Swift 3中工作,但在Swift 4中不工作。什么改变了

if #available(iOS 10.0, *) {
    let center = UNUserNotificationCenter.current()
    center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in

    }
}

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {    
    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    print(deviceTokenString)
}

假设您已经检查了所有设置是否正确,根据您的代码,它似乎可以正常工作,您所要做的就是将格式更改为
%02.2hhx
,而不是
%02X
,以获得适当的十六进制字符串。因此,你应该得到一个有效的

作为一种良好的做法,您可以在项目中添加
数据
扩展以获取字符串:

import Foundation

extension Data {
    var hexString: String {
        let hexString = map { String(format: "%02.2hhx", $0) }.joined()
        return hexString
    }
}
用法:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let deviceTokenString = deviceToken.hexString
    print(deviceTokenString)
}
func应用程序(application:UIApplication,DidRegisterForRemotionTificationswithDeviceToken deviceToken:Data)
{
让tokenChars=(deviceToken作为NSData).bytes.bindMemory(to:CChar.self,capacity:deviceToken.count)
var tokenString=“”
对于0中的i..获取设备令牌

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // Convert token to string
    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
}

希望这将帮助您

获取设备登录的工作代码-iOS 11或更高版本,Swift 4 | Swift 5

请求用户权限

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, 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)")
}

您可以按如下方式获取设备令牌:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    print("Device Token : ",token)
}

使用以下代码获取设备令牌:

 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("Device Token = \(token)")



}
func应用程序(application:UIApplication,DidRegisterForRemotionTificationswithDeviceToken deviceToken:Data){
var token=“”
因为我在0..Swift 5
你可以用like

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

您可以同时使用此功能获取设备令牌和FCM令牌:

func application(_ application:UIApplication,didRegisterForRemoteNotificationsWithDeviceToken 
devicetoken: Data)
 {
        let deviceTokenString = deviceToken.hexString
        print(deviceTokenString)
 }

对于设备令牌,请使用以下命令:

func application(_ application:UIApplication,didRegisterForRemoteNotificationsWithDeviceToken 
devicetoken: Data)
 {
        let deviceTokenString = deviceToken.hexString
        print(deviceTokenString)
 }
对于FCM令牌,请使用以下命令:

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
    print("Firebase registration token: \(fcmToken)")
    userDefault.set(fcmToken, forKey: "fcmToken")

}
 let deviceIds = UIDevice.current.identifierForVendor!.uuidString
对于UUID,请使用以下命令:

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
    print("Firebase registration token: \(fcmToken)")
    userDefault.set(fcmToken, forKey: "fcmToken")

}
 let deviceIds = UIDevice.current.identifierForVendor!.uuidString

谢谢@Ahmad,但它的代码已被弃用。我的控件没有调用didRegisterForRemoteNotificationsWithDeviceToken委托。好吧,这将是另一个问题,如果该方法甚至无法访问,那么您将丢失一些内容…请重新检查通知的设置。在我的最后一个工作日,它工作正常。今天不知道为什么不禁用e跟踪问题%02.2hhx将做什么?请您解释一下。为什么在演示代码中使用
应用程序
方法(
请求用户权限
获取设备令牌
以防出错
)是否有不同的签名?是否存在可以处理上述所有情况的签名版本?@zionpi是的,您需要启用来自capabilities的推送通知,然后注册验证以获取令牌,这意味着可以一次调用这三种不同的
应用程序
方法pp同时?@NikunjKumbhani@zionpi是,这都是为远程通知注册设备的委托方法