报亭套件推送通知,而不使用应用程序如何获取用户信息

时间:2012-12-19 20:47:16

标签: objective-c ios push-notification newsstand-kit

我正在构建一个Newsstand应用,我想在后台下载最新的问题。我有适当的背景模式键设置允许这个。

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

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

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

根据文件:

  

如果应用程序没有在前台运行时   通知已发送,它在后台激活(或   如有必要,启动后台下载问题资产。   否则,您可以按任意方式处理通知   通知。请参阅本地和推送通知编程指南   有关如何发送和处理推送通知的信息。

     

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

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

2 个答案:

答案 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];