注册远程通知在 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 中不起作用