【问题标题】:Possible to use Voip push functionality only without voip messaging/calls?可以仅在没有 voip 消息/通话的情况下使用 Voip 推送功能吗?
【发布时间】:2017-10-31 00:10:24
【问题描述】:

我想在我的应用程序中使用 Voip 推送作为静默推送通知的更可靠替代方案,并且还能够在推送到达时从终止状态启动应用程序。

[是的,我知道如果该应用不向用户额外提供 Voip 功能并且只是使用 Voip 推送而不是常规推送,则该应用不会在应用商店中被接受]。

但我想知道这样做是否有任何问题 - 例如,如果应用程序终止并且 Voip 推送到达,我注意到在启动它之后应用程序似乎并没有在之后再次终止。这使我相信操作系统可能期望在例如 Voip 通话结束后调用诸如 completion() 方法之类的东西?如果我不调用这个 completion() 方法,操作系统可能最终会停止向应用发送推送,因为它认为它的行为不好?

【问题讨论】:

  • 是什么让您相信completion() 设施?推送到达后,您的应用是否在后台停留超过 30 秒?
  • @sage444。我想知道是否应该有,这就是问题所在。我的应用程序通常不会在后台运行超过 30 秒,但如果从服务器下载速度很慢并且需要很长时间才能在速度较慢的手机上处理有效负载,则它可能会运行。
  • 好的,我明白你的意思了。所以我的应用程序(真正的 VOIP 客户端,最小部署目标 9.0)不调用任何类型的完成块/回调。但正如您在 Tim 的回答中看到的,它可能因 iOS 版本而异。
  • 还有一点。将 PushKit 与其他后台执行机制混用可能会很棘手且难以维护,尤其是在您需要支持多个版本的 iOS 时。
  • @sage444 请您详细说明一下。我只支持>= iOS 10。它只是我正在使用的推送工具包中的推送通知,没有别的

标签: ios


【解决方案1】:

如果我查看PKPushRegistryDelegate docs,我注意到处理 VoIP 推送需要实现的方法是:

optional func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void)

注意最后一个参数是completion 块。这种方法的讨论说:

处理完有效负载后立即调用完成处理程序。

所以是的,我怀疑调用完成处理程序是向 PushKit 框架指示您不再处理推送的必要条件。

(该委托消息的旧变体没有completion 参数,但在iOS 11 中已弃用,这暗示某些操作系统行为可能已更改,现在必须调用完成块。)

【讨论】:

  • 我正在使用 func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType)。我没有注意到有过载。因此,我想知道为什么有两种变体以及没有完成的变体是什么。
  • 没有重载的可能是同一回调的旧版本。操作系统可能假设您会在该方法中同步进行所有处理,因此它可能会在该方法返回后立即关闭您的应用程序,或者它可能会给您一些固定的时间。无论哪种方式,新的completion-bearing 变体将更加可靠,因为旧版本已正式弃用。
  • 蒂姆赏金不能在 24 小时内发放。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 2017-11-16
相关资源
最近更新 更多