Bagaimana saya bisa mengubah token perangkat saya (NSData) menjadi NSString?

157

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?

Sheehan Alam
sumber
Apa output dari yang kedua NSLog, yang dicetak newDeviceToken?
rob mayoff
JANGAN gunakan deskripsi
Fattie

Jawaban:

39

Gunakan ini :

NSString * deviceTokenString = [[[[deviceToken description]
                         stringByReplacingOccurrencesOfString: @"<" withString: @""] 
                        stringByReplacingOccurrencesOfString: @">" withString: @""] 
                       stringByReplacingOccurrencesOfString: @" " withString: @""];

NSLog(@"The generated device token string is : %@",deviceTokenString);
kulss
sumber
134
Tampaknya ide yang buruk untuk menggunakan deskripsi: tidak ada yang memastikan bahwa versi iOS nantinya tidak akan mengubah implementasi dan hasil dari panggilan ini.
madewulf
16
Memang, ini ide yang sangat buruk.
David Snabel-Caunt
21
@madewulf sangat baik kepada Anda untuk menunjukkan bagaimana itu ide yang mengerikan untuk menggunakan deskripsi .. itu akan lebih baik jika Anda telah menyarankan alternatif
abbood
6
Solusi di sini dengan [deviceToken bytes] sesuai dengan tagihan.
madewulf
37
Ternyata pada Swift 3 / iOS 10, .deskripsi pada token perangkat mengembalikan "32 byte". Jadi ya, jangan gunakan ini.
Victor Luft
231

Jika ada yang mencari cara untuk melakukan ini di Swift:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
    var tokenString = ""

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

    print("tokenString: \(tokenString)")
}

Sunting: Untuk Swift 3

Swift 3 memperkenalkan Datatipe, dengan semantik nilai. Untuk mengonversi deviceTokenke String, Anda dapat melakukan hal berikut:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print(token)
}
Sascha
sumber
118
Mengapa ini harus sangat rumit, apa yang salah dengan OS memberi kami sebuah string karena itulah yang dibutuhkan semua orang? Terima kasih atas solusi ini.
Piwaf
3
@ Sascha Saya harap Anda menyetujui hasil edit saya untuk jawaban Anda yang sangat berguna :)
jrturton
16
Saya refactored: let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() qiita.com/mono0926/items/3cf0dca3029f32f54a09
mono
2
Saya tidak menyarankan menggunakan .description karena itu tidak dijamin stabil. Lihat jawaban saya di sini: stackoverflow.com/questions/9372815/…
swift taylor
7
Bisakah Anda jelaskan apa fungsinya "%02.2hhx?
Sayang
155

Seseorang membantu saya dengan ini. Saya hanya meneruskan

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {

    const unsigned *tokenBytes = [deviceToken bytes];
    NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                         ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                         ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                         ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];

    [[MyModel sharedModel] setApnsToken:hexToken];
}
Shubhank
sumber
5
Ini adalah solusi terbaik, karena encondig byte sebagai hex, menyiratkan bahwa Anda dapat menghitungnya;)
loretoparisi
4
Pada XCode 5 saya harus melemparkan deviceToken untuk membuatnya dikompilasi: const unsigned * tokenBytes = (const unsigned *) [deviceToken bytes];
Ponytech
3
Token akan menjadi lebih besar dari 32 byte segera jadi ini akan perlu menjadi loop lebih dari setiap byte, bukan delapan bilangan bulat hard-coded.
Tom Dalling
5
Apakah ini solusi yang lebih baik? const unsigned *tokenBytes = [deviceToken bytes]; NSMutableString *hexToken = [NSMutableString string]; for (NSUInteger byteCount = 0; byteCount * 4 < [deviceToken length]; byteCount++) { [hexToken appendFormat:@"%08x", ntohl(tokenBytes[byteCount])]; }
Harro
9
Important: APNs device tokens are of variable length. Do not hard-code their size.Kata Apple.
erkanyildiz
141

Anda bisa menggunakan ini

