আমি কীভাবে আমার ডিভাইস টোকেন (এনএসডাটা) কে এনএসএস স্ট্রিংয়ে রূপান্তর করতে পারি?


157

আমি পুশ বিজ্ঞপ্তিগুলি প্রয়োগ করছি। আমি আমার এপিএনএস টোকনকে একটি স্ট্রিং হিসাবে সংরক্ষণ করতে চাই।

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

কোডের প্রথম লাইনটি শূন্য করে। দ্বিতীয়টি টোকেনটি প্রিন্ট করে। আমি কীভাবে আমার নতুন ডেভিসটোকনকে এনএসএসস্ট্রিং হিসাবে পেতে পারি?


দ্বিতীয়টির আউটপুট কী NSLogপ্রিন্ট করে newDeviceToken?
রব মায়ফ


বিবরণ ব্যবহার করবেন না
ফ্যাটি

উত্তর:


40

এটা ব্যবহার কর :

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

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

134
বর্ণনাটি ব্যবহার করা খারাপ ধারণা বলে মনে হচ্ছে: কোনও কিছুই নিশ্চিত করে না যে iOS এর পরবর্তী সংস্করণটি এই কলটির বাস্তবায়ন এবং ফলাফল পরিবর্তন করবে না।
মেডওয়াল্ফ

16
সত্যই, এটি একটি সত্যই খারাপ ধারণা।
ডেভিড স্নাবেল-কাউন্ট

21
@madewulf নির্দেশ আপনি খুব সুন্দর এটা কিভাবে ব্যবহার বিবরণ যেমন একটি ভয়ানক ধারণা .. এটা হয়েছে এমনকি nicer আপনি পরামর্শ দিয়েছেন যদি হতো একটি বিকল্প
abbood

6
[ডিভাইস টোকেন বাইটস] এর সাথে সমাধানটি এখানে বিলটি ফিট করে।
15

37
সুইফ্ট 3 / আইওএস 10 হিসাবে সক্রিয় হয়, একটি ডিভাইসে টোকেনের বিবরণ "32 বাইট" দেয়। হ্যাঁ, এটি ব্যবহার করবেন না।
ভিক্টর লুফ্ট

231

কেউ যদি সুইফটে এটি করার উপায় খুঁজছেন:

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

সম্পাদনা করুন: সুইফ্ট 3 এর জন্য

সুইফট 3 Dataপ্রকারটি মূল্যবোধের সাথে উপস্থাপন করে । স্ট্রিংয়ে রূপান্তর deviceTokenকরতে, আপনি নিম্নলিখিত হিসাবে করতে পারেন:

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

118
কেন এটি এত জটিল হতে হবে, ওএস আমাদের কী স্ট্রিং দেয় তাতে সমস্যা কীহেতু সবার প্রয়োজন তাই? এই সমাধানের জন্য আপনাকে ধন্যবাদ।
পাইওয়াফ

3
@ সাছা আশা করি আপনি আমার খুব কার্যকর
উত্তরটিতে

16
আমি রিফ্যাক্টর করেছি: let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() qiita.com/mono0926/items/3cf0dca3029f32f54a09
মনো

2
স্থিতিশীল হওয়ার গ্যারান্টি না থাকায় আমি .descript ব্যবহার করার পরামর্শ দিচ্ছি না। আমার উত্তর এখানে দেখুন: stackoverflow.com/questions/9372815/…
সুইফট টেলর

7
আপনি কি ব্যাখ্যা করতে "%02.2hhxপারেন?
মধু

155

কেউ আমাকে এটির জন্য সাহায্য করেছেন I আমি কেবল পাশ দিয়ে যাচ্ছি

- (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
এটিই সেরা সমাধান, যেহেতু হেক্স হিসাবে এনকন্ডিগ বাইটগুলি বোঝায় যে আপনি এটি গণনা করতে পারেন;)
loretoparisi

4
এক্সকোড 5 এ আমাকে সংকলনের জন্য ডিভাইস টোকেনটি কাস্ট করতে হয়েছিল: কনস্ট্যান্ড স্বাক্ষরিত * টোকেনবাইটস (কনস্ট্যান্ড স্বাক্ষরিত *) [ডিভাইস টোকেন বাইটস];
পনিটেক

3
টোকনগুলি শীঘ্রই 32 বাইটের চেয়ে বড় হতে চলেছে তাই আটটি হার্ড-কোডেড পূর্ণসংখ্যার পরিবর্তে প্রতিটি বাইটের উপরে এটির লুপ হওয়া দরকার।
টম ডালিং

