我正在尝试将以下有效负载从 PHP Server 传递到 APNS。
$body['aps'] = array(
'badge' => 1,
'ArmyGroupID' => 12345
);
当应用程序在前台时,我得到了整个字典,这没问题。
问题:
但是当应用程序在后台时,它成功地附加了徽章,但是当我点击图标时,消息没有发送到 didReceiveRemoteNotification。
我是否以正确的方式做这件事?
我正在尝试将以下有效负载从 PHP Server 传递到 APNS。
$body['aps'] = array(
'badge' => 1,
'ArmyGroupID' => 12345
);
当应用程序在前台时,我得到了整个字典,这没问题。
问题:
但是当应用程序在后台时,它成功地附加了徽章,但是当我点击图标时,消息没有发送到 didReceiveRemoteNotification。
我是否以正确的方式做这件事?
这是预期的行为。请参阅 Apple 文档中的以下片段:
作为呈现通知的结果,用户点击警报的操作按钮或点击(或点击)应用程序图标。如果点击操作按钮(在运行 iOS 的设备上),系统将启动应用程序并且应用程序调用其委托的 application:didFinishLaunchingWithOptions: 方法(如果已实现);它传入通知负载(用于远程通知)或本地通知对象(用于本地通知)。 如果在运行 iOS 的设备上点击应用程序图标,应用程序会调用相同的方法,但不会提供有关通知的信息。如果在运行 OS X 的计算机上单击应用程序图标,应用程序将调用委托的 applicationDidFinishLaunching: 方法,委托可以在该方法中获取远程通知负载。
作为一种解决方法,我可以建议对 didFinishLaunchingWithOptions 进行一些检查,如下所示:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Get user info dict
NSDictionary* userInfo = [launchOptions valueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
if([UIApplication sharedApplication].applicationIconBadgeNumber >0 && userInfo == nil){
//Do like you did in didRecieveRemoteNotification method
}
return YES;
}
在 swift2 中:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
}