- (NSString *)stringWithDeviceToken:(NSData *)deviceToken {
    const char *data = [deviceToken bytes];
    NSMutableString *token = [NSMutableString string];

    for (NSUInteger i = 0; i < [deviceToken length]; i++) {
        [token appendFormat:@"%02.2hhX", data[i]];
    }

    return [token copy];
}
Vlad Polyanskiy
sumber
11
Ini harus menjadi jawaban yang diterima, karena jauh lebih aman daripada menggunakan description.
DrMickeyLauer
8
Ini adalah satu-satunya jawaban yang benar di Objective-C yang akan menangani peningkatan token yang akan datang.
Tom Dalling
Setuju bahwa ini mungkin cara teraman karena tidak menganggap ukuran / panjang token tertentu.
Ryan H.
Berfungsi di iOS 10.
Tjalsma
2
Saya telah menggunakan [token appendFormat:@"%02.2hhx", data[i]];Amazon SNS karena membutuhkan huruf kecil.
Manuel Schmitzberger
43

Bagi yang mau di Swift 3 dan metode yang paling mudah

func extractTokenFromData(deviceToken:Data) -> String {
    let token = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    return token.uppercased();
}
Anand
sumber
1
Saya menulis kode yang sama :) Ini adalah versi yang paling cepat, dan hanya ini yang berfungsi
Quver
1
@Anand dapatkah Anda jelaskan apa yang terjadi dalam kode inideviceToken.reduce("", {$0 + String(format: "%02X", $1)})
Ramakrishna
1
Ini menggunakan fungsi pengurangan swift yang membuat serialisasi data menjadi string heksadesimal dan kemudian ke String. Untuk memahami lebih lanjut tentang pengurangan fungsi, baca useyourloaf.com/blog/swift-guide-to-map-filter-reduce
Anand
15

Penjelasan %02.2hhxdalam jawaban suara tinggi :

  • %: Memperkenalkan xspecifier konversi.
  • 02: Lebar minimum dari nilai yang dikonversi adalah 2. Jika nilai yang dikonversi memiliki byte lebih sedikit dari lebar bidang, itu harus diisi dengan 0di sebelah kiri.
  • .2: Memberikan jumlah digit minimum yang muncul untuk xspecifier konversi.
  • hh: Menentukan bahwa xspecifier 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.2hhxke%02x atau %.2x.

Untuk Swift 5, metode berikut ini semuanya layak:

deviceToken.map({String(format: "%02x", $0)}).joined()
deviceToken.map({String(format: "%.2x", $0)}).joined()
deviceToken.reduce("", {$0 + String(format: "%02x", $1)})
deviceToken.reduce("", {$0 + String(format: "%.2x", $1)})

Tesnya adalah sebagai berikut:

let deviceToken = (0..<32).reduce(Data(), {$0 + [$1]})
print(deviceToken.reduce("", {$0 + String(format: "%.2x", $1)}))
// Print content:
// 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
jqgsninimo
sumber
Terima kasih atas jawaban ini. Apakah ini juga berfungsi dengan iOS 12? Atau apakah itu hanya bergantung pada versi Swift?
Markus
1
@ Markus Ini bekerja di iOS 12, hanya tergantung pada versi Swift.
jqgsninimo
14

Ini solusi saya dan bekerja dengan baik di aplikasi saya:

    NSString* newToken = [[[NSString stringWithFormat:@"%@",deviceToken] 
stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""];
  • konversi NSDatake NSStringdenganstringWithFormat
  • potong "<>"
  • hapus spasi
Zeb
sumber
10
Ini hanya panggilan implisit -description, jadi tidak ada yang lebih aman daripada jawaban yang diterima.
jszumski
Bisakah Anda menautkan sumber Anda? Saya tidak dapat menemukan informasi tentang itu di mana pun. Terima kasih.
Zeb
Menemukannya! Saya pikir itu sedikit berbeda. Menggunakan atribut deskripsi secara langsung tidak aman karena dapat berubah di versi mendatang, tetapi jika Anda menggunakannya MELALUI metode NSString, Anda tidak akan mengalami masalah.
Zeb
5
Tidak ada ini yang benar-benar memanggil descriptiondeviceToken seperti yang dikatakan jszumski.
Jonny
1
@Zeb Tidak aman untuk mengandalkan descriptionapakah 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/108105
Tom Dalling
10

Saya 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 NSDatabase64EncodedStringWithOptions , dorong ke server, lalu gunakan reverse base64decoded data :) Itu jauh lebih mudah :)