5
এটি কি আরও ভাল সমাধান হতে পারে? const unsigned *tokenBytes = [deviceToken bytes]; NSMutableString *hexToken = [NSMutableString string]; for (NSUInteger byteCount = 0; byteCount * 4 < [deviceToken length]; byteCount++) { [hexToken appendFormat:@"%08x", ntohl(tokenBytes[byteCount])]; }
হ্যারো

9
Important: APNs device tokens are of variable length. Do not hard-code their size.অ্যাপল বলেছেন।
এরকানাইল্ডিজ

141

আপনি এটি ব্যবহার করতে পারে

- (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
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, কারণ এটি ব্যবহারের চেয়ে নিরাপদ description
DrMickeyLauer

8
এটি উদ্দেশ্য-সি-এর একমাত্র সঠিক উত্তর যা টোকেন আকারে আগত বৃদ্ধি পরিচালনা করবে।
টম ডালিং

সম্মত হয়েছে যে এটি সম্ভবত নিরাপদতম উপায় কারণ এটি কোনও নির্দিষ্ট টোকেন আকার / দৈর্ঘ্য ধরে না।
রায়ান এইচ।

আইওএস 10 এ কাজ করে
Tjalsma

2
আমি [token appendFormat:@"%02.2hhx", data[i]];অ্যামাজন এসএনএস হিসাবে ব্যবহার করেছি যাতে লোয়ার কেসের প্রয়োজন হয়।
ম্যানুয়েল শ্মিতজবার্গার

43

যারা সুইফট 3 এবং সবচেয়ে সহজ পদ্ধতিতে চান তাদের জন্য

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

1
আমি একই কোডটি লিখেছি :) এটি সর্বাধিক দ্রুততম সংস্করণ, এবং কেবল
এটিই

1
@ আনন্দ এবং আপনি দয়া করে এই কোডটিতে কী খুশি তা ব্যাখ্যা করতে পারেনdeviceToken.reduce("", {$0 + String(format: "%02X", $1)})
রামকৃষ্ণ

1
এটি সুইফটের ফাংশন হ্রাস করে যা ডেটাটিকে হেক্সাডেসিমাল স্ট্রিংয়ে এবং তারপরে স্ট্রিংয়ে সিরিয়াল করে তোলে। ফাংশন হ্রাস সম্পর্কে আরও বুঝতে পড়ুন useyourloaf.com/blog/swift-guide-to-map-filter-reduce
আনন্দ

15

%02.2hhxউচ্চ ভোটের উত্তরের ব্যাখ্যা :

  • %: xরূপান্তরকারী সুনির্দিষ্ট পরিচয় করিয়ে দেয় ।
  • 02: রূপান্তরিত মানের সর্বনিম্ন প্রস্থ ২. রূপান্তরিত মানটির ক্ষেত্র প্রস্থের চেয়ে কম বাইট থাকলে, এটি 0বামে প্যাড করা হবে।
  • .2: xরূপান্তর নির্দিষ্টকারীর জন্য প্রদর্শিত সর্বনিম্ন সংখ্যার সংখ্যা দেয় ।
  • hh: নির্দিষ্ট করে যে x রূপান্তর সুনির্দিষ্ট একটি স্বাক্ষরিত চর বা স্বাক্ষরবিহীন চার্ট আর্গুমেন্টের জন্য প্রযোজ্য (আর্গুমেন্টটি সংখ্যার পদোন্নতি অনুসারে প্রচারিত হবে, তবে এর মান মুদ্রণের আগে স্বাক্ষরিত চর বা স্বাক্ষরবিহীন চরে রূপান্তরিত হবে)।
  • x: স্বাক্ষরবিহীন যুক্তিটি "dddd" স্টাইলে স্বাক্ষরবিহীন হেক্সাডেসিমাল ফর্ম্যাটে রূপান্তরিত হবে; "abcdef" অক্ষর ব্যবহৃত হয় যথার্থতা প্রদর্শিত হবার জন্য সর্বনিম্ন অঙ্কের সংখ্যা নির্দিষ্ট করে; রূপান্তরিত মানটি যদি কম সংখ্যায় উপস্থাপন করা যায় তবে এটি নেতৃস্থানীয় শূন্যগুলির সাথে প্রসারিত হবে। ডিফল্ট নির্ভুলতা ১। শূন্যের সুস্পষ্ট নির্ভুলতার সাথে শূন্য রূপান্তর করার ফলাফল কোনও অক্ষর হবে না।

