注册远程通知在 Xcode 6 中不起作用

Posted

技术标签:

【中文标题】注册远程通知在 Xcode 6 中不起作用【英文标题】:Register for remote notification not working in Xcode 6 【发布时间】:2014-10-31 04:12:24 【问题描述】:

我在 Xcode 6 中编写了以下代码:

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

    // Override point for customization after application launch.

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

    return YES;

我在以下两种方法中设置断点:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
    //Registration successful


- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error

    //Registration failed

但是当我在运行 ios 8 的设备上进行测试时,这两种方法从未触发过。我也尝试了 iOS 7,但仍然没有成功。所以我认为这可能是我的配置文件有问题。因此,为了确认,我打开了开发人员帐户,在应用程序 ID 中我确认启用了 APNS,撤销了现有证书,为推送通知和开发创建了一个新的开发证书。从密钥链中删除旧证书。从 Xcode 清除所有配置文件,将新创建的证书添加到钥匙串中,使用新创建的证书创建开发配置文件,将其添加到 Xcode 并使用新创建的配置文件再次在两台设备上运行我的应用程序。还是没有结果。然后我在Xcode 5中打开项目,改didFinishLaunching方法如图:

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

    // Override point for customization after application launch.

    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];

    return YES;

并使用我刚刚创建的相同配置文件在两台设备上运行该应用程序。它运行良好,- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 中的断点被击中。在我使用 Xcode 5 编译时,仅使用 UIRemoteNotificationType 在 iOS 7 和 iOS 8 上都成功注册了远程通知!!!

所以我将申请存档并提交给 iTune connect 的试飞。我第一次从 iTunes Connect 收到这封邮件:

缺少推送通知权利 - 您的应用似乎包含 用于向 Apple Push Notification 服务注册的 API,但 应用签名的权利不包括“aps-environment” 权利。如果您的应用使用 Apple Push Notification 服务, 确保您的 App ID 在 配置门户,并在使用 包含“aps-environment”的分发配置文件 权利。参见本地和推送中的“配置与开发” 通知编程指南了解更多信息。如果你的应用有 不使用 Apple 推送通知服务,无需任何操作。 您可以从以后的提交中删除 API 以停止此警告。 如果您使用第三方框架,您可能需要联系 开发者获取有关删除 API 的信息。

所以我重新创建了生产APNS证书,生产证书,删除旧证书后将它们添加到钥匙串,使用新创建的生产证书为App Store创建分发配置文件,将其添加到Xcode,存档并再次提交试飞.这次邮件没有来,但是两个 Remote Notification Delegate 方法也没有触发(我已经放置了一个 AlertView 来知道其中一个方法何时被触发)。

谁能告诉我这种奇怪行为的原因?我在这里做错了什么?我该如何纠正它?

【问题讨论】:

【参考方案1】:

好的。我自己终于找到了解决方案。如果是 IOS 8,我必须添加以下行:

[[UIApplication sharedApplication] registerForRemoteNotifications];

所以didFinishLaunchingWithOptions 的代码如下所示:

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

    // Override point for customization after application launch.

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

    return YES;

奇怪的是我在 else 条件下没有改变任何东西,但现在它适用于 IOS 7 和 IOS 8。希望它对某人有所帮助。我已经花了两天多的时间,当我在发布问题后立即自己找到解决方案时,我讨厌它。

【讨论】:

我认为将该行添加到 didRegisterUserNotificationSettings 回调中是个好主意:***.com/questions/24216632/remote-notification-ios-8

以上是关于注册远程通知在 Xcode 6 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

推送通知在 TestFlight 中不起作用,但在 Xcode 中起作用

Flutter 背景 iOS 通知在 XCode 或 TestFlight 中不起作用

注册远程通知失败

iOS Firebase 推送通知在 Xcode 11.5 和 iOS 13 的模拟器上不起作用

为啥远程推送通知在 iOS 10 上不起作用?

IOS 远程通知在 IOS 8 的后台不起作用