NSString *tokenString = [tokenData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
Oleg Shanyuk
sumber
@ jeet.chanchawat tolong jangan tambahkan kode ke jawaban pengguna lain. Kami tidak ingin memasukkan kata-kata ke mulut mereka, terutama ketika menambahkan Swift ke jawaban Objective-C. Sebaliknya, tambahkan jawaban Anda sendiri.
JAL
2
Aku hanya tidak ingin menjiplak jawaban @Oleg Shanyuk. Karena hanya terjemahan dalam bahasa lain yang dibangun atas jawabannya, maka ia layak mendapatkan suara di masa depan. Jika saya menambahkan jawaban lain itu akan memberi saya upvotes untuk jawaban yang merupakan penelitian orang lain. Semoga ini membenarkan EDIT.
jeet.chanchawat
10

Di iOS 13 descriptionakan rusak jadi gunakan ini

let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()

Untuk 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.

// iOS 12
(deviceToken as NSData).description // "<965b251c 6cb1926d e3cb366f dfb16ddd e6b9086a 8a3cac9e 5f857679 376eab7C>"

// iOS 13
(deviceToken as NSData).description // "{length = 32, bytes = 0x965b251c 6cb1926d e3cb366f dfb16ddd ... 5f857679 376eab7c }"

Untuk informasi lebih lanjut baca Ini .

SuryaKantSharma
sumber
10

Di iOS 13 deskripsi akan berada dalam format yang berbeda. Silakan gunakan kode di bawah ini untuk mengambil token perangkat.

- (NSString *)fetchDeviceToken:(NSData *)deviceToken {
    NSUInteger len = deviceToken.length;
    if (len == 0) {
        return nil;
    }
    const unsigned char *buffer = deviceToken.bytes;
    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(len * 2)];
    for (int i = 0; i < len; ++i) {
        [hexString appendFormat:@"%02x", buffer[i]];
    }
    return [hexString copy];
}
Wisnu Prakash
sumber
Solusi sempurna untuk ios 13. Terima kasih Wisnu
Manish
1
Itu tidak mengkompilasi saat ini - lengthdalam for loop harus diubah menjadi len. Rupanya perubahan terlalu kecil bagi saya untuk melakukan edit .. Tapi yang lain berfungsi dengan baik!
Anders Friis
Anda adalah penyelamat hidup
Moeez Akram
3

Ini adalah solusi yang sedikit lebih pendek:

NSData *token = // ...
const uint64_t *tokenBytes = token.bytes;
NSString *hex = [NSString stringWithFormat:@"%016llx%016llx%016llx%016llx",
                 ntohll(tokenBytes[0]), ntohll(tokenBytes[1]),
                 ntohll(tokenBytes[2]), ntohll(tokenBytes[3])];
k06a
sumber
3

Versi Swift Fungsional

Satu liner:

let hexString = UnsafeBufferPointer<UInt8>(start: UnsafePointer(data.bytes),
count: data.length).map { String(format: "%02x", $0) }.joinWithSeparator("")

Berikut ini dalam bentuk ekstensi yang dapat digunakan kembali dan mendokumentasikan diri:

extension NSData {
    func base16EncodedString(uppercase uppercase: Bool = false) -> String {
        let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes),
                                                count: self.length)
        let hexFormat = uppercase ? "X" : "x"
        let formatString = "%02\(hexFormat)"
        let bytesAsHexStrings = buffer.map {
            String(format: formatString, $0)
        }
        return bytesAsHexStrings.joinWithSeparator("")
    }
}

Atau, gunakan reduce("", combine: +)bukannya joinWithSeparator("")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)

NiñoScript
sumber
Bekerja untuk saya, terima kasih.
Hasya
3

2020

token sebagai teks ...

