Làm cách nào tôi có thể chuyển đổi mã thông báo thiết bị của mình (NSData) thành NSString?


157

Tôi đang thực hiện thông báo đẩy. Tôi muốn lưu mã thông báo APNS của tôi dưới dạng Chuỗi.

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken
{
    NSString *tokenString = [NSString stringWithUTF8String:[newDeviceToken bytes]]; //[[NSString alloc]initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
    NSLog(@"%@", tokenString);
    NSLog(@"%@", newDeviceToken);
}

Dòng đầu tiên của mã in null. cái thứ hai in mã thông báo. Làm cách nào tôi có thể nhận newDeviceToken của mình dưới dạng NSString?


Đầu ra của cái thứ hai NSLog, cái nào in ra newDeviceToken?
cướp mayoff


KHÔNG sử dụng mô tả
Fattie

Câu trả lời:


40

dùng cái này :

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

NSLog(@"The generated device token string is : %@",deviceTokenString);

134
Có vẻ là một ý tưởng tồi để sử dụng mô tả: không có gì đảm bảo rằng phiên bản iOS sau này sẽ không thay đổi việc thực hiện và kết quả của cuộc gọi này.
madewulf

16
Thật vậy, đây là một ý tưởng thực sự xấu.
David Snabel-Caunt

20
@madewulf rất vui khi bạn chỉ ra cách sử dụng mô tả đó là một ý tưởng khủng khiếp như thế nào .. nó thậm chí còn đẹp hơn nếu bạn đề xuất một giải pháp thay thế
abbood

6
Giải pháp ở đây với [byte deviceToken] phù hợp với hóa đơn.
madewulf

37
Hóa ra là từ Swift 3 / iOS 10, .descrip trên mã thông báo thiết bị trả về "32 byte". Vì vậy, yeah, không sử dụng này.
Victor Luft

231

Nếu bất cứ ai đang tìm kiếm một cách để làm điều này trong 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)")
}

Chỉnh sửa: Dành cho Swift 3

Swift 3 giới thiệu Dataloại, với ngữ nghĩa giá trị. Để chuyển đổi thành deviceTokenChuỗi, bạn có thể làm như sau:

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

118
Tại sao điều này phải quá phức tạp, điều gì sai với HĐH cho chúng ta một chuỗi vì đó là điều mọi người cần? Cảm ơn bạn cho giải pháp này.
Piwaf

3
@Sascha Tôi hy vọng bạn chấp nhận chỉnh sửa của tôi cho câu trả lời rất hữu ích của bạn :)
jrturton

16
Tôi đã tái cấu trúc: let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() qiita.com/mono0926/items/3cf0dca3029f32f54a09
mono

2
Tôi không khuyên bạn nên sử dụng .descrip vì điều đó không được đảm bảo là ổn định. Kiểm tra câu trả lời của tôi ở đây: stackoverflow.com/questions/9372815/ từ
swift taylor

7
Bạn có thể giải thích những gì "%02.2hhxlàm?
Mật ong

155

Ai đó đã giúp tôi với điều này. Tôi chỉ đi ngang qua

- (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];
}

5
Đây là giải pháp tốt nhất, vì các byte encondig là hex, ngụ ý rằng bạn có thể đếm nó;)
loretoparisi

4
Trên XCode 5, tôi đã phải sử dụng deviceToken để biên dịch nó: const unsign * tokenBytes = (const unsign *) [deviceToken byte];
PonyTech

3
Các mã thông báo sẽ sớm lớn hơn 32 byte vì vậy đây sẽ cần phải là một vòng lặp trên mỗi byte, thay vì tám số nguyên được mã hóa cứng.
Tom Dalling

5
Đây sẽ là một giải pháp tốt hơn? 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.Apple nói.
erkanyildiz

141

Bạn có thể sử dụng cái này

- (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];
}

11
Đây phải là câu trả lời được chấp nhận, vì nó an toàn hơn nhiều so với sử dụng description.
DrMickeyLauer

8
Đây là câu trả lời đúng duy nhất trong Objective-C sẽ xử lý sự gia tăng sắp tới của kích thước mã thông báo.
Tom Dalling

Đồng ý rằng đây có lẽ là cách an toàn nhất vì nó không giả định bất kỳ kích thước / chiều dài mã thông báo cụ thể nào.
Ryan H.

