iOS新闻亭:推送通知无法在后台启动应用程序

4
我正在一个应用程序中实现新闻亭功能,虽然应用程序接收到推送通知,但它没有在后台模式下启动。
如果我点击通知警报,则应用程序会启动,我可以看到字典中存在"content-available":1,并且该问题已下载,但应用程序不会自动启动。

我已经添加到plist中:

<key>UIBackgroundModes</key>
<array>
    <string>newsstand-content</string>
</array>

并在didFinishLaunchingWithOptions方法中:

[[NSUserDefaults standardUserDefaults]setBool: YES forKey:@"NKDontThrottleNewsstandContentNotifications"]; // for testing purposes
    [[NSUserDefaults standardUserDefaults] synchronize];

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeNewsstandContentAvailability )];

我发现我的应用程序未显示在“设置” -> “商店” -> “自动下载”下(而其他杂志则出现在那里)。
我有什么遗漏的吗?这在沙盒环境中是否有效?
5个回答

2

一些澄清

  1. 如果你在Newsstand的负载中只发送了content-available:1而没有发送"alert",那么通知中心将不会添加任何内容。
  2. Newsstand通知启动应用程序并不意味着应用程序将进入前台(就像用户点击应用程序图标一样)。这只是意味着如果应用程序不在后台,它将由iOS在后台启动 -> didFinishLaunchingWithOptions调用appDelegate,应用程序应该检查是否是Newsstand通知,并通过将资源添加到Newsstand队列来安排下载。资源路径可以是NS负载的一部分(提供 < payload limit 256 bytes)

NSDictionary *payload = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if(payload && [[payload objectForKey:kContentAvailablePush] caseInsensitiveCompare:@"1"] == NSOrderedSame) { NSLog(@"由于NS通知启动"); }


我理解,这就是我遇到的问题。当推送接收时,应用程序没有在后台启动。 - Damian
1
那么在这种情况下,我不确定您那边的问题是什么。为了消除您的疑问,是的,在沙盒环境中它可以工作。 - msk
+1. alert关键字是必须的,以便将通知添加到托盘。需要一个消息字符串来显示内容!如果答案中提供了苹果文档链接会更好。 - tipycalFlow

1

为了在“设置”中出现并接收“新闻推送”通知,您需要注册新闻亭通知。要注册,请将以下内容添加到您的application:didFinishLaunchingWithOptions:中:

// Add registration for newsstand notifications
// In your application:didFinishLaunchingWithOptions:

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
  UIRemoteNotificationTypeNewsstandContentAvailability];

用户将被要求接受后台下载或不接受。
查看这个关于报刊应用的非常完整的教程:http://www.viggiosoft.com/blog/blog/2011/10/17/ios-newsstand-tutorial/

0
请确保在您的plist文件中设置了UINewsstandApp = YES。

0

{"aps": {"badge": 1, "alert": "测试","content-available":1}} 这是一个正确的有效载荷。 {"aps": {"badge": 1, "alert": "测试"},"content-available":1} 这是一个错误的有效载荷。


谢谢,这个怎么样?它正确吗? AnyHashable(“aps”):{ alert = { body =“* Mi note 4创建组Kik *”; title =“Mi note 4”; }; badge = 23; “content-available”= 1; } - Gopik

-1

当负载中包含 content-available 时,会发生以下情况:

  • 如果应用程序处于暂停状态,则系统将其带入后台
  • 如果用户已经杀死了应用程序,则不会发生任何事情,应用程序仍然处于未运行状态

必须有用户操作才能启动应用程序,基本上是通过将警报消息添加到推送通知中。

来源

http://samwize.com/2015/08/07/how-to-handle-remote-notification-with-background-mode-enabled/

然而这并不能解决你的问题。作为解决方法,你可以使用后台获取(background fetch),它会在一定时间间隔内唤醒应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接