我正在构建一个Newsstand
应用,我想在后台下载最新的问题。我有适当的背景模式键设置允许这个。
我将有效负载推送到我的应用程序,例如:
{"aps": {"badge": 1,"content-available":"1"}}
但如果我的应用程序不在前台,我怎么知道推送通知已发送,以便我可以开始后台下载?如果应用程序位于前台,我使用didReceiveRemoteNotification:
,但对应用程序不在前台或甚至没有运行时该怎么做感到困惑。
根据文件:
如果应用程序没有在前台运行时 通知已发送,它在后台激活(或 如有必要,启动后台下载问题资产。 否则,您可以按任意方式处理通知 通知。请参阅本地和推送通知编程指南 有关如何发送和处理推送通知的信息。
客户端应用程序与其服务器通信并获取URL 找到要下载的问题资产。它可能还需要获得 来自服务器的问题的名称和日期。在这个阶段它可能会 还验证用户是否有资格进行订阅或执行 任何其他所需的授权。
但它从未说过使用哪种方法来开始下载。
答案 0 :(得分:2)
如果用户响应推送通知启动应用程序(例如,在锁定屏幕或通知中心滑动它),或者它已在运行,则应用程序将仅接收推送通知。此外,无法保证推送通知。
更新
正如您所提到的,对于Newstand应用,您应该使用UIRemoteNotificationTypeNewsstandContentAvailability
权限来启用新问题的后台下载。然而,这并非没有它自己的一系列技术挑战:
“...您的应用只能每24小时启动一次后台下载 小时。 iOS将忽略尝试启动后台的通知 在24小时内下载不止一次。“
和
用户可以停用后台下载吗?
是的,用户可以在a上禁用Newsstand的推送通知启动的后台下载 “设置”中的每个应用基础。您可以确定是否背景 通过查找已禁用您的应用程序的下载 UIRemoteNotificationTypeNewsstandContentAvailability集合中的 UIApplication返回的已启用类型 enabledRemoteNotificationTypes属性。
来自:http://developer.apple.com/library/ios/#technotes/tn2280/_index.html
在测试过程中,您可能会在一天内发送过多内容更新。
答案 1 :(得分:1)
“如果用户启动,您的应用只会收到推送通知 应用程序响应推送通知(例如,将其滑动到 锁定屏幕或来自通知中心),或者它已经是 运行“。
如果报亭通知(内容可用:1在有效负载中),则上述声明不正确。收到它后,iOS在后台启动应用程序(如果没有运行),并调用app delegate的didFinishLaunchingWithOptions方法。您可以检查启动选项字典的UIApplicationLaunchOptionsRemoteNotificationKey的值,以检查是否通过通知启动了应用程序。
NSDictionary *payload = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(payload && [[payload objectForKey:kContentAvailablePush] caseInsensitiveCompare:@"1"] == NSOrderedSame)
{
NSLog(@"app launched by Newsstand Remote notification. payload %@", payload);
[self scheduleNewsStandDownload:payload];
}
在方法scheduleNewsStandDownload中,您可以简单地获取托管内容的路径/日期等,并将其添加到报亭队列中。下面是伪代码。
NKLibrary *nkLib = [NKLibrary sharedLibrary];
NKIssue *nkIssue = [nkLib issueWithName:<your content id>];
if(!nkIssue)
nkIssue = [nkLib addIssueWithName:<your content id> date:<your content date>];
NKAssetDownload *nkAssetDownloadGridCover = [nkIssue addAssetWithRequest:<urlRequest for the content>];
[nkAssetDownloadGridCover downloadWithDelegate:self];