Saya baru saja memperbarui dari Xcode 7 ke 8 GM dan di tengah masalah kompatibilitas Swift 3, saya perhatikan bahwa token perangkat saya telah berhenti berfungsi. Mereka sekarang hanya membaca '32BYTES'.
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
print(deviceToken) // Prints '32BYTES'
print(String(data: deviceToken , encoding: .utf8)) // Prints nil
}
Sebelum pembaruan saya dapat dengan mudah mengirim NSData ke server saya, tetapi sekarang saya mengalami kesulitan untuk benar-benar mem-parse token.
Apa yang kulewatkan di sini?
Sunting: Saya baru saja menguji konversi kembali ke NSData dan saya melihat hasil yang diharapkan. Jadi sekarang saya hanya bingung tentang tipe Data baru.
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
print(deviceToken) // Prints '32BYTES'
print(String(data: deviceToken , encoding: .utf8)) // Prints nil
let d = NSData(data: deviceToken)
print(d) // Prints my device token
}
NSData
hanya mencetakdescription
dariNSData
. Anda masih belum mendapatkan string dari itu.Jawaban:
sumber
%02x
tidak apa-apa juga.%02.2hhx
dan%02x
nshipster.com/apns-device-tokens/#overturned-in-ios-13Saya memiliki masalah yang sama. Ini solusi saya:
sumber
NSData
menjadi string. Saya menyarankan menggunakan pengkodean base64 dalam jawaban saya. Ini menggunakan pengkodean base16.Ini ekstensi Swift 3 saya untuk mendapatkan string hex yang dikodekan base-16:
sumber
Token perangkat tidak pernah berupa string dan tentu saja bukan string berenkode UTF-8. Itu data. Ini 32 byte data buram.
Satu-satunya cara yang valid untuk mengubah data buram menjadi string adalah dengan menyandikannya - biasanya melalui pengkodean base64.
Di Swift 3 / iOS 10, cukup gunakan
Data base64EncodedString(options:)
metode ini.sumber
NSData
atauData
, tidak masalah. Byte dari data bukan dan tidak pernah menjadi string. Dokumentasi dengan jelas menyatakan bahwa ini adalah kumpulan data yang tidak jelas. Fakta bahwa kode Anda dulu berfungsi adalah keberuntungan. Itu selalu cara yang salah untuk menanganinya. Cukup ubah data menjadi string dengan base64 menyandikan data. Itulah solusi yang tepat sekarang dan sebelumnya.Coba ini:
sumber
coba ini
sumber
Cara terbaik dan termudah.
sumber
Yang ini tidak dinyatakan sebagai jawaban resmi (lihat di komentar), tetapi itulah yang akhirnya saya lakukan untuk mendapatkan token saya kembali.
sumber
as NSData
disana. ketika Anda meletakkan sebagai NSData tidak Data akan mengembalikan nilai yang benar bahkan di iOS 10sumber
Saya baru saja melakukan ini,
itu memberikan hasil yang sama seperti,
sumber
Dapatkan token perangkat dengan format yang tepat.
sumber