পুশ বিজ্ঞপ্তির জন্য ডিভাইস টোকেন পান


84

আমি ধাক্কা বিজ্ঞপ্তি উপর কাজ করছি। আমি একটি ডিভাইস টোকেন আনার জন্য নিম্নলিখিত কোডটি লিখেছি।

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    // Override point for customization after application launch.

    // Add the view controller's view to the window and display.
    [self.window addSubview:viewController.view];
    [self.window makeKeyAndVisible];

    NSLog(@"Registering for push notifications...");    
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

    return YES;
}

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
    NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
    NSLog(@"This is device token%@", deviceToken);
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
    NSString *str = [NSString stringWithFormat: @"Error: %@", err];
    NSLog(@"Error %@",err);    
}

আমি ডিভাইসে সফলভাবে অ্যাপ্লিকেশন চালাতে সক্ষম হয়েছি তবে কনসোলে ডিভাইস আইডি পেতে সক্ষম হচ্ছি না।

শংসাপত্র ও বিধানের প্রোফাইল নিয়ে আমার কোনও সমস্যা নেই।


আপনি কি সমস্ত পদক্ষেপ অনুসরণ করেছেন ? আপনার যদি শংসাপত্র এবং বিধানের পাশাপাশি কোডের সাথে কোনও সমস্যা না হয় তবে আপনি অবশ্যই কিছুটা ছোট ভুল করছেন। যেমন..আমাকে বলুন, আপনি কি আপনার সিস্টেমের সাথে একই সংযুক্ত প্রকৃত ডিভাইসে অ্যাপ চালাচ্ছেন? এছাড়াও আপনি কি কনসোল লগতে ডিভাইস টোকেন পাচ্ছেন কিনা তা লক্ষ্য করছেন? আপনি কি আইফোনে পুশ বিজ্ঞপ্তি সক্ষম করেছেন ?
সারা

আমি কনসোল লগে ডিভাইস টোকেন পেতে সক্ষম নই।
jagzzz

আমি কোনও ত্রুটি ঘটিয়ে রিয়েল ডিভাইসে অ্যাপটি চালাচ্ছি।
jagzzz

আপনি কি আইপিএন-এর লিঙ্কে প্রদর্শিত APNS সক্ষম করেছেন?
সারা

হ্যাঁ আমি এপিএনএস সক্ষম করেছি..কিন্তু ডিভাইস টোকেনটি কসোলে আনতে সক্ষম নয়
জাগজ্জেজ

উত্তর:


163

দ্রষ্টব্য: নীচের সমাধানটি আর iOS 13+ ডিভাইসে কাজ করে না - এটি আবর্জনার ডেটা ফেরত দেবে

পরিবর্তে নিম্নলিখিত কোড ব্যবহার করুন:

+ (NSString *)hexadecimalStringFromData:(NSData *)data
{
  NSUInteger dataLength = data.length;
  if (dataLength == 0) {
    return nil;
  }

  const unsigned char *dataBuffer = (const unsigned char *)data.bytes;
  NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
  for (int i = 0; i < dataLength; ++i) {
    [hexString appendFormat:@"%02x", dataBuffer[i]];
  }
  return [hexString copy];
}

সমাধান যা আইওএস 13 এর আগে কাজ করেছিল:

উদ্দেশ্য গ

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
{
    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    NSLog(@"this will return '32 bytes' in iOS 13+ rather than the token", token);
} 

সুইফট 3.0

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
{
    let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    print("this will return '32 bytes' in iOS 13+ rather than the token \(tokenString)")
}

4
তারপরে দয়া করে আপনার সরবরাহকারীর প্রোফাইলটি পরীক্ষা করুন, এটি সেই অ্যাপ্লিকেশন আইডির হওয়া উচিত যার মাধ্যমে আপনি পুশ বিজ্ঞপ্তির জন্য আপনার এসএসএল শংসাপত্র তৈরি করেছেন।
ওয়াসিফ সৌদ

4
আপনার কোডটি অ্যাপডেলিগেট ফাইল @ জাগজ্জেড
কোডেক্যাট

4
সুইফটে লিখিত লেখার ক্ষেত্রে কোড উদাহরণে আগ্রহীদের জন্য: gist.github.com/swapi/a7cee65e4ad95578044d
বেনিয়ামিন

4
সাবধান হন, "বিবরণ" সম্পত্তি আর ব্যবহার কাজ করে: stackoverflow.com/questions/39495391/...
hariseldon78

4
@ কোডেস্টার আমি এক্সকোড 10.3 ব্যবহার করে আমার বিল্ডটি আপলোড করেছি এবং এটি লাইভ। আপনার বক্তব্য অনুসারে, উদ্দেশ্য সি পদ্ধতিটি এক্সকোড ১১ এর পরবর্তী দিকে ভেঙে যাচ্ছে তবে আমি আমাদের ডাটাবেসে যা দেখতে পাচ্ছি তা অ্যাপস টোকেনের সঠিক স্ট্রিংয়ের পরিবর্তে ডেটা দৈর্ঘ্য দেখায়। সুতরাং আমি কেবল এটি জানতে চাই, এটি কি এক্সকোড সংস্করণ বা আইওএস সংস্করণ (যেমন 13. *) এর উপর নির্ভর করে?
প্রদীপ সুতরিয়া

