เหตุใดจึงไม่เรียก RegisterForRemoteNotificationsWithDeviceToken


89

ฉันกำลังสร้างแอปพลิเคชันที่ฉันต้องการใช้บริการแจ้งเตือนแบบพุชของ Apple ฉันกำลังทำตามคำแนะนำทีละขั้นตอนที่ให้ไว้ในบทช่วยสอนนี้

แต่ถึงกระนั้นก็ยังไม่มีการเรียกวิธีการดังกล่าว ฉันไม่รู้ว่าอะไรเป็นสาเหตุของปัญหา ใครสามารถช่วยฉัน?

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
        //NSString * token = [[NSString alloc] initWithData:deviceTokenencoding:NSUTF8StringEncoding];
        NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
        NSLog(@"Device Token:%@",str);

        //NSLog(@"Device token is called");
        //const void *devTokenBytes = [deviceToken bytes];
        //NSLog(@"Device Token");
    }

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

ไม่จำเป็นต้องเพิ่มรหัสอื่น ๆ เพียงตรวจสอบที่ลิงค์stackoverflow.com/a/39849892/3269536
jenish

คำตอบ:


74

ฉันมีปัญหาเดียวกัน: โทรregisterForRemoteNotificationTypes:เรียกค่าapplication:didRegisterForRemoteNotificationsWithDeviceToken:มิได้application:didFailToRegisterForRemoteNotificationsWithError:

ฉันในที่สุดได้รับการแก้ไขปัญหานี้ด้วยความช่วยเหลือของหมายเหตุทางเทคนิคนี้แอปเปิ้ลTN2265

นี่คือสิ่งที่ฉันทำ:

ก่อนอื่นฉันตรวจสอบอีกครั้งว่าฉันลงทะเบียนอย่างถูกต้องสำหรับการแจ้งเตือนแบบพุชซึ่งรวมถึงการยืนยันโปรไฟล์การจัดเตรียมของฉันสำหรับคีย์ "aps-environment" และการกำหนดรหัสของไฟล์. app ฉันตั้งค่าทุกอย่างถูกต้องแล้ว

จากนั้นฉันต้องดีบักข้อความสถานะการแจ้งเตือนแบบพุชในคอนโซล (คุณต้องติดตั้งโปรไฟล์การจัดเตรียม PersistentConnectionLogging.mobileconfig บนอุปกรณ์ของคุณและเริ่มต้นใหม่ดูTN2265ภายใต้ "การสังเกตข้อความสถานะการกด") ฉันสังเกตเห็นว่ากระบวนการ apns เริ่มจับเวลาและคำนวณวันที่ไฟขั้นต่ำซึ่งทำให้ฉันสงสัยว่าข้อความยืนยันการลงทะเบียนการแจ้งเตือนแบบพุชซึ่งปกติจะแสดง ณ จุดนี้ถูกบีบอัดโดย APNS ตามที่ระบุไว้ใน TN2265:

การรีเซ็ตการแจ้งเตือนการอนุญาตการแจ้งเตือนแบบพุชบน iOS

ครั้งแรกที่แอพที่เปิดใช้งานการกดลงทะเบียนสำหรับการแจ้งเตือนแบบพุช iOS จะถามผู้ใช้ว่าพวกเขาต้องการรับการแจ้งเตือนสำหรับแอพนั้นหรือไม่ เมื่อผู้ใช้ตอบสนองต่อการแจ้งเตือนนี้แล้วจะไม่มีการนำเสนออีกเว้นแต่จะมีการกู้คืนอุปกรณ์หรือถอนการติดตั้งแอปเป็นเวลาอย่างน้อยหนึ่งวัน

หากคุณต้องการจำลองการเรียกใช้แอปครั้งแรกคุณสามารถถอนการติดตั้งแอปทิ้งไว้ 1 วัน คุณสามารถทำสิ่งหลังได้โดยไม่ต้องรอวันโดยการตั้งค่านาฬิการะบบไปข้างหน้าอย่างน้อยหนึ่งวันปิดอุปกรณ์อย่างสมบูรณ์จากนั้นเปิดอุปกรณ์อีกครั้ง

ดังนั้นฉันจึงลบแอพออกจากอุปกรณ์จากนั้นเปลี่ยนวันที่ของ iPhone ด้วยตนเองในการตั้งค่ารีบูตอุปกรณ์และติดตั้งแอพใหม่

