我正在构建一个依赖在线数据库数据的iPhone应用程序。
要更新应用程序中的数据,我可以在某个时间间隔检查是否需要更新但是如果我可以使用推送服务向应用程序发送通知让它知道是时候进行更新了更新。
我不是在这里讨论可见的推送通知,只是在我的应用中触发更新方法的无形推送通知。
是否有标准方法可以执行此操作,还是可以使用Apple的推送通知服务来实现此目的?
换句话说:我现在正在使用pull获取更新,是否有推动方式让我的应用后端知道是时候进行更新了?
编辑:如果不可能,那么更新的时间间隔是多少(如果没有更新则为0.03 kb)。是否每30秒检查一次?
答案 0 :(得分:29)
Apple Online Library中有一个解释良好的文档。
使用Apple推送通知服务(APNS),您可以获得以下任意组合:
当我说任何我的意思是没有警报,没有徽章和没有声音也是可能的。即使应用程序已关闭(但至少执行一次,注册到通知服务中),远程通知也可用,iOS负责管理推送并唤醒您的应用程序。
如果您想使用APNS,则需要
与iOS相关并信任您的服务器的所有内容都在iOS配置门户,“应用程序ID”部分,“如何”选项卡中详细说明。试试this link。
在您的网络服务器中,必须托管将执行以下两项操作的APNS提供商:
在具体的iOS设备上注册标识具体安装的令牌。此令牌是为Apple APNS生成的,将由您的应用程序发送给提供商。
生成推送通知:将从您的提供商发送到Apple APNS,Apple APNS将发送到您的应用程序(带有警报和/或徽章和/或声音和/或静音模式)
APNS通知将使用远程通知系统发送到您的应用程序。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
作为提供者,您可以使用自己开发的提供者,也可以使用/修改任何已经可下载的人,如
所以答案是肯定的,这是可能的。使用Easy APNS esamples,推送生成必须如下所示:
$apns->newMessage(1);
$apns->addMessageCustom('acme2', array('bang', 'whiz'));
$apns->queueMessage();
答案 1 :(得分:5)
是的,可以使用iOS 7 +
如果您覆盖此UIApplicationDelegate方法,则可以收到“后台”推送通知: application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void)
{
// do what you need i.e. download fresh content (max. 30 seconds)
completionHandler(UIBackgroundFetchResult.NoData)
}
该方法方法的文档说:
使用此方法处理应用的传入远程通知。 与应用程序不同:didReceiveRemoteNotification:方法,即 只有当您的应用程序在前台即系统中运行时才会调用 当您的应用在前台运行或运行时调用此方法 背景。此外,如果您启用了远程通知 在后台模式下,系统启动你的应用程序(或从中唤醒它) 暂停状态)并将其置于远程时的后台状态 通知到了。
不要忘记在后台模式中启用“后台获取”和“远程通知”。
答案 2 :(得分:3)
当应用程序在后台时,您无法发送不可见的推送通知。唯一的方法是在应用程序到达前台时更新数据。
如果需要更新,您可以在特定时间间隔检查,或者与服务器建立拉动连接。
答案 3 :(得分:1)
您可以在前台时收到通知,但如果您在后台或前台服务器,服务器不会有任何区别,除非您向服务器发送您在前台的信息。
这就是为什么在您的情况下,在上一条消息中描述的情况,最好在您来自后台时或在应用程序启动时检查服务器是否有任何上传。
另一个选项是发送可见通知,以便用户启动应用程序,然后更新(如上一段所述)将发生
答案 4 :(得分:0)
使用委托方法applicationDidRecieveRemoteNotification告诉应用程序使用更新服务签入。或者,您可以让应用程序轮询更新服务,但不要设置推送通知的applicationwillEnterForgound。
答案 5 :(得分:0)
我不认为你是正确的方法。 考虑您将为简单任务构建的所有内容: 1)服务器推送 2)注册通知 3)去背景和恢复 (大而复杂的是用于推送通知的服务器)
无论如何,当你收到消息时,你必须询问数据...直接询问没有节省。
所以一个干净的解决方案可以是: 1)使用普通HTTP(使用异步NSURL请求..)向服务器询问,例如: http:// ......& lastupdate = '2012:05:01 18 00' 通过上次更新日期,我们成功下载了 (您也可以使用unicx时间戳...)
2)服务器将该日期与其内部上次更新日期进行比较:如果它具有更新的日期,它将使用XML或plist进行响应(我更喜欢plist ...)
3)应用程序下载新数据并更新日期/时间。
4)如果没有数据,答案只是一个空字符串,或者例如我们发送的日期相同。
答案 6 :(得分:0)
对第一个问题的简短回答:您必须进行投票。
原因: - 当您的应用在后台时,它无法知道任何推送通知,除非有警报且用户点击View
或Launch
,但无法保证(并且您不想要警报。)
您可能还想避免使用APNS(如果仅用于此目的),因为使用Apple证书和所有爵士乐配置服务器会产生额外的开销。
回答您的第二个问题:您希望更新的频率取决于您的应用的功能。例如,如果您显示“Stock”值,则可能需要每隔几秒更新一次数据。天气可能需要几个小时。对于其他人来说,可能需要几天甚至更长时间。 这取决于更新对用户的重要程度。