0

我正在构建一个Newsstand应用程序,我想在后台下载最新一期。我设置了适当的后台模式键以允许这样做。

我将有效负载推送到我的应用程序,例如:

{"aps": {"badge": 1,"content-available":"1"}}

但是如果我的应用程序不在前台,我怎么知道推送通知已发送,以便我可以开始后台下载?如果应用程序在前台,我会使用didReceiveRemoteNotification:但对当应用程序不在前台或什至没有运行时该怎么做感到困惑。

根据文档:

如果在传递通知时应用程序未在前台运行,则会在后台激活(或在必要时启动到后台)以下载问题资产。否则,您将像处理任何推送通知一样处理通知。有关如何发送和处理推送通知的信息,请参阅本地和推送通知编程指南。

客户端应用程序与其服务器通信并获取定位问题资产的 URL 以进行下载。它可能还需要从服务器获取问题的名称和日期。在此阶段,它还可能验证用户是否有资格订阅或执行任何其他所需的授权。

但它从未说明使用哪种方法开始下载。

4

2 回答 2

2

只有当用户启动应用程序以响应推送通知(例如,在锁定屏幕上或从通知中心滑动),或者它已经在运行时,您的应用程序才会收到推送通知。此外,不保证会发送推送通知。

更新:

正如您所提到的,对于 Newstand 应用程序,您应该使用该UIRemoteNotificationTypeNewsstandContentAvailability权限来启用新问题的后台下载。然而,这并非没有它自己的一系列技术挑战:

“...您的应用可能每 24 小时仅启动一次后台下载。iOS 将忽略尝试在 24 小时内多次启动后台下载的通知。”

用户可以禁用后台下载吗?

是的,用户可以在“设置”中针对每个应用禁用报亭的推送通知启动的后台下载。您可以通过在 UIApplication 的 enabledRemoteNotificationTypes 属性返回的启用类型集中查找 UIRemoteNotificationTypeNewsstandContentAvailability 来确定您的应用是否已禁用后台下载。

来自:http: //developer.apple.com/library/ios/#technotes/tn2280/_index.html

完全有可能在您的测试期间,您全天发送了太多的内容更新。

于 2012-12-19T20:52:06.327 回答
1

“只有当用户启动应用程序以响应推送通知(例如,在锁定屏幕上或从通知中心滑动),或者它已经在运行时,您的应用程序才会收到推送通知。”

如果报刊亭通知(在有效负载中有 content-available:1),上述声明是不正确的。收到它后,iOS 在后台启动应用程序(如果未运行)并调用应用程序委托的 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];
于 2012-12-20T19:38:14.160 回答