let tat = deviceToken.map{ data in String(format: "%02.2hhx", data) }.joined()

atau jika Anda suka

let tat2 = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()

(hasilnya sama)

Fattie
sumber
2

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:

extension Data {
    func hexString() -> String {
        var bytesPointer: UnsafeBufferPointer<UInt8> = UnsafeBufferPointer(start: nil, count: 0)
        self.withUnsafeBytes { (bytes) in
            bytesPointer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(bytes), count:self.count)
        }
        let hexBytes = bytesPointer.map { return String(format: "%02hhx", $0) }
        return hexBytes.joined()
    }
}
taylor cepat
sumber
1

Saya sudah mencoba menguji dua metode berbeda dengan format "%02.2hhx"dan"%02x"

    var i :Int = 0
    var j: Int = 0
    let e: Int = Int(1e4)
    let time = NSDate.timeIntervalSinceReferenceDate
    while i < e {
        _ =  deviceToken.map { String(format: "%02x", $0) }.joined()
        i += 1
    }
    let time2 = NSDate.timeIntervalSinceReferenceDate
    let delta = time2-time
    print(delta)

    let time3 = NSDate.timeIntervalSinceReferenceDate
    while j < e {
        _ =  deviceToken.reduce("", {$0 + String(format: "%02x", $1)})
        j += 1
    }
    let time4 = NSDate.timeIntervalSinceReferenceDate
    let delta2 = time4-time3
    print(delta2)

dan hasilnya adalah yang tercepat "%02x"rata-rata 2.0 vs 2.6 untuk versi yang dikurangi:

deviceToken.reduce("", {$0 + String(format: "%02x", $1)})
Nicolas Manzini
sumber
1

Menggunakan updateAccumulatingResult lebih efisien daripada berbagai pendekatan lain yang ditemukan di sini, jadi inilah cara tercepat untuk mengencangkanData byte Anda :

func application(_ application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.reduce(into: "") { $0 += String(format: "%.2x", $1) }
    print(token)
}
Alex Curylo
sumber
Alex, bukankah itu% 02.2hhx
Fattie
0

Untuk Swift:

var characterSet: NSCharacterSet = NSCharacterSet( charactersInString: "<>" )
    var deviceTokenString: String = ( deviceToken.description as NSString )
    .stringByTrimmingCharactersInSet( characterSet )
    .stringByReplacingOccurrencesOfString( " ", withString: "" ) as String

println( deviceTokenString )
Adarsh ​​GJ
sumber
0

Bagaimana dengan solusi satu jalur?

Tujuan C

NSString *token = [[data.description componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet]invertedSet]]componentsJoinedByString:@""];

Cepat

let token = data.description.componentsSeparatedByCharactersInSet(NSCharacterSet.alphanumericCharacterSet().invertedSet).joinWithSeparator("")
Nikolay Shubenkov
sumber
2
Ini adalah solusi sederhana dan terbaik. Terima kasih
Emmy
0

