iOS推送服务:是一个不可见的推送通知可能吗?

我正在构build一个依赖在线数据库的数据的iPhone应用程序。

要更新应用程序中的数据,我可以在一定的时间间隔检查是否需要更新,但是如果我可以使用推送服务向应用程序发送通知,让它知道是时候进行更新,那么这种方式会更酷。

我不是在这里说可见的推送通知,只是一个无形的推送通知来触发我的应用程序的更新方法。

有没有一个标准的方式来做到这一点,或者我可以使用苹果的推送通知服务为此目的?

换句话说:我现在正在使用pull获取更新,有没有一种方法让我的应用程序的后端知道是时候进行更新了?

编辑:如果这是不可能的,更新的好时间间隔(0.03 kb,如果没有更新)。 是否每30秒检查一次?

苹果在线图书馆有一个很好的解释文档。

使用Apple推送通知服务(APNS),您可以获得以下任意组合:

  • 要显示给用户的警报消息
  • 一个数字来标记应用程序图标
  • 一个声音玩

当我说任何我的意思是没有戒备,没有徽章,也没有声音也是可能的。 即使应用程序closures(但至less执行一次,用于注册通知服务),远程通知仍可用,iOS有pipe理推动和唤醒您的应用程序的债务。

如果你想使用APNS,你需要

  • 一个Web服务器(将生成推送)
  • 来自Web服务器的CSR
  • 一个信任你的服务器的苹果证书(这是CSR的原因)
  • 具有为通知configuration的应用程序ID的iOS应用程序

所有与CSR相关的信息都在iOSconfiguration门户“应用程序ID”部分的“如何”选项卡中详细介绍。 试试这个链接 。

在您的networking服务器必须托pipe的APNS提供商谁将会做这两个动作:

  • 在具体的iOS设备上注册标识具体安装的令牌。 该令牌是为Apple APNS生成的,并将由您的应用发送给提供商。 在这里输入图像说明

  • 生成推送通知:将从您的提供商发送到Apple APNS,Apple APNS将传送到您的应用程序(带有警报和/或徽章和/或声音和/或静音模式) 在这里输入图像说明

APNS通知将通过远程通知系统传送到您的应用程序。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 

您可以查看Easy APNS App Delegate

作为一个提供商,你可以使用自己开发的,或者你可以使用/修改已经下载的任何人

  • 简单的APNS
  • Java APNS
  • Javapns
  • 等等

所以答案是肯定的,这是可能的。 使用Easy APNS示例 ,推送生成必须如下所示:

 $apns->newMessage(1); $apns->addMessageCustom('acme2', array('bang', 'whiz')); $apns->queueMessage(); 

是的,iOS 7+是可以的

如果您重写UIApplicationDelegate: application(_:didReceiveRemoteNotification:fetchCompletionHandler :),则可以接收“后台”推送通知

 func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { // do what you need ie download fresh content (max. 30 seconds) completionHandler(UIBackgroundFetchResult.NoData) } 

作为这种方法的文件说:

使用此方法处理传入的应用程序的远程通知。 与应用程序不同的是:didReceiveRemoteNotification:只在应用程序在前台运行时调用,方法是当您的应用程序在前台或后台运行时调用此方法。 另外,如果启用了远程通知后台模式,系统将启动您的应用程序(或将其从暂停状态唤醒),并在远程通知到达时将其置于后台状态。

不要忘记在背景模式下启用“后台抓取”“远程通知”

在这里输入图像说明

有关后台执行的更多信息。

当应用程序处于后台时,您无法发送不可见的推送通知。 唯一的办法是在应用程序到达前台时更新数据。

您将在一定的时间间隔内检查是否需要更新或者与服务器build立连接。

您可以在前台收到通知,但是如果您处于后台或前台,则服务器不会有任何区别,除非您向服务器发送了一个信息,表明您处于前台。

这就是为什么在你的情况下,先前的消息中描述的ase,最好是从后台检查服务器,或者如果有任何上传,应用程序启动。

另一个select是发送一个可见的通知,所以用户将启动应用程序,然后更新(如前一段所述)将会发生

使用委托方法applicationDidRecieveRemoteNotification通知应用程序使用更新服务签入。 或者你可以让应用程序轮询你不想设置推送通知的更新服务durin applicationwillEnterForgound。

我不认为你是正确的做法。 考虑所有的东西你将build立一个简单的任务:1)服务器推2)注册通知3)去背景和恢复(大和复杂的服务器推送通知)

无论如何,当你得到一个消息,你必须问数据…没有储蓄比较直接询问。

所以一个干净的解决scheme可以是:1)请求服务器使用正常的HTTP(使用asynchronousNSURL请求..)例如:http:// ……&lastupdate ='2012:05:01 18 00'传递最后更新date,我们得到了一个成功的下载(你也可以使用一个单一的时间戳…)

2)服务器会将该date与其内部的最后更新date进行比较:如果date更新,它将用XML或plist(我倾向于plist …)

3)应用程序下载新的数据并更新date/时间。

4)如果没有数据,答案只是一个空string或例如我们发送的相同date。

对你的第一个问题的简短回答: 你必须进行民意调查

为什么: – 当你的应用程序在后台,它不知道任何推送通知,除非有警报,用户点击ViewLaunch ,这是不能保证(你也不希望这个警报)。

您也可能希望避免使用APNS(如果仅用于此目的),因为使用Apple证书和所有爵士乐configuration服务器的额外开销。

要回答第二个问题:您希望更新的频率取决于您的应用的function。 例如,如果您显示“库存”值,则可能需要每隔几秒更新一次数据。 天气可能要几个小时。 对于其他人来说,这可能是几天甚至更长的时间。 这取决于更新对用户的重要程度。