49

我关注了这个线程,但didRegisterForRemoteNotificationsWithDeviceToken仍然没有调用该方法:

文档说:

调用 UIApplication 对象的 registerForRemoteNotifications 方法后,设备注册成功时应用调用该方法

didRegisterUser看起来不错,但不是did register notif

这是我在 AppDelegate 中的代码(应用程序版本为 8.1):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //register notif
    UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert |
                                                    UIUserNotificationTypeBadge |
                                                    UIUserNotificationTypeSound);
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil];
    [application registerUserNotificationSettings:settings];


    return YES;
}

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

-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    NSLog(@"error here : %@", error);//not called
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    /*
    // Store the deviceToken in the current installation and save it to Parse.
    PFInstallation *currentInstallation = [PFInstallation currentInstallation];
    [currentInstallation setDeviceTokenFromData:deviceToken];
    currentInstallation.channels = @[ @"global" ];
    [currentInstallation saveInBackground];
     */
    NSLog(@"did register notif");//not called
}

我在 info.plist 中也有后台模式 -> 远程通知。

4

19 回答 19

31

经过长时间的挖掘,我发现在2016 年 7 月 19 日,由于苹果端的一些错误或更新,即使 Internet 连接、设备和使用的方法等每个条件都完美,也不会调用 didRegisterForRemoteNotificationsWithDeviceToken 方法。

请参阅此链接进行确认https://forums.developer.apple.com/thread/52224

要验证,请查看您的其他应用程序。我浪费了几个小时,但希望它对某人有所帮助。谢谢。

于 2016-07-19T09:44:53.273 回答
28

2016 年 7 月 19 日:-

根据Apple Developer form,存在关于Sandbox APNS向下的问题。所以苹果方面可能存在问题,这就是代表喜欢application:didRegisterForRemoteNotificationsWithDeviceToken:而不application:didFailToRegisterForRemoteNotificationsWithError:被调用的原因。

要检查 APNS 沙盒的当前状态,请点击此链接... 根据状态,现在 APNS 沙盒工作正常,一切正常。所以也许苹果方面还有其他一些错误

因此,如果您的方法完美且证书有效,请不要担心。这只是 Apple 方面的一个问题,一旦问题解决,您的方法就会完美运行(如果您这边一切正常)。

请注意,生产工作正常,问题与沙盒 APNS 有关。

于 2016-07-19T10:50:39.280 回答
24

我遇到了这个问题,最后在 Apple Developer 网站上找到了注释并解决了这个问题:

注册、调度和处理用户通知

iOS 注意部分:“注册远程通知:

iOS 注意:如果蜂窝或 Wi-Fi 连接不可用,则不会调用 application:didRegisterForRemoteNotificationsWithDeviceToken: 方法和 application:didFailToRegisterForRemoteNotificationsWithError: 方法。对于 Wi-Fi 连接,当设备无法通过端口 5223 与 APNs 连接时,有时会发生这种情况。如果发生这种情况,用户可以移动到没有阻止此端口的另一个 Wi-Fi 网络,或者在 iPhone 或 iPad 上,等待直到蜂窝数据服务可用。在任何一种情况下,设备都应该能够建立连接,然后调用其中一个委托方法。

我的 iPhone 只连接了 Wifi,重启 iPhone 并重新连接到 WiFi AP 解决了这个问题。

于 2015-12-17T10:18:55.600 回答
21

您的代码似乎是正确的。作为一个小的改进,你可以像这样编写你的 didRegisterUserNotificationSettings 方法:

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    if (notificationSettings.types != UIUserNotificationTypeNone) {
        NSLog(@"didRegisterUser");
        [application registerForRemoteNotifications];
    }
}

可能存在导致 APN 注册失败的配置问题。

  1. 确保您的配置文件包含 aps-environment 条目

  2. 确保您在配置文件中设置了唯一的应用程序标识符(一个没有任何“*”的字符串)。您还应该在 Info.plist 中将此确切标识符用作“捆绑标识符”

  3. 也许您在初始安装后拒绝了推送功能 - 在这种情况下,您将永远不会再次看到应用内推送警报,并且必须再次在设置应用中启用推送。

  4. 尝试其他设备。

于 2015-01-25T13:41:23.120 回答
20

对于IOS 13

didRegisterForRemoteNotificationsWithDeviceToken我连接到我的 wifi 网络时,它根本没有触发。我尝试了很多来解决这个问题,但不能。最后,我将网络从 wifi 更改为蜂窝数据,突然它又开始工作了。我什至改回旧的 wifi 网络,它没有问题。