13

টোকন ডিভাইসটি পেতে আপনি কয়েকটি পদক্ষেপের মাধ্যমে করতে পারেন :

1) বিকাশকারী শংসাপত্র এবং বিতরণ শংসাপত্র উভয়ের জন্য এপিএনএস (অ্যাপল পুশ নোটিফিকেশন পরিষেবা) সক্ষম করুন, তারপরে এই দুটি ফাইল পুনরায় ডাউনলোড করুন।

2) বিকাশকারী প্রভিশনিং এবং বিতরণ প্রভিশন ফাইল উভয়ই পুনরায় ডাউনলোড করুন।

3) এক্সকোড ইন্টারফেসে: প্রজেক্টের জন্য প্রভিশনের সেটিং এবং দুটি ফাইল প্রভিশনের সাথে টার্গেটগুলি ডাউনলোড থাকে।

4) অবশেষে, টোকন ডিভাইস পেতে আপনার অ্যাপ্লিকেশন ফাইলটিতে নীচের কোডটি যুক্ত করতে হবে (দ্রষ্টব্য: রিয়েল ডিভাইসে অ্যাপ্লিকেশন চালান)।

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
     [self.window addSubview:viewController.view];
     [self.window makeKeyAndVisible];

     NSLog(@"Registering for push notifications...");    
     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
 (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
     return YES;
}

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
     NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
     NSLog(@"%@", str);
}

- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 
     NSString *str = [NSString stringWithFormat: @"Error: %@", err];
     NSLog(@"%@",str);
}

11

এর মধ্যে descriptionবেশিরভাগ উত্তর ব্যবহার করা হ'ল ভুল পদ্ধতির পরামর্শ দেয় - এমনকি আপনি যদি এটি কাজ করেও পান তবে এটি আইওএস 13+ এ বিভক্ত হবে।

পরিবর্তে আপনার নিশ্চিত হওয়া উচিত যে আপনি আসল বাইনারি ডেটা ব্যবহার করেছেন, কেবল এটির বিবরণ নয়। আন্দ্রে গাগান উদ্দেশ্য সিটির সমাধানটিকে বেশ ভালভাবে সম্বোধন করেছিলেন, তবে ভাগ্যক্রমে দ্রুতগতিতে এটি অনেক সহজ:

সুইফট 4.2 iOS 13+ এ কাজ করে

// credit to NSHipster (see link above)
// format specifier produces a zero-padded, 2-digit hexadecimal representation
let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()

7

ওয়াসিফ সৌদের উত্তরের সৌজন্যে আইওএস 13+ এর উদ্দেশ্য সি

ডিভাইসটি এপিএন টোকেন প্রিন্ট করতে AppDelegate.m এ নীচের কোডটি অনুলিপি করুন এবং আটকান।

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
  NSUInteger dataLength = deviceToken.length;
  if (dataLength == 0) {
    return;
  }
  const unsigned char *dataBuffer = (const unsigned char *)deviceToken.bytes;
  NSMutableString *hexString  = [NSMutableString stringWithCapacity:(dataLength * 2)];
  for (int i = 0; i < dataLength; ++i) {
    [hexString appendFormat:@"%02x", dataBuffer[i]];
  }
  NSLog(@"APN token:%@", hexString);
}

5

নিম্নলিখিত কোডটি ডিভাইস টোকেন পুনরুদ্ধার করতে ব্যবহার করা হয়।

    // Prepare the Device Token for Registration (remove spaces and < >)
    NSString *devToken = [[[[deviceToken description] 
                            stringByReplacingOccurrencesOfString:@"<"withString:@""] 
                           stringByReplacingOccurrencesOfString:@">" withString:@""] 
                          stringByReplacingOccurrencesOfString: @" " withString: @""];


    NSString *str = [NSString 
                     stringWithFormat:@"Device Token=%@",devToken];
    UIAlertView *alertCtr = [[[UIAlertView alloc] initWithTitle:@"Token is " message:devToken delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease];
    [alertCtr show];
    NSLog(@"device token - %@",str);

4
এটি কখনও সঠিক সমাধান হয়নি। কখনও কিছু বেস না description
rmaddy

5

এবং ওয়াসিফের উত্তরের সুইফট সংস্করণ:

সুইফট 2.x

var token = deviceToken.description.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>"))
token = token.stringByReplacingOccurrencesOfString(" ", withString: "")
print("Token is \(token)")

সুইফট 3 এর জন্য আপডেট

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

descriptionবাইনারি ডেটা ব্যবহার করবেন না (অন্য কোনও উত্তর দেখুন)
ক্রিস স্ট্যাম্পার

4

আপনি যদি এখনও ডিভাইস টোকেন না পান তবে আপনার ডিভাইসটিকে পুশ নোটিফিকেশনের জন্য নিবন্ধিত করতে নিম্নলিখিত কোডগুলি রাখার চেষ্টা করুন।

এটি আইওএস 8 বা আরও বেশি কিছুতেও কাজ করবে।

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000

    if ([UIApplication respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSound
                                                                                 categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         UIRemoteNotificationTypeBadge |
         UIRemoteNotificationTypeAlert |
         UIRemoteNotificationTypeSound];

    }
#else
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     UIRemoteNotificationTypeBadge |
     UIRemoteNotificationTypeAlert |
     UIRemoteNotificationTypeSound];