ในครั้งต่อไปที่รหัสของฉันเรียกregisterForRemoteNotificationTypesมันได้รับการติดต่อกลับตามที่คาดไว้

สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้ หวังว่าจะช่วยได้


1
ประเด็นสำคัญสำหรับฉันคือฉันใช้ใบรับรองการพัฒนาที่เก่ากว่าในเครื่องอื่น การโอนใบรับรองใหม่ล่าสุดจากแล็ปท็อปการพัฒนาหลักช่วยแก้ไขปัญหานี้ได้
Markus Rautopuro

3
หลังจากเปิดใช้งานการแจ้งเตือนแบบพุชจำเป็นต้องสร้างโปรไฟล์การจัดเตรียมอีกครั้ง
Tony

3
ไฮ! แม้ว่านี่จะเป็นโพสต์เก่า แต่ฉันพบว่าบางครั้งมันจะได้รับการแก้ไขเมื่อคุณปิดและเปิดการตั้งค่าการแจ้งเตือนทั้งหมดของแอพ เพราะครั้งที่แล้วฉันจำได้ว่า didRegisterForRemoteNotificationsWithDeviceToken ถูกเรียกแล้วจู่ๆมันก็ไม่ใช่ หวังว่าจะช่วยได้
otakuProgrammer

1
ฉันทำได้เพียงเพิ่มขั้นตอนการรีเซ็ตอีกขั้น: 1. ลบแอพ 2. รีเซ็ตอุปกรณ์ 3. นาฬิกาเดินหน้า 1+ วัน 4. รีเซ็ตอุปกรณ์อีกครั้ง 5. ตอนนี้ติดตั้งและควรแจ้งเตือนการแจ้งเตือนแบบพุช
etayluz

สิ่งสำคัญคือต้องตรวจสอบให้แน่ใจว่าคุณไม่มีสำเนา "ถูกต้อง" หลายชุดของโปรไฟล์การจัดสรรการพัฒนาเดียวกันทั้งใน Xcode หรือในอุปกรณ์ บางทีคุณอาจสร้างใบรับรอง APN ใหม่และสร้างโปรไฟล์การจัดเตรียมของคุณใหม่หลังจากใบรับรองก่อนหน้านี้หมดอายุ โปรไฟล์การพัฒนาเก่ายังคงใช้ได้เป็นโปรไฟล์การพัฒนา แต่จะไม่เพียงพอที่จะเปิดใช้งาน APN คุณจะเห็นข้อผิดพลาดทั่วไปเกี่ยวกับ "no valid aps-entitlement blah blah"
jaredsinclair

66

ใน iOS 8 มีการเลิกใช้งานวิธีการบางอย่าง ทำตามขั้นตอนด้านล่างสำหรับความเข้ากันได้กับ iOS 8

1. ลงทะเบียนแจ้งเตือน

if([[UIDevice currentDevice] systemVersion].floatValue >= 8.0)
{
    UIUserNotificationSettings* notificationSettings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];    
}
else
{
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge)];
}

2. เพิ่ม 2 วิธีใหม่

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
    //register to receive notifications
    [application registerForRemoteNotifications];
}

//For interactive notification only
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
{
    //handle the actions
    if ([identifier isEqualToString:@"declineAction"]){
    }
    else if ([identifier isEqualToString:@"answerAction"]){
    }
}

หมายเหตุ: จำเป็นต้องใช้วิธีการใหม่สองวิธีข้างต้นใน iOS 8 นอกเหนือไปจากdidRegisterForRemoteNotificationsWithDeviceTokenและdidReceiveRemoteNotification.. มิฉะนั้นวิธีการมอบหมายจะไม่ถูกเรียกใช้

ดู: การแจ้งเตือนระยะไกล iOS 8


1
วิธีการใหม่ทั้งสองนี้ควรอยู่ใน Appdelegate.m หรือไม่?
Ethan Parker