Inilah cara Anda melakukannya di Xamarin.iOS

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
{
    var tokenStringBase64 = deviceToken.GetBase64EncodedString(NSDataBase64EncodingOptions.None);
    //now you can store it for later use in local storage
}
Drunken Daddy
sumber
-1
NSString *tokenString = [[newDeviceToken description] stringByReplacingOccurrencesOfString:@"[<> ]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [[newDeviceToken description] length])];
Genja Grishin
sumber
solusi hebat Mulai hari ini, dapat diimplikasikan ke kredensial.token.description.replacingOccurrences (dari: "[<>]", dengan: "", opsi:. RegularExpression, rentang: nil)
Frank
-1

Cepat:

let tokenString = deviceToken.description.stringByReplacingOccurrencesOfString("[ <>]", withString: "", options: .RegularExpressionSearch, range: nil)
Tony
sumber
-2
-(NSString *)deviceTokenWithData:(NSData *)data
{
    NSString *deviceToken = [[data description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];
    return deviceToken;
}
Mallikarjuna SB
sumber
-2

Cepat

    // make sure that we have token for the devie on the App
    func application(application: UIApplication
        , didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {

            var tokenStr = deviceToken.description
            tokenStr = tokenStr.stringByReplacingOccurrencesOfString("<", withString: "", options: [], range: nil)
            tokenStr = tokenStr.stringByReplacingOccurrencesOfString(">", withString: "", options: [], range: nil)
            tokenStr = tokenStr.stringByReplacingOccurrencesOfString(" ", withString: "", options: [], range: nil)



            print("my token is: \(tokenStr)")

    }
Vinod Joshi
sumber
-2

Gunakan kategori luar biasa!

// file .h

@interface NSData (DeviceToken)

- (NSString *)stringDeviceToken;

@end    

// file .m

#import "NSData+DeviceToken.h"

@implementation NSData (DeviceToken)

- (NSString *)stringDeviceToken {
    const unsigned *deviceTokenBytes = [deviceToken bytes];
    NSString *deviceToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                     ntohl(deviceTokenBytes[0]), ntohl(deviceTokenBytes[1]), ntohl(deviceTokenBytes[2]),
                     ntohl(deviceTokenBytes[3]), ntohl(deviceTokenBytes[4]), ntohl(deviceTokenBytes[5]),
                     ntohl(deviceTokenBytes[6]), ntohl(deviceTokenBytes[7])];
    return deviceToken;
}

@akhir

// AppDelegate.m

#import "NSData+DeviceToken.h"

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSString *token = deviceToken.stringDeviceToken;
}

Bekerja dengan baik!

LLIAJLbHOu
sumber
Jangan mengandalkan "deskripsi", formatnya bisa berubah di masa mendatang. Ini hanya untuk tujuan tampilan.
Michael Peterson
-3

Swift 3:

Jika ada yang mencari cara untuk mendapatkan token perangkat di Swift 3. Gunakan cuplikan yang dimodifikasi di bawah ini.

    let characterSet: CharacterSet = CharacterSet( charactersIn: "<>" )

    let deviceTokenString: String = (deviceToken.description as NSString)
        .trimmingCharacters(in: characterSet as CharacterSet)
        .replacingOccurrences(of: " ", with: "")
        .uppercased()

    print(deviceTokenString)
Laksh Gandikota
sumber
2
Saya tidak menyarankan menggunakan .description karena itu tidak dijamin tetap sama. Lihat jawaban saya di sini: stackoverflow.com/questions/9372815/…
swift taylor
-4
var token: String = ""
for i in 0..<deviceToken.count {
    token += String(format: "%02.2hhx", deviceToken[i] as CVarArg)
}

print(token)
Abdul Yasin
sumber
1
Menggunakan deskripsi tidak aman karena tidak dijamin memberikan hasil yang sama di masa mendatang.
Sahil Kapoor
-4

Solusi @kulss diposting di sini, meskipun kurang elegan tetapi memiliki kesederhanaan tidak lagi berfungsi di iOS 13, karena descriptionakan bekerja secara berbeda untuk NSData. Anda masih bisa menggunakannya debugDescription.

NSString * deviceTokenString = [[[[deviceToken debugDescription]
                     stringByReplacingOccurrencesOfString: @"<" withString: @""] 
                    stringByReplacingOccurrencesOfString: @">" withString: @""] 
                   stringByReplacingOccurrencesOfString: @" " withString: @""];
johnyu
sumber
-7

Cobalah yang ini kecuali jika data diakhiri null.

NSString* newStr = [[NSString alloc] initWithData:newDeviceToken encoding:NSUTF8StringEncoding];

Naveed Ahmad
sumber
Saya mencoba yang itu, tidak berhasil. Saya sudah berkomentar di cuplikan kode saya.
Sheehan Alam
@ SheehanAlam Orang ini berhasil melewati. Lihatlah bagaimana itu berubah menjadi string. stackoverflow.com/questions/4994302/…
Naveed Ahmad
-9
NSString *tokenstring = [[NSString alloc] initWithData:token encoding:NSUTF8StringEncoding];
Ravikant
sumber
Ini berfungsi saat data berupa string, namun deviceToken bukan string.
Simon Epskamp