Hoạt động trong iOS 10.
Tjalsma

2
Tôi đã sử dụng [token appendFormat:@"%02.2hhx", data[i]];như Amazon SNS yêu cầu chữ thường.
Manuel Schmitzberger

43

Dành cho những ai muốn dùng Swift 3 và phương pháp dễ dàng nhất

func extractTokenFromData(deviceToken:Data) -> String {
    let token = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    return token.uppercased();
}

1
Tôi đã viết cùng một mã :) Đây là phiên bản dễ hiểu nhất và chỉ có điều này hoạt động
Quver

1
@Anand bạn có thể vui lòng giải thích những gì đang xảy ra trong mã nàydeviceToken.reduce("", {$0 + String(format: "%02X", $1)})
Ramakrishna

1
Nó sử dụng chức năng rút gọn của swift nối tiếp Dữ liệu thành chuỗi thập lục phân và sau đó thành Chuỗi. Để hiểu thêm về chức năng giảm, hãy đọc useyourloaf.com/blog/swift-guide-to-map-filter-reduce
Anand

15

Giải thích về câu trả lời%02.2hhx bỏ phiếu cao :

  • %: Giới thiệu công xcụ xác định chuyển đổi.
  • 02: Chiều rộng tối thiểu của giá trị được chuyển đổi là 2. Nếu giá trị được chuyển đổi có ít byte hơn chiều rộng trường, nó sẽ được đệm 0bên trái.
  • .2: Cung cấp số chữ số tối thiểu xuất hiện cho x xác định chuyển đổi.
  • hh: Chỉ định rằng x xác định chuyển đổi áp dụng cho đối số char đã ký hoặc char không dấu (đối số sẽ được quảng cáo theo các quảng cáo số nguyên, nhưng giá trị của nó sẽ được chuyển đổi thành char đã ký hoặc char không dấu trước khi in).
  • x: Đối số không dấu sẽ được chuyển đổi sang định dạng thập lục phân không dấu trong kiểu "dddd"; các chữ cái "abcdef" được sử dụng. Độ chính xác chỉ định số chữ số tối thiểu xuất hiện; nếu giá trị được chuyển đổi có thể được biểu thị bằng ít chữ số hơn, nó sẽ được mở rộng với các số 0 đứng đầu. Độ chính xác mặc định là 1. Kết quả của chuyển đổi 0 với độ chính xác rõ ràng bằng 0 sẽ không có ký tự.

Để biết thêm chi tiết, xem thông số kỹ thuật của printf .


Dựa trên lời giải thích trên, tôi nghĩ tốt hơn là thay đổi %02.2hhxthành %02xhoặc %.2x.

Đối với Swift 5, các phương pháp sau đây đều khả thi:

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

Bài kiểm tra như sau:

let deviceToken = (0..<32).reduce(Data(), {$0 + [$1]})
print(deviceToken.reduce("", {$0 + String(format: "%.2x", $1)}))
// Print content:
// 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f

Cảm ơn bạn cho câu trả lời này. Điều này cũng hoạt động với iOS 12? Hay nó chỉ phụ thuộc vào phiên bản Swift?
Markus

1
@Markus Điều này hoạt động trong iOS 12, chỉ phụ thuộc vào phiên bản Swift.
jqgsninimo

14

Đó là giải pháp của tôi và Nó hoạt động tốt trong ứng dụng của tôi:

    NSString* newToken = [[[NSString stringWithFormat:@"%@",deviceToken] 
stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""];
  • chuyển đổi NSDatasang NSStringvớistringWithFormat
  • cắt "<>"
  • loại bỏ khoảng trắng

10
Đây chỉ là những cuộc gọi ngầm -description, vì vậy nó không an toàn hơn câu trả lời được chấp nhận.
jszumski

Bạn có thể vui lòng liên kết nguồn của bạn? Tôi không thể tìm thấy thông tin về nó ở bất cứ đâu. Cám ơn.
Zeb

Tìm thấy rồi! Tôi nghĩ rằng nó là một chút khác nhau. Sử dụng thuộc tính mô tả trực tiếp không an toàn vì nó có thể thay đổi trong các phiên bản trong tương lai, nhưng nếu bạn sử dụng nó QUA một phương pháp NSString, bạn sẽ khó gặp vấn đề.
Zeb

5
Không có điều này thực sự gọi descriptiontrên deviceToken như jszumski nói.
Jonny

1
@Zeb Không an toàn khi dựa vào descriptionviệc bạn gọi trực tiếp hay sử dụng nó thông qua phương thức khác, vì định dạng của chuỗi trả về có thể bị thay đổi bất cứ lúc nào. Giải pháp chính xác là đây: stackoverflow.com/a/16411517/108105
Tom Dalling

10

Tôi nghĩ việc chuyển đổi deviceToken thành chuỗi byte hex không có ý nghĩa gì. Tại sao? Bạn sẽ gửi nó đến phần phụ trợ của mình, nơi nó sẽ được chuyển đổi thành byte để được đẩy sang APNS. Vì vậy, hãy sử dụng phương pháp của NSDatabase64EncodedStringWithOptions , đẩy nó lên máy chủ và sau đó sử dụng dữ liệu mã hóa cơ sở ngược64 :) Điều đó dễ dàng hơn nhiều :)