- (โมฆะ) แอปพลิเคชัน: (UIApplication *) แอปพลิเคชัน didRegisterUserNotificationSettings: (UIUserNotificationSettings *) การแจ้งเตือนการตั้งค่า {// ลงทะเบียนเพื่อรับการแจ้งเตือน [application registerForRemoteNotifications]; } การเพิ่มสิ่งต่อไปนี้เป็นสิ่งที่อันตรายโทรศัพท์ของฉันขัดข้องและฉันไม่สามารถรีเซ็ตเป็นค่าเริ่มต้นจากโรงงานได้ในตอนนี้
John

นี่อาจเป็นคำตอบที่คุณกำลังมองหาหากคุณจบลงที่นี่ น่าแปลกที่วันนี้มีการเรียกผู้รับมอบสิทธิ์มาก่อนหน้านี้โดยที่ฉันไม่ได้เพิ่มหนึ่งในวิธีการเหล่านี้ ตอนนี้ดูเหมือนว่าฉันต้องการทั้งคู่
จะ

แอพของฉันขัดข้องกับบรรทัดนี้[application registerForRemoteNotifications];
smithyy

26

ในiOS 8นอกเหนือจากการร้องขอการเข้าถึงการแจ้งเตือนแบบพุชที่แตกต่างกันแล้วคุณยังต้องลงทะเบียนให้แตกต่างกันด้วย

ขอการเข้าถึง:

if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    // iOS 8
    UIUserNotificationSettings* settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
} else {
    // iOS 7 or iOS 6
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}

จัดการอุปกรณ์ที่ลงทะเบียน:

// New in iOS 8
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    [application registerForRemoteNotifications];
}

// iOS 7 or iOS 6
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    // Send token to server
}

มีประโยชน์มาก ฉันคิดไม่ออกว่าทำไมการแจ้งเตือนของฉันถึงขัดข้อง
GoldenJoe

4
ฉันจะรับโทเค็นใน iOS 8 ได้อย่างไร
Yossi

@Yossi จะถูกเก็บไว้ในตัวแปร "token" ในapplication:didRegisterForRemoteNotificationsWithDeviceToken:
Kyle Clegg

แอพของฉันขัดข้องด้วยบรรทัดนี้ [application registerForRemoteNotifications];
smithyy

13

โปรดทราบว่าเครื่องจำลองไม่รองรับการแจ้งเตือนระยะไกล ดังนั้นหากคุณเรียกใช้แอปในเครื่องจำลองระบบdidRegisterForRemoteNotificationsWithDeviceTokenจะไม่เรียก


@hochl: ฉันอัปเดตคำตอบของฉันเพื่อให้ตอบคำถามได้เฉพาะเจาะจงมากขึ้น
Eric

1
โปรดทราบว่า didFailToRegisterForRemoteNotificationsWithError จะไม่ถูกเรียกเช่นกัน ในความเป็นจริงการแจ้งเตือนจะไม่ถูกเรียกหากคุณปิดใช้งานการแจ้งเตือนแบบพุชสำหรับแอปของคุณในการตั้งค่า (ไม่ว่าจะบนอุปกรณ์หรือโปรแกรมจำลอง) Apple ไม่ถือว่านี่เป็นข้อผิดพลาดstackoverflow.com/questions/9199935/…
Zack Morris

12

ตรวจสอบให้แน่ใจว่าคุณโทรด้วยรหัสของคุณ (อัปเดตตามประเภทการแจ้งเตือนที่รองรับ)

[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];

และโปรไฟล์การจัดเตรียมเปิดใช้งาน APNS คุณอาจต้องดาวน์โหลดโปรไฟล์การจัดเตรียมใหม่อีกครั้งหลังจากเปิดใช้งาน APNS หากคุณมีปัญหาและได้รับข้อผิดพลาดบางทีคุณควรสร้าง Entitlements.plist และเพิ่มคีย์ "aps-environment" พร้อมค่า "การพัฒนา" หรือ "การผลิต" ขึ้นอยู่กับชนิดของการสร้าง (โดยปกติคู่คีย์ - ค่านี้คือ อยู่ในโปรไฟล์การจัดเตรียม แต่บางครั้ง Xcode ก็ยุ่งกับพวกเขา)


หมายเหตุ: "และโปรไฟล์การจัดเตรียมเปิดใช้งาน APNS" คลิกที่ด้านบนสุดของแผนผังโครงการ> ความสามารถ> การแจ้งเตือนแบบพุชควรตั้งค่าเป็นเปิด
trevorgrayson

6

หากมีการใช้โปรไฟล์การจัดเตรียมก่อนเพื่อเปิดใช้งานและกำหนดค่าบริการแจ้งเตือนแบบพุชของ Apple คุณจะต้องดาวน์โหลดโปรไฟล์การจัดเตรียมใหม่อีกครั้ง

