Saya menerapkan pemberitahuan push. Saya ingin menyimpan Token APNS saya sebagai sebuah String.
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken
{
NSString *tokenString = [NSString stringWithUTF8String:[newDeviceToken bytes]]; //[[NSString alloc]initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
NSLog(@"%@", tokenString);
NSLog(@"%@", newDeviceToken);
}
Baris pertama kode mencetak nol. yang kedua mencetak token. Bagaimana saya bisa mendapatkan perangkat baru saya sebagai NSString?
ios
objective-c
apple-push-notifications
nsstring
nsdata
Sheehan Alam
sumber
sumber
NSLog
, yang dicetaknewDeviceToken
?Jawaban:
Gunakan ini :
sumber
Jika ada yang mencari cara untuk melakukan ini di Swift:
Sunting: Untuk Swift 3
Swift 3 memperkenalkan
Data
tipe, dengan semantik nilai. Untuk mengonversideviceToken
ke String, Anda dapat melakukan hal berikut:sumber
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
qiita.com/mono0926/items/3cf0dca3029f32f54a09"%02.2hhx
?Seseorang membantu saya dengan ini. Saya hanya meneruskan
sumber
const unsigned *tokenBytes = [deviceToken bytes]; NSMutableString *hexToken = [NSMutableString string]; for (NSUInteger byteCount = 0; byteCount * 4 < [deviceToken length]; byteCount++) { [hexToken appendFormat:@"%08x", ntohl(tokenBytes[byteCount])]; }
Important: APNs device tokens are of variable length. Do not hard-code their size.
Kata Apple.Anda bisa menggunakan ini
sumber
description
.[token appendFormat:@"%02.2hhx", data[i]];
Amazon SNS karena membutuhkan huruf kecil.Bagi yang mau di Swift 3 dan metode yang paling mudah
sumber
deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
Penjelasan
%02.2hhx
dalam jawaban suara tinggi :%
: Memperkenalkanx
specifier konversi.02
: Lebar minimum dari nilai yang dikonversi adalah 2. Jika nilai yang dikonversi memiliki byte lebih sedikit dari lebar bidang, itu harus diisi dengan0
di sebelah kiri..2
: Memberikan jumlah digit minimum yang muncul untukx
specifier konversi.hh
: Menentukan bahwax
specifier konversi berlaku untuk char yang ditandatangani atau argumen char yang tidak ditandatangani (argumen akan dipromosikan sesuai dengan promosi integer, tetapi nilainya akan dikonversi menjadi char yang ditandatangani atau char yang tidak ditandatangani sebelum dicetak).x
: Argumen unsigned akan dikonversi ke format heksadesimal unsigned dalam gaya "dddd"; huruf "abcdef" digunakan. Presisi menentukan jumlah minimum digit yang akan ditampilkan; jika nilai yang dikonversi dapat direpresentasikan dalam digit yang lebih sedikit, itu harus diperluas dengan nol di depan. Ketepatan standar adalah 1. Hasil konversi nol dengan ketepatan eksplisit nol tidak boleh berupa karakter.Untuk lebih jelasnya, lihat spesifikasi IEEE printf .
Berdasarkan penjelasan di atas, saya pikir lebih baik untuk perubahan
%02.2hhx
ke%02x
atau%.2x
.Untuk Swift 5, metode berikut ini semuanya layak:
Tesnya adalah sebagai berikut:
sumber
Ini solusi saya dan bekerja dengan baik di aplikasi saya:
NSData
keNSString
denganstringWithFormat
sumber
-description
, jadi tidak ada yang lebih aman daripada jawaban yang diterima.description
deviceToken seperti yang dikatakan jszumski.description
apakah Anda memanggilnya secara langsung, atau menggunakannya melalui metode lain, karena format string yang dikembalikan dapat diubah setiap saat. Solusi yang tepat ada di sini: stackoverflow.com/a/16411517/108105Saya pikir mengubah deviceToken ke hex byte string tidak masuk akal. Mengapa? Anda akan mengirimnya ke backend Anda, di mana ia akan diubah kembali menjadi byte untuk didorong ke APNS. Jadi, gunakan metode NSData
base64EncodedStringWithOptions
, dorong ke server, lalu gunakan reverse base64decoded data :) Itu jauh lebih mudah :)sumber
Di iOS 13
description
akan rusak jadi gunakan iniUntuk kejelasan, mari kita uraikan ini dan jelaskan setiap bagian:
Metode peta beroperasi pada setiap elemen berurutan. Karena Data adalah urutan byte di Swift, penutupan yang berlalu dievaluasi untuk setiap byte di deviceToken. The initializer String (format :) mengevaluasi setiap byte dalam data (diwakili oleh parameter anonim $ 0) menggunakan penentu format% 02x, untuk menghasilkan representasi hexadecimal nol-empuk, 2 digit dari integer byte / 8-bit. Setelah mengumpulkan setiap representasi byte yang dibuat oleh metode peta, bergabung () menggabungkan setiap elemen menjadi string tunggal.
PS tidak menggunakan deskripsi memberikan string yang berbeda di iOS 12 dan iOS 13 dan tidak aman sesuai ruang lingkup di masa depan. Pengembang seharusnya tidak mengandalkan format spesifik untuk deskripsi objek.
Untuk informasi lebih lanjut baca Ini .
sumber
Di iOS 13 deskripsi akan berada dalam format yang berbeda. Silakan gunakan kode di bawah ini untuk mengambil token perangkat.
sumber
length
dalam for loop harus diubah menjadilen
. Rupanya perubahan terlalu kecil bagi saya untuk melakukan edit .. Tapi yang lain berfungsi dengan baik!Ini adalah solusi yang sedikit lebih pendek:
sumber
Versi Swift Fungsional
Satu liner:
Berikut ini dalam bentuk ekstensi yang dapat digunakan kembali dan mendokumentasikan diri:
Atau, gunakan
reduce("", combine: +)
bukannyajoinWithSeparator("")
dilihat sebagai master fungsional oleh rekan-rekan Anda.Sunting: Saya mengubah String ($ 0, radix: 16) menjadi String (format: "% 02x", $ 0), karena satu digit angka diperlukan untuk memiliki padding nol
(Saya belum tahu bagaimana menandai pertanyaan sebagai duplikat dari pertanyaan lain ini , jadi saya hanya memposting jawaban saya lagi)
sumber
2020
token sebagai teks ...
atau jika Anda suka
(hasilnya sama)
sumber
Melemparkan jawaban saya di tumpukan. Hindari menggunakan penguraian string; Itu tidak dijamin oleh dokumen bahwa NSData.description akan selalu bekerja seperti itu.
Implementasi Swift 3:
sumber
Saya sudah mencoba menguji dua metode berbeda dengan format
"%02.2hhx"
dan"%02x"
dan hasilnya adalah yang tercepat
"%02x"
rata-rata 2.0 vs 2.6 untuk versi yang dikurangi:sumber
Menggunakan updateAccumulatingResult lebih efisien daripada berbagai pendekatan lain yang ditemukan di sini, jadi inilah cara tercepat untuk mengencangkan
Data
byte Anda :sumber
Untuk Swift:
sumber
Bagaimana dengan solusi satu jalur?
Tujuan C
Cepat
sumber
Inilah cara Anda melakukannya di Xamarin.iOS
sumber
sumber
Cepat:
sumber
sumber
Cepat
sumber
Gunakan kategori luar biasa!
// file .h
// file .m
@akhir
// AppDelegate.m
Bekerja dengan baik!
sumber
Swift 3:
Jika ada yang mencari cara untuk mendapatkan token perangkat di Swift 3. Gunakan cuplikan yang dimodifikasi di bawah ini.
sumber
sumber
Solusi @kulss diposting di sini, meskipun kurang elegan tetapi memiliki kesederhanaan tidak lagi berfungsi di iOS 13, karena
description
akan bekerja secara berbeda untuk NSData. Anda masih bisa menggunakannyadebugDescription
.sumber
Cobalah yang ini kecuali jika data diakhiri null.
NSString* newStr = [[NSString alloc] initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
sumber
sumber