NSString *tokenString = [tokenData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

@ jeet.chanchawat xin vui lòng không thêm mã vào câu trả lời của người dùng khác. Chúng tôi không muốn đặt từ ngữ vào miệng họ, đặc biệt là khi thêm Swift vào câu trả lời Objective-C. Thay vào đó, hãy thêm câu trả lời của riêng bạn.
JAL

2
Tôi chỉ không muốn ăn cắp câu trả lời của @Oleg Shanyuk. Vì nó chỉ là bản dịch trong một ngôn ngữ khác được xây dựng dựa trên câu trả lời của anh ấy, vì vậy anh ấy xứng đáng được bình chọn trong tương lai. Nếu tôi thêm một câu trả lời khác, nó sẽ cho tôi những câu trả lời cho câu trả lời là nghiên cứu của người khác. Hy vọng điều này biện minh cho EDIT.
jeet.chanchaw

10

Trong iOS 13 descriptionsẽ bị hỏng nên hãy sử dụng cái này

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

Để rõ ràng, hãy phá vỡ điều này và giải thích từng phần:

Phương pháp bản đồ hoạt động trên từng phần tử của một chuỗi. Vì Dữ liệu là một chuỗi các byte trong Swift, nên việc đóng thông qua được ước tính cho từng byte trong deviceToken. Trình khởi tạo Chuỗi (định dạng :) đánh giá từng byte trong dữ liệu (được biểu thị bằng tham số ẩn danh $ 0) bằng cách sử dụng công cụ xác định định dạng% 02x, để tạo ra một đại diện thập lục phân 2 chữ số đệm của số nguyên byte / 8 bit. Sau khi thu thập từng biểu diễn byte được tạo bởi phương thức ánh xạ, nối () nối từng phần tử thành một chuỗi.

PS không sử dụng mô tả cung cấp các chuỗi khác nhau trong iOS 12 và iOS 13 và không an toàn theo phạm vi trong tương lai. Các nhà phát triển không nên dựa vào một định dạng cụ thể cho mô tả của một đối tượng.

// 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 }"

Để biết thêm thông tin đọc này .


10

Trong iOS 13, mô tả sẽ ở định dạng khác nhau. Vui lòng sử dụng mã dưới đây để lấy mã thông báo thiết bị.

- (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];
}

Giải pháp hoàn hảo cho ios 13. Cảm ơn Vishnu
Manish

1
Hiện tại nó không biên dịch - lengthtrong vòng lặp for nên được đổi thành len. Rõ ràng là một thay đổi quá nhỏ đối với tôi để thực hiện chỉnh sửa .. Nhưng những thứ khác hoạt động hoàn hảo!
Anders Friis

bạn là một người bảo vệ cuộc sống
Moeez Akram

3

Đây là một giải pháp ngắn hơn một chút:

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])];

3

Phiên bản chức năng Swift

Lót:

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

Đây là một hình thức mở rộng có thể tái sử dụng và tự viết tài liệu:

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

Ngoài ra, sử dụng reduce("", combine: +)thay vì joinWithSeparator("")được xem như một bậc thầy chức năng bởi các đồng nghiệp của bạn.


Chỉnh sửa: Tôi đã thay đổi Chuỗi ($ 0, cơ số: 16) thành Chuỗi (định dạng: "% 02x", $ 0), vì một số chữ số cần có để có số đệm

