पुश नोटिफिकेशन के लिए डिवाइस टोकन प्राप्त करें


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

मैं डिवाइस पर एप्लिकेशन को सफलतापूर्वक चलाने में सक्षम हूं लेकिन कंसोल पर डिवाइस आईडी प्राप्त करने में सक्षम नहीं हूं।

मेरे पास प्रमाणीकरण और प्रोविजनिंग प्रोफाइल के साथ कोई समस्या नहीं है।


क्या आपने सभी चरणों का पालन किया ? यदि आपको प्रमाणन और प्रावधान के साथ-साथ कोड की कोई समस्या नहीं है, तो आपको कुछ छोटी सी गलती करनी चाहिए। जैसे .. मुझे बताओ, क्या आप असली डिवाइस पर ऐप चला रहे हैं जो आपके सिस्टम के साथ समान है? क्या आप यह भी देख रहे हैं कि आपको कंसोल लॉग में डिवाइस टोकन मिल रहा है या नहीं? क्या आपने iPhone में पुश सूचना सक्षम की है ?
सारा

मैं कंसोल लॉग पर डिवाइस टोकन प्राप्त करने में सक्षम नहीं हूं।
जगज्ज़

मैं किसी भी त्रुटि के साथ वास्तविक डिवाइस पर ऐप चला रहा हूं।

क्या आपने APNS को सक्षम किया जैसा कि iPhone पर लिंक में दिखाया गया है?
सारा

हाँ मैंने APNS को सक्षम किया है..लेकिन डिवाइस टोकन कॉसोल पर लाने में सक्षम नहीं है
jagzzz

जवाबों:


162

नोट: नीचे दिया गया समाधान अब 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];
}

समाधान जो iOS 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
फिर कृपया अपना प्रोविज़निंग प्रोफाइल देखें, यह उस ऐप आईडी का होना चाहिए जिसके द्वारा आपने पुश अधिसूचना के लिए अपना ssl सर्टिफिकेट बनाया है।
वासिफ सौदा

1
आपको कोड जोड़ने की जरूरत है AppDelegate फ़ाइल @jagzzz
कोडर्कैट

2
उन लोगों के लिए जो स्विफ्ट में एक कोड उदाहरण में रुचि रखते हैं: gist.github.com/sawapi/a7cee65e4ad95578044d
बेंजामिन

3
सावधान, "विवरण" का उपयोग करते हुए संपत्ति अब काम नहीं करती है: stackoverflow.com/questions/39495391/…
hariseldon78

1
@ कोडर मैंने Xcode 10.3 का उपयोग करके अपना बिल्ड अपलोड किया था और यह लाइव है। आपके कथन के अनुसार, Objective C मेथड XCode 11 से आगे जा रहा है, लेकिन मैं हमारे डेटाबेस में जो देख सकता हूं वह एपन टोकन के सही स्ट्रिंग के बजाय डेटा लंबाई दिखा रहा है। इसलिए मैं सिर्फ यह जानना चाहता हूं कि, क्या यह Xcode वर्जन या iOS वर्जन (यानी 13. *) पर निर्भर करता है?
प्रदीप सुतारिया

13

टोकन डिवाइस प्राप्त करने के लिए आप कुछ चरणों द्वारा कर सकते हैं :

1) डेवलपर प्रमाणन और वितरण प्रमाणन दोनों के लिए APNS (Apple पुश अधिसूचना सेवा) सक्षम करें, फिर उन दो फ़ाइल को फिर से डाउनलोड करें।

2) डेवलपर प्रोविजनिंग और डिस्ट्रिब्यूट प्रोविजनिंग फ़ाइल दोनों को फिर से डाउनलोड करें।

3) Xcode इंटरफ़ेस में: दो फाइल प्रोविजनिंग के साथ PROJECT और TARGETS के लिए प्रावधान करना डाउनलोड है।

4) अंत में, आपको टोकन डिवाइस (असली डिवाइस में नोट: रन ऐप) प्राप्त करने के लिए AppDelegate फ़ाइल में नीचे दिए गए कोड को जोड़ने की आवश्यकता है।

- (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इनमें से कई उत्तरों का उपयोग करना गलत दृष्टिकोण है - भले ही आप इसे काम करने के लिए प्राप्त करें, यह iOS 13+ में टूट जाएगा।

इसके बजाय आपको यह सुनिश्चित करना चाहिए कि आप वास्तविक बाइनरी डेटा का उपयोग करें, न कि केवल इसका विवरण। एंड्री गगन ने उद्देश्य सी समाधान को काफी अच्छी तरह से संबोधित किया, लेकिन सौभाग्य से यह स्विफ्ट में बहुत सरल है:

आईओएस 13+ में स्विफ्ट 4.2 काम करता है

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

IOS 13+ के लिए ऑब्जेक्टिव सी , वासिफ सूद के जवाब के सौजन्य से

उपकरण APN टोकन प्रिंट करने के लिए 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);

3
यह कभी सही समाधान नहीं रहा। पर कुछ भी आधार नहीं है description
रामपाल

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बाइनरी डेटा पर कभी भी उपयोग न करें (कोई अन्य उत्तर देखें)
cdstamper

4

यदि आपको अभी भी डिवाइस टोकन नहीं मिल रहा है, तो पुश अधिसूचना के लिए अपने डिवाइस को पंजीकृत करने के लिए निम्न कोड डालने का प्रयास करें।

यह ios8 या अधिक पर भी काम करेगा।

#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

3

IOS 13 से शुरू होकर Apple ने [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 और लोअर के लिए काम करेगा।


1
FYI करें - कोई भी उत्तर जो कभी भी उपयोग किया descriptionगया था वह हमेशा गलत था। और टोकन को स्ट्रिंग में बदलने के लिए यह केवल एक संभव समाधान है। एक बहुत सरल समाधान NSDataएक NSStringमानक base64 एन्कोडिंग का उपयोग करके परिवर्तित करना है ।
रामप्यारी

1

स्विफ्ट 3 में डिवाइस टोकन प्राप्त करें

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

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

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

}

1

आपके AppDelegate में, 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

एक प्रॉपर सेटिंग सेट कोड में साइन अप प्रोविजन प्रोफाइल अगर आपके पास APN इनेबल सर्टिफिकेट है तो आपको टोकन आईडी जरूर मिलेगा। और हटा दें

प्रावधान प्रोफाइल: स्वचालित

और के लिए सेट

प्रावधान प्रोफाइल: आपका प्रावधान प्रोफ़ाइल प्रमाणपत्र।


-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"];
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.