Reputation: 1100
I am using this code to get the Notification Center Device token.
It was working in Swift 3 but not working in Swift 4. What changed?
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)
}
Upvotes: 29
Views: 55664
Reputation: 472
Not any of this solutions acceptable for me, maybe this solution will help someone, as it did to me.
/// A `String` of the Hexidecimal representation of this `Data` object
public var hexEncodedString: String {
// Reserver enough memory to hold all the elements
var chars: [unichar] = []
chars.reserveCapacity(2 * count)
// Convert the byte data into its corresponding hex value
for byte in self {
chars.append(Data.utf16HexDigits[Int(byte / 16)])
chars.append(Data.utf16HexDigits[Int(byte % 16)])
}
return String(utf16CodeUnits: chars, count: chars.count)
}
Upvotes: 0
Reputation: 3924
Working Code for getting deviceToken in - iOS 11 or greater, Swift 4 | Swift 5
Request user permission
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
// If granted comes true you can enabled features based on authorization.
guard granted else { return }
application.registerForRemoteNotifications()
}
return true
}
Getting device token
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print(token)
}
In case of error
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
print("i am not available in simulator :( \(error)")
}
Upvotes: 38
Reputation: 31645
Assuming that you already checked that everything has been setup right, based on your code, it seems that it should works fine, all you have to do is to change the format to %02.2hhx
instead of %02X
to get the appropriate hex string. Thus you should get a valid one.
As a good practice, you could add a Data
extension into your project for getting the string:
import Foundation
extension Data {
var hexString: String {
let hexString = map { String(format: "%02.2hhx", $0) }.joined()
return hexString
}
}
Usage:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let deviceTokenString = deviceToken.hexString
print(deviceTokenString)
}
Upvotes: 70
Reputation: 2139
To get device token
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
// Convert token to string
let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
}
Hope this will help you
Upvotes: 1
Reputation: 920
You can use this both function for getting Device Token & FCM Token:
For device token use this:
func application(_ application:UIApplication,didRegisterForRemoteNotificationsWithDeviceToken
devicetoken: Data)
{
let deviceTokenString = deviceToken.hexString
print(deviceTokenString)
}
For FCM token use this:
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
print("Firebase registration token: \(fcmToken)")
userDefault.set(fcmToken, forKey: "fcmToken")
}
For UUID use this:
let deviceIds = UIDevice.current.identifierForVendor!.uuidString
Upvotes: 1
Reputation: 40136
You can use like,
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let hexString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
print(hexString)
}
Upvotes: 3
Reputation: 832
Use Below code for getting Device 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)")
}
Upvotes: 0
Reputation: 9734
You can get the device token like this:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
print("Device Token : ",token)
}
Upvotes: 0
Reputation: 4917
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
let tokenChars = (deviceToken as NSData).bytes.bindMemory(to: CChar.self, capacity: deviceToken.count)
var tokenString = ""
for i in 0..<deviceToken.count {
tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
}
print("tokenString: \(tokenString)")
}
Upvotes: 1