(Tôi chưa biết cách đánh dấu một câu hỏi là một bản sao của câu hỏi khác , vì vậy tôi chỉ đăng lại câu trả lời của mình)


Làm việc cho tôi, Cảm ơn.
Hasya

3

2020

mã thông báo dưới dạng văn bản ...

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

hoặc nếu bạn thích

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

(kết quả là như nhau)


2

Ném câu trả lời của tôi vào đống. Tránh sử dụng phân tích chuỗi; Nó không được đảm bảo bởi các tài liệu rằng NSData.des mô tả sẽ luôn hoạt động theo cách đó.

Thực hiện 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()
    }
}

1

Tôi đã thử kiểm tra hai phương pháp khác nhau với định dạng "%02.2hhx""%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)

và kết quả là nhanh nhất là "%02x"trung bình 2.0 so với 2.6 cho phiên bản rút gọn:

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

1

Sử dụng updateAccumulatingResult là hiệu quả hơn các phương pháp khác nhau được tìm thấy ở đây, vì vậy đây là Swiftiest cách để stringify bạn Databyte:

func application(_ application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.reduce(into: "") { $0 += String(format: "%.2x", $1) }
    print(token)
}

Alex, sẽ không phải là% 02.2hhx
Fattie

0

Dành cho Swift:

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

println( deviceTokenString )

0

Điều gì về một giải pháp dòng?

Mục tiêu C

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

Nhanh

let token = data.description.componentsSeparatedByCharactersInSet(NSCharacterSet.alphanumericCharacterSet().invertedSet).joinWithSeparator("")

2
Đây là giải pháp đơn giản và tốt nhất. Cảm ơn
Emmy

0

Đây là cách bạn làm điều đó trong 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
}

-1
NSString *tokenString = [[newDeviceToken description] stringByReplacingOccurrencesOfString:@"[<> ]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [[newDeviceToken description] length])];

giải pháp tuyệt vời Tính đến hôm nay, nó có thể được implified để credentials.token.description.replacingOccurrences (của: "[<>]", với: "", lựa chọn: .regularExpression, khoảng: nil)
Frank

-1

Nhanh:

let tokenString = deviceToken.description.stringByReplacingOccurrencesOfString("[ <>]", withString: "", options: .RegularExpressionSearch, range: nil)

-2
-(NSString *)deviceTokenWithData:(NSData *)data
{
    NSString *deviceToken = [[data description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];
    return deviceToken;
}

-2

Nhanh

    // 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)")

    }

-2

Sử dụng danh mục tuyệt vời!

// .h tập tin

@interface NSData (DeviceToken)

- (NSString *)stringDeviceToken;

@end    

// .m tập tin

#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;
}

@kết thúc

// AppDelegate.m

#import "NSData+DeviceToken.h"

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

Hoạt động tốt!


Không dựa vào việc sử dụng "mô tả", định dạng của nó có thể thay đổi trong tương lai. Nó chỉ dành cho mục đích hiển thị.
Michael Peterson

-3

Swift 3:

Nếu bất kỳ ai đang tìm cách lấy mã thông báo thiết bị trong Swift 3. Sử dụng đoạn mã được sửa đổi bên dưới.

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

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

    print(deviceTokenString)

2
Tôi không khuyên bạn nên sử dụng .descrip vì điều đó không được đảm bảo giữ nguyên. Xem câu trả lời của tôi tại đây: stackoverflow.com/questions/9372815/ từ
swift taylor

-4
var token: String = ""
for i in 0..<deviceToken.count {
    token += String(format: "%02.2hhx", deviceToken[i] as CVarArg)
}

print(token)

1
Sử dụng mô tả không an toàn vì nó không được đảm bảo để cho kết quả tương tự trong tương lai.
Sahil Kapoor

-4

Giải pháp @kulss đăng ở đây, tuy thiếu thanh lịch nhưng có ưu điểm đơn giản không còn hoạt động trong iOS 13, vì descriptionsẽ hoạt động khác với NSData. Bạn vẫn có thể sử dụng debugDescriptionmặc dù.

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


-9
NSString *tokenstring = [[NSString alloc] initWithData:token encoding:NSUTF8StringEncoding];

Điều này hoạt động khi dữ liệu là một chuỗi, tuy nhiên, deviceToken không phải là một chuỗi.
Simon Epskamp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.