【问题标题】:iOS push services: is an invisible push notification possible?iOS推送服务:隐形推送通知可能吗?
【发布时间】:2012-02-01 17:46:45
【问题描述】:

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

要更新应用程序中的数据,我可以在某个时间间隔检查是否需要更新,但如果我可以使用推送服务向应用程序发送通知,让它知道是时候更新了,那就更酷了更新。

我在这里不是在谈论可见的推送通知,只是在我的应用程序中触发更新方法的不可见推送通知。

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

换句话说:我现在使用拉取来获取更新,有没有一种推送方式让我的应用程序的后端知道是时候更新了?

编辑:如果不可能,更新的最佳时间间隔是多少(如果没有更新,则为 0.03 kb)。每 30 秒检查一次是不是太多了?

【问题讨论】:

  • 嗨,你找到解决办法了吗?
  • 不,最后我决定坚持拉......也许我会在我的应用程序的 2.0 版中实现一些不同的东西:)

标签: ios notifications push


【解决方案1】:

Apple Online Library 中有详细解释的文档。

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

  • 向用户显示的警告消息
  • 用于标记应用程序图标的数字
  • 播放声音

当我说任何时,我的意思是没有警报、没有徽章和没有声音也是可能的。即使应用程序关闭(但至少执行一次,以便注册到通知服务),远程通知仍然可用,iOS 有责任管理推送并唤醒您的应用程序。

如果你想使用APNS,你需要

  • Web 服务器(将生成推送)
  • 来自网络服务器的 CSR
  • 信任您的服务器的苹果证书(这是 CSR 的原因)
  • 为通知配置了 App ID 的 iOS 应用程序

与 CSR 和信任您的服务器相关的所有内容都在 iOS 配置门户的“应用程序 ID”部分的“操作方法”选项卡中进行了详细说明。试试this link

必须在您的网络服务器中托管将执行以下两项操作的 APNS 提供商:

  • 在具体的 iOS 设备上注册一个标识具体安装的令牌。此令牌是为 Apple APNS 生成的,并将由您的应用程序发送给 Provider。

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

APNS 通知将使用远程通知系统发送到您的应用。

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

您可以查看Easy APNS App Delegate

作为提供者,您可以使用自己开发的,也可以使用/修改任何已经可以下载的人,例如

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

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

【讨论】:

  • 感谢您提供详细的答案和信息,但我无法直接了解如何在没有声音/警报/徽章的情况下向苹果发送推送消息,您知道我应该在哪里查看简单的 APNS 文档?
  • 关于自定义有效负载的快速问题...如何注册它们?
  • 如果你的意思是在 iOS 应用中注册,在 appDelegate 方法内- (void)applicationDidFinishLaunching:(UIApplication *)application你应该写[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; 这样你就可以收到所有通知(不仅仅是自定义)
  • 非常好的和写得很好的答案。使用推送而不是轮询绝对是要走的路。
【解决方案2】:

是的,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)
}

正如该方法方法的文档所述:

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

不要忘记在后台模式中启用“后台获取”“远程通知”

More info about background execution here.

【讨论】:

  • 通知的有效负载必须包含 content-available 键,其值设置为 1。当该键存在时,系统会在后台唤醒应用程序(或将其启动到后台)并调用应用委托的application:didReceiveRemoteNotification:fetchCompletionHandler: 方法。
【解决方案3】:

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

您将在特定时间间隔检查是否需要更新或与服务器建立拉连接。

【讨论】:

  • 当应用程序在前台时?那么是否可以使用推送?
  • 不,您必须以给定的时间间隔或选定的操作从服务器中提取内容。在这种情况下,C2DM 比 APNS 更好!
  • 自 iOS 7 以来,这个答案不再正确,只是为了澄清。 stevo.mit 的回答是正确的。
【解决方案4】:

您在前台时可以收到通知,但无论您是在后台还是在前台,服务器都不会有任何区别,除非您向服务器发送您在前台的信息。

这就是为什么在您的情况下,如上一条消息中所述,最好在您来自后台或应用程序启动时检查服务器是否有任何上传。

另一种选择是发送可见通知,以便用户启动应用程序,然后进行更新(如上一段所述)

【讨论】:

  • 不能选择使用可见通知。我不想在同步过程中打扰用户。
【解决方案5】:

使用委托方法 applicationDidRecieveRemoteNotification 告诉应用程序签入更新服务。或者,您可以让应用程序在您不想设置推送通知的 applicationwillEnterForgound 期间轮询更新服务。

【讨论】:

    【解决方案6】:

    我不认为你是正确的方法。 考虑一下你将为一个简单的任务构建的所有东西: 1) 推送服务器 2) 注册通知 3)去后台和恢复 (大而复杂的是推送通知的服务器)

    无论如何,当您收到消息时,您必须询问数据......与直接询问相比没有节省。

    所以一个干净的解决方案可以是: 1)使用普通 HTTP(使用异步 NSURL 请求..)向服务器询问,例如: http://...... &lastupdate='2012:05:01 18 00' 过了最后更新日期,我们就成功下载了 (您也可以使用 unix 时间戳...)

    2) 服务器会将该日期与其内部上次更新日期进行比较:如果它有较新的日期,它将以 XML 或 plist 响应(我更喜欢 plist...)

    3) 应用下载新数据并更新日期/时间。

    4) 如果没有数据,则答案只是一个空字符串或例如我们发送的同一日期。

    【讨论】:

      【解决方案7】:

      简短回答您的第一个问题:您必须投票

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

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

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

      【讨论】:

      • 你确定这是正确的吗?我的印象是后台应用程序仍然可以处理推送通知。
      • 您能否详细说明“处理推送通知”?当应用程序处于后台时,它处于挂起状态,并且在重新启动之前什么都不知道(参见上面的答案)。在 iOS 4+ 中,Apple 引入了“Background Execution and Multitasking”,但一般推荐的方式仍然是让它挂起。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-18
      • 2016-03-23
      • 2017-11-18
      相关资源
      最近更新 更多