ลบโปรไฟล์การจัดเตรียมจาก Xcode Organizer และจาก iPhone / iPad Settings -> General -> Profiles -> [Your provisioning] -> Removeไปที่

ติดตั้งโปรไฟล์การจัดเตรียมที่ดาวน์โหลดใหม่ จากนั้นทำความสะอาดและเรียกใช้โครงการจาก XCode ตอนนี้didRegisterForRemoteNotificationsWithDeviceTokenควรเรียกว่า.


มันได้ผลสำหรับฉัน เพียงแค่เลือกการรับรองและการจัดเตรียมที่ลงทะเบียน APN สำหรับแอป
lee

ฉันลบโปรไฟล์การจัดสรรทั้งหมดออกจาก iphone (ios9) แล้วหลังจากได้รับโทเค็นอุปกรณ์ใช้เวลาสี่ชั่วโมงในการแก้ไขปัญหานี้ (แม้ว่าฉันจะเรียนรู้มากก็ตาม) ขอบคุณ
Shobhakar Tiwari

3

ฉันทำผิดพลาดและมองข้ามรายละเอียดการใช้งานที่นำฉันมาที่นี่ ฉันพยายามสร้างความแปลกใหม่และขอให้ผู้ใช้กดการแจ้งเตือนในภายหลังในขั้นตอนการเริ่มต้นใช้งานแอปพลิเคชันดังนั้นฉันจึงมีไฟล์registerForRemoteNotificationTypes , didRegisterForRemoteNotificationsWithDeviceTokenและdidFailToRegisterForRemoteNotificationsWithErrorทั้งหมดใน UIView ที่กำหนดเอง

การแก้ไข: didRegisterForRemoteNotificationsWithDeviceTokenและdidFailToRegisterForRemoteNotificationsWithErrorจำเป็นต้องอยู่ในUIApplicationDelegate( YourAppDelegate.m) เพื่อเรียกใช้

ตอนนี้ดูเหมือนชัดเจนแล้วนะฮะ


ใช่วิธีการที่ต้องการAppDelegateที่จะอยู่ใน ไม่สามารถเชื่อว่าฉันเสียเวลาไม่กี่ชั่วโมงที่ผ่านมาของฉันในคำตอบง่ายๆนี้
แม้เฉิง

3

ตรวจสอบให้แน่ใจว่าการเชื่อมต่ออินเทอร์เน็ตของคุณเปิดอยู่ ฉันใช้เวลาหลายชั่วโมงในการรับการแจ้งเตือนงานเนื่องจากการเชื่อมต่ออินเทอร์เน็ต


3

หากคุณได้เพิ่มพุชไปยังรหัสแอปที่มีอยู่ตรวจสอบให้แน่ใจว่าคุณได้สร้างโปรไฟล์การจัดเตรียมของคุณใหม่ หากคุณไม่ทำเช่นนั้นโปรไฟล์จะไม่ทราบเกี่ยวกับการเปิดใช้งานการกดรหัสแอปของคุณ


3

ลองใช้มันได้ผลสำหรับฉัน

ขั้นแรก

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

ในวิธีการข้างต้นเพิ่มรหัสด้านล่าง

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

ขั้นตอนที่สอง

เพิ่มฟังก์ชันโค้ดด้านล่าง

 #ifdef __IPHONE_8_0
   - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
   {
  //register to receive notifications
  [application registerForRemoteNotifications];
  }

 - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
  {
    //handle the actions
    if ([identifier isEqualToString:@"declineAction"]){
    }
   else if ([identifier isEqualToString:@"answerAction"]){
   }
}
 #endif

คุณจะได้รับโทเค็นอุปกรณ์ในฟังก์ชันด้านล่าง

 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 

สำหรับคำตอบโดยละเอียดโปรดดูที่นี่

หวังว่านี่จะเป็นความช่วยเหลือสำหรับบางคน


2
-​(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. ​​​​[window​addSubview:viewController.view]; ​​​​[window​makeKeyAndVisible];
NSLog(@”Registering for push notifications...”);
 [[UIApplication sharedApplication]
registerForRemoteNotificationTypes: (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound)]; 
​​​​returnYES;
}


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


- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
}
for (id key in userInfo) { NSLog(@”key: %@, value: %@”, key, [userInfo objectForKey:key]);
}

2