আরও তথ্যের জন্য, আইইইই প্রিন্টফ স্পেসিফিকেশন দেখুন


উপরোক্ত ব্যাখ্যার ভিত্তিতে, আমি মনে করি এটি পরিবর্তন %02.2hhxকরা ভাল%02x বা%.2x

সুইফ্ট 5 এর জন্য, নিম্নলিখিত পদ্ধতিগুলি সমস্ত ব্যবহারযোগ্য:

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

পরীক্ষাটি নিম্নরূপ:

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

এই উত্তরের জন্য আপনাকে ধন্যবাদ। এই আইওএস 12 এর সাথেও কি কাজ করে? বা এটি কেবল সুইফ্ট সংস্করণে নির্ভর করে?
মার্কাস

1
@ মারকাস এটি আইওএস 12 এ কাজ করে, এটি কেবল সুইফ্ট সংস্করণে নির্ভর করে।
jqgsninimo

14

এটি আমার সমাধান এবং এটি আমার অ্যাপ্লিকেশনটিতে ভালভাবে কাজ করে:

    NSString* newToken = [[[NSString stringWithFormat:@"%@",deviceToken] 
stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""];
  • ধর্মান্তরিত NSDataকরার NSStringসঙ্গেstringWithFormat
  • "<>" ট্রিম করুন
  • স্থানগুলি সরিয়ে ফেলুন

10
এটি কেবল স্পষ্টভাবে কল করে -description, তাই এটি গৃহীত উত্তরের চেয়ে কোনও নিরাপদ নয়।
jszumski

আপনি কি আপনার উত্স লিঙ্ক করতে পারেন? আমি কোথাও এটি সম্পর্কে তথ্য খুঁজে পাচ্ছি না। ধন্যবাদ.
জেব

খুঁজে পেয়েছি! আমি মনে করি এটি কিছুটা আলাদা। বর্ণনা বৈশিষ্ট্যটি সরাসরি ব্যবহার করা নিরাপদ নয় কারণ এটি ভবিষ্যতের সংস্করণগুলিতে পরিবর্তিত হতে পারে তবে আপনি যদি এনএসএস স্ট্রিংয়ের মাধ্যমে এটি ব্যবহার করেন তবে আপনার সমস্যা খুব কমই হবে।
জেব

5
না descriptionজাস্মমস্কি যেমন বলছে ঠিক তেমন ডিভাইস টোকনে কল করে।
জনি

1
@ জেব descriptionআপনি সরাসরি কল করেছেন কিনা তা নির্ভর করে বা অন্য কোনও পদ্ধতির মাধ্যমে ব্যবহার করা নিরাপদ নয় , কারণ ফেরত স্ট্রিংয়ের ফর্ম্যাট যে কোনও সময় পরিবর্তন করা যেতে পারে। সঠিক সমাধানটি এখানে: stackoverflow.com/a/16411517/108105
টম ডালিং

10

আমি মনে করি ডিভাইস টোকেনকে হেক্স বাইট স্ট্রিংয়ে রূপান্তর করার কোনও বুদ্ধি নেই। কেন? আপনি এটিকে আপনার ব্যাকএন্ডে প্রেরণ করবেন, যেখানে এটি এপিএনএসে চাপানোর জন্য এটি আবার বাইটে রূপান্তরিত হবে। সুতরাং, এনএসডিটার পদ্ধতিটি ব্যবহার করুন base64EncodedStringWithOptions, এটিকে সার্ভারে চাপ দিন, এবং তারপরে বিপরীত বেস 64 নথিভুক্ত ডেটা ব্যবহার করুন :) এটি এত সহজ :)

