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。
对你的第一个问题的简短回答: 你必须进行民意调查 。
为什么: – 当你的应用程序在后台,它不知道任何推送通知,除非有警报,用户点击View
或Launch
,这是不能保证(你也不希望这个警报)。
您也可能希望避免使用APNS(如果仅用于此目的),因为使用Apple证书和所有爵士乐configuration服务器的额外开销。
要回答第二个问题:您希望更新的频率取决于您的应用的function。 例如,如果您显示“库存”值,则可能需要每隔几秒更新一次数据。 天气可能要几个小时。 对于其他人来说,这可能是几天甚至更长的时间。 这取决于更新对用户的重要程度。