ข้อกำหนดขั้นต่ำในการรับโทเค็นอุปกรณ์:

ไม่จำเป็นต้องกำหนดค่ารหัสแอปการจัดเตรียมหรือใบรับรอง ฯลฯจึงไม่มีการตั้งค่าการลงนามรหัสเพื่อรับเมธอดผู้รับมอบสิทธิ์ที่เรียกว่า didRegisterForRemoteNotificationsWithDeviceToken

ฉันเพิ่งสร้างโครงการ iOS ใหม่ใน Xcode 7 สำหรับมุมมองเดียวพร้อมการตั้งค่าเริ่มต้นและให้รหัสกลุ่มแบบสุ่มเช่น com.mycompany.pushtest ซึ่งไม่ได้กำหนดค่าในพอร์ทัล apple dev

ด้วยรหัสต่อไปนี้ฉันได้รับโทเค็นอุปกรณ์ของฉันในเมธอด didRegisterForRemoteNotificationsWithDeviceToken บน iPad ของฉันด้วยการเชื่อมต่ออินเทอร์เน็ตกับ WIFI อุปกรณ์ของฉันเชื่อมต่ออยู่และฉันเพิ่งเรียกใช้แอปโดยตรงจาก xcode และดูค่าในคอนโซลของ xcode

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions   

{  
    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)])  
    {  
        UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound);  
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil];  
        [application registerUserNotificationSettings:settings];  
        [application registerForRemoteNotifications];  
    }  
    else  
    {  
        // Register for Push Notifications, if running iOS version < 8  
        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];  
    }  
    return YES;  
}  


- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"Error: %@", error.description);
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSLog(@"didRegisterForRemoteNotificationsWithDeviceToken: %@", deviceToken);
}

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    NSLog(@"NotificationSettings: %@", notificationSettings);
}

1

ฉันมีประเด็นเกี่ยวกับเรื่องนี้เมื่อเร็ว ๆ นี้ฉันก็ประสบปัญหานี้เช่นกันฉันได้ทำทุกอย่างตามเอกสาร แต่วิธีการมอบหมายไม่ได้โทรมาในที่สุดฉันเห็นโพสต์หนึ่งบอกว่ามีปัญหากับเครือข่ายจากนั้นฉันเปลี่ยนเครือข่ายและใช้งานได้ดี ดังนั้นโปรดดูแลเกี่ยวกับเครือข่ายด้วยเพราะมีเครือข่ายเพียงไม่กี่แห่งที่สามารถบล็อก APNS ได้


1

หลังจากเสียเวลา 3 ชั่วโมงที่น่ารำคาญที่สุดแล้วนี่คือขั้นตอนในการแก้ไขปัญหา:

  1. ลบแอพ

  2. รีเซ็ตอุปกรณ์

  3. เรียกใช้อีกครั้ง

มันได้ผล


0

สิ่งนี้เกิดขึ้นกับฉันเพราะฉันรีเซ็ตและลบข้อมูลทั้งหมดในโทรศัพท์ (ต้องการให้โทรศัพท์ dev ใช้) สิ่งนี้ทำให้ APN ไม่สามารถเชื่อมต่อได้เลยหลังจากตั้งค่าโทรศัพท์อีกครั้ง

ฉันลองทำทุกอย่างแล้ว แต่สิ่งเดียวที่แก้ไขได้คือการตั้งค่าโทรศัพท์ให้ทำงานกับผู้ให้บริการภายใต้ซิมการ์ดใหม่

ลิงก์นี้มีคำแนะนำเพิ่มเติมเกี่ยวกับสิ่งที่อาจเกิดขึ้น: https://developer.apple.com/library/ios/technotes/tn2265/_index.html

มันบอกว่า APN พยายามเชื่อมต่อเป็นพิเศษผ่านผู้ให้บริการ / อาคารซึ่งต่างจาก wifi บางทีปัญหาอาจเกิดขึ้นกับเราเตอร์ที่บล็อกพอร์ต 5223 บนเครือข่าย wifi แต่ฉันสงสัยว่ามันทำงานได้ดีในวันก่อนหน้าก่อนที่การรีเซ็ตทั่วโลกจะเกิดขึ้น


0

