ios application:didReceiveRemoteNotification:fetchCompletionHandler未调用

vdzxcuhz  于 2023-05-30  发布在  iOS
关注(0)|答案(8)|浏览(552)

当应用程序被强制退出时,似乎没有调用函数application:didReceiveRemoteNotification:fetchCompletionHandler。我的印象是,无论应用程序处于什么状态,都会调用该函数,但似乎只有在应用程序已经在后台运行时才会调用该函数。如果应用程序尚未使用新的iOS 7远程通知后台模式运行,是否有方法在后台唤醒该应用程序?

knsnq2tg

knsnq2tg1#

application:didReceiveRemoteNotification:fetchCompletionHandler:会被调用,即使应用程序被挂起、根本没有运行、后台运行或处于活动状态。值得注意的是,该方法仅适用于iOS 7。这是苹果的文档。

但是,如果应用程序被强制关闭(即(参见SO answer)* 编辑:* 我在iOS 7.1上再次检查了这个问题,看看他们是否修复了这个问题,但仍然是这样,如果应用程序被手动杀死,应用程序将不会被唤醒,application:didReceiveRemoteNotification:fetchCompletionHandler:将不会被调用

当接收到推送时,应用仅在“需要时”被唤醒以调用application:didReceiveRemoteNotification:fetchCompletionHandler:方法(即,您必须在推送通知有效载荷内设置“内容可用”标志。参见SO answer)。如果用户随后通过点击通知打开应用程序,则该方法将被调用 again
编辑:没有在iOS 8上检查过这个。其他人呢?

sirbozc5

sirbozc52#

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

    //Remote Notification Info
    NSDictionary * remoteNotifiInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];

    //Accept push notification when app is not open
    if (remoteNotifiInfo) {
       [self application:application didReceiveRemoteNotification: remoteNotifiInfo];
    }

    return YES;
}
r7xajy2e

r7xajy2e3#

即使应用程序没有运行,也应该启动它。Apple文档说:
当此值存在并且推送通知到达设备时,系统将通知发送到您的应用(在需要时启动它),并在向用户显示任何内容之前给它一些时间来处理>通知。(iOS应用程序编程指南)
当推送通知到达时,系统向用户显示通知,并在后台启动应用(如果需要),以便它可以调用此方法。(UIApplicationDelegate协议参考)
与应用程序didReceiveRemoteNotification不同:方法,该方法仅在应用运行时调用,无论应用的状态如何,系统都会调用此方法。如果您的应用处于挂起或未运行状态,系统会唤醒或启动您的应用,并将其置于后台运行状态,然后再调用该方法。(UIApplicationDelegate协议参考)
然而,当使用“content-available”:1 pushes测试时,应用程序在不运行时永远不会启动。当应用程序被暂停时,它可以工作。
你找到解决办法了吗韦斯

kxeu7u2r

kxeu7u2r4#

当您的应用被强制退出时,不会调用该方法。相反,像往常一样,调用(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
如果应用程序是通过点击通知弹出窗口中的“打开”打开的,则通知位于launchOptions内。
获取推送通知字典,如下所示:

NSDictionary * pushNotificationUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if (pushNotificationUserInfo)
{
  // call your handler here
}
2nbm6dog

2nbm6dog5#

正如Apple所记录的那样,新的多任务API(获取和远程通知)仅在应用处于暂停/后台/前台状态时才能工作。

  • 后台/前台状态下,则会触发application:didReceiveRemoteNotification:fetchCompletionHandler
  • Suspended状态下,则会触发-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  • Not Running状态下(您的情况),application:didReceiveRemoteNotification:fetchCompletionHandler永远不会被触发。

有关应用程序状态的更多信息,请参阅Apple文档。

iqjalb3h

iqjalb3h6#

如果您从应用程序切换器强制退出应用程序,则它将不会在后台被唤醒(通过任何方式),直到下一次启动它。当您强制退出应用程序时,您实际上是在向操作系统表示您根本不希望此应用程序运行,即使后台事件通常会唤醒它。
这在测试过程中值得注意,因为您可能会强制退出应用程序,以便检查它是否在应用程序未运行时通过推送通知启动。事实上,你使用武力退出将是原因 * 为什么 * 它不得到启动。

oxosxuxt

oxosxuxt7#

在Swift2.0中,我已经解决了我的问题,就像这样作为背景

if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary {

    pushNotificationAction(remoteNotification as [NSObject : AnyObject])
}
vlju58qv

vlju58qv8#

我最近遇到了同样的问题,我发现苹果更新了他们的文档并说:
但是,如果用户强制退出应用,系统不会自动启动应用。在这种情况下,用户必须重新启动您的应用或重新启动设备,系统才会尝试再次自动启动您的应用。
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
所以我猜当应用程序被强制退出时,没有办法做任何事情?

相关问题