#endif

4

আইওএস 13 থেকে শুরু করে অ্যাপল [deviceToken description]আউটপুট পরিবর্তন করেছে । এখন এটি এর মতো {length=32,bytes=0x0b8823aec3460e1724e795cba45d22e8...af8c09f971d0dabc}যা ডিভাইস টোকেনের জন্য ভুল।

কোনও সমস্যা সমাধানের জন্য আমি এই কোড স্নিপেট ব্যবহার করার পরামর্শ দিচ্ছি:

+ (NSString *)stringFromDeviceToken:(NSData *)deviceToken {
    NSUInteger length = deviceToken.length;
    if (length == 0) {
        return nil;
    }
    const unsigned char *buffer = deviceToken.bytes;
    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(length * 2)];
    for (int i = 0; i < length; ++i) {
        [hexString appendFormat:@"%02x", buffer[i]];
    }
    return [hexString copy];
}

এটি iOS13 এবং নিম্নের জন্য কাজ করবে।


4
এফওয়াইআই - যে কোনও উত্তর যা কখনও ব্যবহার করা হয়েছে descriptionতা সর্বদা ভুল ছিল। এবং টোকেনটিকে স্ট্রিংয়ে রূপান্তর করার জন্য এটি কেবলমাত্র একটি সম্ভাব্য সমাধান। একটি খুব সহজ সমাধান হ'ল এটি NSDataএকটি NSStringস্ট্যান্ডার্ড বেস 64 এনকোডিংটিতে রূপান্তর করা ।
rmaddy

1

সুইফ্ট 3-এ ডিভাইস টোকেন পান

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})

    print("Device token: \(deviceTokenString)")

}

1

আপনার অ্যাপ্লিকেশনটিতে, didRegisterForRemoteNotificationsWithDeviceTokenপদ্ধতিতে:

সুইফটের জন্য আপডেট করা:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("\(deviceToken.reduce("") { $0 + String(format: "%02.2hhx", arguments: [$1]) })")
}

0

সুইফট 4 এটি আমার পক্ষে কাজ করে:

ধাপ 1 মধ্যে লক্ষ্য অ্যাড সামর্থ্য-এ ক্লিক করুন এবং নির্বাচন করুন পুশ বিজ্ঞপ্তিগুলি

AppDelegate.swift এ পদক্ষেপ 2 নিম্নলিখিত কোড যুক্ত করুন:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
     
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound]) { (didAllow, error) in
            
        }
        UIApplication.shared.registerForRemoteNotifications()
        
        return true
    }
    
    //Get device token
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)
    {
        let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
        
        print("The token: \(tokenString)")
    }

-1

কোনও বিল্ড সেটিংয়ে কোডের স্বাক্ষর করে প্রভিশন প্রোফাইলে যদি আপনার এপিএন সক্ষম শংসাপত্র থাকে তবে আপনি অবশ্যই টোকেন আইডি পাবেন। এবং অপসারণ

বিধানের প্রোফাইল: স্বয়ংক্রিয়

এবং সেট

বিধানের প্রোফাইল: আপনার বিধানের প্রোফাইল শংসাপত্র।


-1
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let tokenParts = deviceToken.map { data -> String in
        return String(format: "%02.2hhx", data)
        }
    let token = tokenParts.joined()

    print("Token\(token)")
}

-4

ডিভাইসটির টোকেনটি নিম্নলিখিত কোডটি ব্যবহারের জন্য পেতে তবে আপনি কেবলমাত্র দৈহিক ডিভাইস ব্যবহার করে ডিভাইস টোকন পেতে পারেন। আপনার যদি ডিভাইস টোকেন প্রেরণ বাধ্যতামূলক করে থাকে তবে সিমুলেটার ব্যবহার করার সময় আপনি নীচের শর্তটি রাখতে পারেন।

  if(!(TARGET_IPHONE_SIMULATOR))
    {
        [infoDict setValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"DeviceToken"] forKey:@"device_id"];
    }
    else
    {
        [infoDict setValue:@"e79c2b66222a956ce04625b22e3cad3a63e91f34b1a21213a458fadb2b459385" forKey:@"device_id"];
    }



- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
    NSLog(@"My token is: %@", deviceToken);
    NSString * deviceTokenString = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""]   stringByReplacingOccurrencesOfString: @" " withString: @""];
    NSLog(@"the generated device token string is : %@",deviceTokenString);
    [[NSUserDefaults standardUserDefaults] setObject:deviceTokenString forKey:@"DeviceToken"];
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.