สำหรับฉันสิ่งที่แก้ไขได้คือไปที่การตั้งค่าการสร้างและในส่วนการลงนามรหัสการเลือกรหัสประจำตัวการเซ็นชื่อและโปรไฟล์การจัดเตรียม เห็นได้ชัดว่าการตั้งค่าอัตโนมัติไม่ได้รับการตั้งค่าที่ถูกต้องดังนั้นแอปจึงไม่ได้รับอนุญาตอย่างถูกต้อง


0

หากปิดข้อความพุชของแอพ

appdidRegisterForRemoteNotificationsWithDeviceToken จะไม่ถูกเรียก


0

นอกจากนี้อย่าลืมตรวจสอบสถานะของระบบที่แอปเปิ้https://developer.apple.com/system-status/

ฉันลองใช้วิธีแก้ปัญหาทั้งหมดที่โพสต์ไว้ข้างต้น แต่ในที่สุดความผิดพลาดก็เป็นเพราะบริการ APNS หยุดทำงาน! วันรุ่งขึ้นทั้งหมดทำงานอีกครั้งตามที่คาดไว้

นอกจากนี้คุณยังพิมพ์ผิดในวิธีการโทรกลับของคุณ:

- (void)application:(UIApplication *)appdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

ดังที่ Rupesh ชี้ให้เห็นชื่อวิธีการที่ถูกต้องคือ:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

นั่นอาจเป็นสาเหตุที่คุณไม่เคยได้รับโทเค็นในกรณีของคุณ!


ชื่อเมธอดจริงไม่ถูกต้องควรเป็น - (โมฆะ) แอปพลิเคชัน: (UIApplication *) แอปพลิเคชัน didRegisterForRemoteNotificationsWithDeviceToken: (NSData *) deviceToken มีช่องว่างระหว่างถึงพารามิเตอร์
Rupesh

ขอบคุณได้อัปเดตคำตอบเพื่อรวมความคิดเห็นของคุณ ค่อนข้างแน่ใจว่านี่เป็นวิธีแก้ปัญหา OPs แต่เราอาจไม่เคยพบ!
Brett

0

คุณต้องเรียกเมธอด registerForNotifications จาก didFinishLaunchingWithOptions

 func registerForNotifications(){

        if #available(iOS 10.0, *) {

            let center = UNUserNotificationCenter.current()
            center.delegate = self
            center.requestAuthorization(options:[.alert,.sound,.badge]) { (granted, error) in
                if granted{
                    UIApplication.shared.registerForRemoteNotifications()
                }else{

                    print("Notification permission denied.")

                }
            }

        } else {

            // For iOS 9 and Below
            let type: UIUserNotificationType = [.alert,.sound,.badge];
            let setting = UIUserNotificationSettings(types: type, categories: nil);
            UIApplication.shared.registerUserNotificationSettings(setting);
            UIApplication.shared.registerForRemoteNotifications()
        }
    }

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

        let token = String(format: "%@", deviceToken as CVarArg).trimmingCharacters(in: CharacterSet(charactersIn: "<>")).replacingOccurrences(of: " ", with: "")
        print(token)

    }


extension AppDelegate : UNUserNotificationCenterDelegate{

    @available(iOS 10.0, *)

    func userNotificationCenter(_ center: UNUserNotificationCenter,  willPresent notification: UNNotification, withCompletionHandler   completionHandler: @escaping (_ options:   UNNotificationPresentationOptions) -> Void) {
        print("Handle push from foreground”)

        let info = ((notification.request.content.userInfo as NSDictionary).value(forKey: "aps") as! NSDictionary)
        if let type = info.value(forKey: "type") as? Int{
            if type == 0 {  

         // notification received ,Handle your notification here

            }
        }
    }

    @available(iOS 10.0, *)

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

        print("Handle push from background or closed")

        let info = ((response.notification.request.content.userInfo as NSDictionary).value(forKey: "aps") as! NSDictionary)
        if let type = info.value(forKey: "type") as? Int{
            if type == 0 {   

            // notification received ,Handle your notification here
            }
        }
    }
}

0

ฉันมีปัญหาอื่นที่การโทรกลับการแจ้งเตือนแบบพุชของฉันถูกแย่งชิงโดยไลบรารีบุคคลที่สามที่ฉันรวมไว้คือ Firebase ไลบรารีเหล่านี้สลับวิธีการโทรกลับการแจ้งเตือนแบบพุชเพื่อรับการโทรกลับ

หวังว่านี่จะช่วยใครบางคนได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.