NSString *tokenString = [tokenData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

@ jeet.chanchawat দয়া করে অন্যান্য ব্যবহারকারীর উত্তরে কোড যুক্ত করবেন না। আমরা তাদের মুখে শব্দ রাখতে চাই না, বিশেষত যখন কোনও উদ্দেশ্য-সি উত্তরে সুইফ্ট যুক্ত করি। পরিবর্তে, আপনার নিজের উত্তর যুক্ত করুন।
জাল

2
আমি কেবল @ ওলেগ শান্যুকের উত্তরটি চুরি করতে চাইনি। যেহেতু এটি তার উত্তরকে কেন্দ্র করে অন্য ভাষায় অনুবাদ করা হয়েছে, তাই তিনি ভবিষ্যতের ভোটের দাবিদার। আমি যদি অন্য উত্তর যুক্ত করি তবে এটি আমাকে উত্তরটির উত্তর দেবে যা অন্য কারও গবেষণা। আশা করি এটি EDIT কে ন্যায্যতা দেয়।
jeet.chanchawat

10

আইওএসে 13 টি descriptionব্রেক হয়ে যাবে তাই এটি ব্যবহার করুন

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

স্পষ্টতার জন্য, আসুন এটি ভাঙা এবং প্রতিটি অংশ ব্যাখ্যা করুন:

মানচিত্রের পদ্ধতিটি একটি অনুক্রমের প্রতিটি উপাদানকে নিয়ে কাজ করে। যেহেতু ডেটা সুইফটে বাইটের ক্রম, তাই ডিভাইস টোকেনের প্রতিটি বাইটের জন্য পাস করা বন্ধের মূল্যায়ন করা হয়। স্ট্রিং (ফর্ম্যাট :) আরম্ভকারী বাইট / 8-বিট পূর্ণসংখ্যার শূন্য-প্যাডড, 2-ডিজিটের হেক্সাডেসিমেল উপস্থাপনার জন্য% 02x ফর্ম্যাট নির্দিষ্টকরণকারী ব্যবহার করে ডেটাতে প্রতিটি বাইট (অজ্ঞাত প্যারামিটার represented 0 দ্বারা প্রতিনিধিত্ব করে) মূল্যায়ন করে। মানচিত্রের পদ্ধতি দ্বারা তৈরি প্রতিটি বাইট উপস্থাপনা সংগ্রহের পরে, যোগদান () প্রতিটি উপাদানকে একক স্ট্রিংয়ে যুক্ত করে।

পিএস বিবরণ ব্যবহার করবেন না আইওএস 12 এবং আইওএস 13 এ বিভিন্ন স্ট্রিং দেয় এবং ভবিষ্যতের স্কোপ অনুযায়ী নিরাপদ নয়। বিকাশকারীদের কোনও সামগ্রীর বর্ণনার জন্য একটি নির্দিষ্ট বিন্যাসের উপর নির্ভর করা উচিত নয়।

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

আরও তথ্যের জন্য এটি পড়ুন


10

আইওএস 13 এ বর্ণনাটি বিভিন্ন ফর্ম্যাটে থাকবে। ডিভাইস টোকেন আনতে দয়া করে নীচের কোডটি ব্যবহার করুন।

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

আইওএসের জন্য নিখুঁত সমাধান 13. ধন্যবাদ বিষ্ণু
মনিশ

1
এটি বর্তমানে সংকলন করে না - lengthলুপের জন্য পরিবর্তন করতে হবে len। আমার কাছে সম্পাদনা করার জন্য দৃশ্যত খুব ছোট একটি পরিবর্তন .. তবে অন্যটি পুরোপুরি কাজ করে!
Anders Friis

আপনি একটি জীবন রক্ষাকারী
ময়েজ আকরাম

3

এটি সামান্য খাটো সমাধান:

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

কার্যকরী সুইফ্ট সংস্করণ

এক রৈখিক:

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

এখানে একটি পুনঃব্যবহারযোগ্য এবং স্ব ডকুমেন্টিং এক্সটেনশন ফর্মটিতে রয়েছে:

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

বিকল্পভাবে, আপনার সমবয়সীদের দ্বারা একটি কার্যকরী মাস্টার হিসাবে দেখার reduce("", combine: +)পরিবর্তে ব্যবহার করুন joinWithSeparator("")


সম্পাদনা করুন: আমি স্ট্রিংকে ($ 0, রেডিক্স: 16) স্ট্রিং (ফর্ম্যাট: "% 02x", $ 0) এ পরিবর্তন করেছি, কারণ প্যাডিং শূন্যের জন্য একটি অঙ্কের সংখ্যা দরকার

(কীভাবে কোনও প্রশ্নটিকে এই অন্যটির সদৃশ হিসাবে চিহ্নিত করতে হয় তা আমি এখনও জানি না , তাই আমি কেবল আমার উত্তরটি আবার পোস্ট করেছি)


ধন্যবাদ আমার জন্য কাজ করে
হাস্যা

3

2020

পাঠ্য হিসাবে টোকেন ...

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

বা আপনি যদি পছন্দ করেন

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

(ফলাফল একই)


2

আমার উত্তর গাদা উপর নিক্ষেপ। স্ট্রিং পার্সিং ব্যবহার করা এড়িয়ে চলুন; এটি এনএসডাটা.ডেস্ক্রিপশন সর্বদা সেইভাবে কাজ করবে এমন দস্তাবেজগুলির দ্বারা গ্যারান্টিযুক্ত নয়।

সুইফট 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

আমি ফর্ম্যাট "%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)

এবং ফলাফলটি হ'ল "%02x"হ্রাস করা সংস্করণের জন্য দ্রুততম গড় 2.0 2.0 বনাম 2.6:

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

1

আপডেটঅ্যাকিউমুলেটিংআরসাল্ট ব্যবহার করা এখানে পাওয়া বিভিন্ন অন্যান্য পদ্ধতির তুলনায় আরও দক্ষ, সুতরাং আপনার বাইটগুলিকে আরও শক্তিশালী করার সুইফটিস্ট উপায়টি এখানে Data:

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

অ্যালেক্স, এটা% 02.2hhx হবে না
Fattie

0

সুইফ্টের জন্য:

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

println( deviceTokenString )

0

এক লাইন সমাধান সম্পর্কে কি?

উদ্দেশ্য গ

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

দ্রুতগতি

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

2
এটি সহজ এবং সর্বোত্তম সমাধান। ধন্যবাদ
এমি

0

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

আজকের হিসাবে গ্রেট সমাধান, এটা credentials.token.description.replacingOccurrences করার implified যাবে (শূন্য এর: "[<>]", সঙ্গে: "", বিকল্প: .regularExpression, পরিসর)
ফ্রাঙ্ক

-1

সুইফট:

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

দ্রুতগতি

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

চমৎকার বিভাগ ব্যবহার করুন!

// .h ফাইল

@interface NSData (DeviceToken)

- (NSString *)stringDeviceToken;

@end    

// .এম ফাইল

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

@শেষ

// অ্যাপডেলিগেট.এম

#import "NSData+DeviceToken.h"

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

ঠিকভাবে কাজ করে!


"বিবরণ" ব্যবহারের উপর নির্ভর করবেন না, এটির ফর্ম্যাটটি ভবিষ্যতে পরিবর্তিত হতে পারে। এটি কেবল প্রদর্শনের উদ্দেশ্যে।
মাইকেল পিটারসন

-3

সুইফট 3:

যদি কেউ কেউ সুইফ্ট 3-এ ডিভাইস টোকেন পাওয়ার উপায় খুঁজছেন তবে নীচের পরিবর্তিত স্নিপেট ব্যবহার করুন।

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

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

    print(deviceTokenString)

2
আমি .descript ব্যবহার করার পরামর্শ দিচ্ছি না কারণ এটি একই থাকার গ্যারান্টিযুক্ত নয়। আমার উত্তরটি এখানে দেখুন: stackoverflow.com/questions/9372815/…
সুইফট টেলর

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

print(token)

1
বিবরণ ব্যবহার করা নিরাপদ নয় কারণ ভবিষ্যতে একই ফলাফল দেওয়ার গ্যারান্টি নেই।
সাহিল কাপুর

-4

@ কুলস এখানে সমাধান পোস্ট করেছে, কমনীয়তার অভাব থাকলেও সরলতার গুণ থাকলে আইওএস 13 তে আর কাজ করে না, যেহেতু descriptionএনএসডাটার পক্ষে আলাদাভাবে কাজ করবে। আপনি এখনও ব্যবহার করতে পারেন debugDescription

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

-7

ডেটা নাল-সমাপ্ত না হওয়া পর্যন্ত এটি ব্যবহার করে দেখুন।

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


আমি এটি চেষ্টা করেছি, এটি কাজ করে না। আমার কোড স্নিপেটে আমি এটি মন্তব্য করেছি।
শিহান আলম

@ শিহানআলাম এই লোকটি এটির মাধ্যমে তৈরি করেছে। এটি স্ট্রিংয়ে রূপান্তর করছে কীভাবে দেখুন। stackoverflow.com/questions/4994302/…
নাভেদ আহমেদ

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

এটি কাজ করে যখন ডেটা একটি স্ট্রিং হয়, তবে, ডিভাইস টোকেন কোনও স্ট্রিং নয়।
সাইমন এপসক্যাম্প
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.