iphone - কিভাবে আমি আমার ডিভাইস টোকেন(NSData) একটি NSString রূপান্তর করতে পারেন?




objective-c cocoa-touch (16)

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

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

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


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

এক রৈখিক:

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

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

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

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


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

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

আমি মনে করি হেক্স বাইট স্ট্রিং থেকে ডিভাইস টোকেন রূপান্তর কোন ধারনা আছে। কেন? আপনি এটি আপনার ব্যাকএন্ডে প্রেরণ করবেন, যেখানে এটি APNS এ push করা যেতে বাইটগুলিতে রূপান্তরিত হবে। সুতরাং, NSData এর পদ্ধতি base64EncodedStringWithOptions 64 এনকোডেড স্ট্রিং উইথঅপন্স ব্যবহার করুন, এটি সার্ভারে ধাক্কা দিন এবং তারপরে বিপরীত বেস64 ডিকোডেড ডেটা ব্যবহার করুন :) এটি এত সহজ!

NSString *tokenString = [tokenData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

উচ্চ ভোট answer %02.2hhx ব্যাখ্যা:

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

আরো বিস্তারিত জানার জন্য, IEEE printf স্পেসিফিকেশন দেখুন

উপরের ব্যাখ্যাটির উপর ভিত্তি করে, আমি মনে করি এটি %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

এখানে আপনি 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
}

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

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

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

এটি একটি সামান্য বিট সংক্ষিপ্ত সমাধান:

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

কেউ আমাকে এই সাহায্য করেছে। আমি শুধু পাশ দিয়ে যাচ্ছি

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

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

সুইফ্ট 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()
    }
}

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

//। এইচ ফাইল

@interface NSData (DeviceToken)

- (NSString *)stringDeviceToken;

@end    

// .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;
}

@শেষ

// AppDelegate.m

#import "NSData+DeviceToken.h"

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

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


দ্রুতগতি

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

    }

সুইফট জন্য:

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

println( deviceTokenString )

সুইফ্ট 3:

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

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

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

    print(deviceTokenString)

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

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

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

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




nsdata