此外,如果您使用 MAC 中的 Internet 连接使用 USB 进行共享。将其关闭并将您的 iPhone 与普通的 wifi 或移动数据连接。

于 2019-12-03T12:19:45.067 回答
17

XCode 8.3.1 以上

在尝试了以上所有选项后,如果仍然没有调用委托方法,请确保在项目中,

under 'Capabilities', (next to General), 
 - Push Notifications option is turned ON`
- and under Background Modes, Remote Notifications is turned ON
于 2017-10-11T09:28:15.037 回答
11

好的,伙计们,我已经连续花了 11 个小时调试这个东西,所以希望这个答案会对某人有所帮助。

如果您在类似的线程中正确设置了所有内容并集成了 Google Firebase 分析,并且仍然没有调用didRegisterForRemoteNotificationsWithDeviceToken 方法,这可能是因为默认情况下它在 Google Firebase 中被混用了。由于某些奇怪的原因,FIR 在将您的令牌发送给 Google 后不会返回到原始方法。修复它设置

    FirebaseAppDelegateProxyEnabled to NO (BOOL)

在您的 Info.plist 中。

于 2018-07-25T12:11:37.730 回答
8

在让自己发疯之前:

  • 首先尝试重新启动您的设备

尤其是在从生产环境转移到开发 APNS 环境之后,反之亦然。

于 2020-01-22T16:17:24.827 回答
7

就我而言,发生这种情况是因为我通过 Charles 代理所有设备流量。删除它修复了它,并给了我 didRegister 回调。

于 2018-09-26T03:08:13.577 回答
6

真丢人!!O忘记了最基本的步骤:

在此处输入图像描述

遵循此处的所有证书处理说明后:https ://www.pluralsight.com/guides/swift/creating-ios-rich-push-notifications

发送推送通知的工具是:https ://github.com/noodlewerk/NWPusher

愿原力与你同在!

于 2017-11-22T07:17:45.720 回答
4

对我来说,它是在模拟器上运行应用程序。没有为模拟器生成推送令牌,所以我输入didFailToRegisterForRemoteNotificationsWithError的是didRegisterForRemoteNotificationsWithDeviceToken

于 2019-01-08T08:23:56.523 回答
4

奇怪的解决方案,但它对我有用。尝试了几个小时后,我只是从设备设置应用程序中关闭并打开了 wifi,它就可以工作了。

于 2020-02-24T08:32:13.647 回答
2

就我而言,我相信在 iOS 9.3 之后。如果我使用 Localytics,didRegisterForRemoteNotificationsWithDeviceToken将不会被调用。我必须从我的代码中删除它(在ApplicationDidFinishLaunchingWithOption

[Localytics autoIntegrate:@"xxxxx" launchOptions:launchOptions];
于 2016-07-03T11:23:12.467 回答
2

在 Xcode 12 上,第一次将推送通知添加到应用程序时,您可能必须这样做:

  • 转到项目 -> YourTarget -> 签名和功能

在该屏幕上,点击左上角的“+能力”按钮(很难注意到)

在此处输入图像描述

功能“库”将打开:

在此处输入图像描述

选择并添加推送通知:

在此处输入图像描述

您可能还需要检查后台模式上的“远程通知”框。

在此处输入图像描述

最后,像其他人提到的那样,确保您的开发和分发配置文件是最新的,并在功能列表中包含“推送通知”。

在此处输入图像描述

于 2020-08-21T20:56:22.667 回答
1

请添加以下代码,它对我有用,

 #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 

详细请参考详细回答

希望这对某人有帮助。

于 2017-01-02T12:30:12.347 回答
1

我解决了这个问题以连接蜂窝模式。

我只测试了两部 iPhone 连接的蜂窝网络、一部 iPhone 和一部 iPad 连接的 Wi-Fi。

有时连接wifi的设备可以工作,但有时却不行。连接蜂窝后效果很好。

苹果官方文档

于 2020-03-27T14:33:13.110 回答
0

我不确定,只是一种预感。这发生在我身上几次。我正在启动该应用程序,然后立即将其置于后台!

解决方法是让应用程序在前台运行一段时间,直到您收到回调。

于 2020-03-04T14:57:55.483 回答
0

您可能需要 SIM 卡才能激活您的 iPhone,否则您将永远不会收到通知回电。

于 2020-05-20T11:20:09.660 回答
0

就我而言,配置文件无效。重新启用配置文件解决了问题

于 2020-06-17T15:48:07.483 回答