iOS:手机锁定时本地通知显示速度很慢

Posted

技术标签:

【中文标题】iOS:手机锁定时本地通知显示速度很慢【英文标题】:iOS: Local notification very slow to show up when phone locked 【发布时间】:2016-06-07 15:46:04 【问题描述】:

我们一直在用 Swift 开发一个 ios 应用程序(仅限 iOS 9+)。我们对某些事情使用 VOIP 通知,然后使用本地通知将消息实际显示给用户。

我的问题是,当手机被锁定时,本地通知可能需要长达 15 秒才能真正显示出来,即使我可以看到我的调试输出并且代码在我期望的时候立即运行。

这是我显示通知的代码:

let notification = UILocalNotification()
    notification.alertTitle = "Title text.".local
    notification.alertBody = "Body text."
    notification.alertAction = "Action".local
    notification.category = Notification.CallCategory
    notification.soundName = localNotificationSoundName
    notification.userInfo = msg.dictionary()

    UIApplication.sharedApplication().presentLocalNotificationNow(notification)

除了延迟之外,一切都按预期工作,当手机未锁定时,没有延迟并且通知按预期工作。

有什么想法吗?

编辑

作为说明,此代码在驻留在我们的 PKPushRegistryDelegate 实现中的开关/案例中运行。特别是在这个函数中:

func pushRegistry(registry: PKPushRegistry!, didReceiveIncomingPushWithPayload payload: PKPushPayload!, forType type: String!)

另外值得注意的是,这并非在每台设备上都会发生。我们有一台 iPhone 6s 测试设备,每次都会发生这种情况,无论我们重启设备、重新安装应用程序甚至将 iOS 升级到更新版本多少次。我们还有一些其他测试设备不会发生这种情况。

【问题讨论】:

我不确定(因此这是评论,而不是答案),但我猜 iOS 在睡眠模式下不会优先通知通知。或者它每隔几秒钟才获取一次通知,以最大限度地提高电池电量。这可以解释当手机解锁时通知按预期工作。 不是这样,因为应用程序正在使用 VOIP 通知并在后台运行。不过,这个问题变得越来越陌生,因为它并没有在我们所有的测试设备上发生。它可以在一些设备上重复,但不是全部。重启设备,安装/卸载甚至更新iOS版本也不会影响它。 检查一次 facebook messenger 应用程序。我猜它使用本地通知进行呼叫。检查它是否延迟 10-15 秒!我确实经历过本地通知没有在准确的时间触发,所以它可能是一种系统设计,在准确的时间给予本地通知的优先级较低。 这段代码在哪里运行?你能发布完整的功能吗? 这段代码在我们的 PKPushRegistryDelegate 实现中运行,特别是在这个函数中:func pushRegistry(registry: PKPushRegistry!, didReceiveIncomingPushWithPayload payload: PKPushPayload!, forType type: String!) 【参考方案1】:

从 Apple 文档中阅读 -

优先考虑远程通知传递

您的服务器向 Apple Notification 提供的远程通知 服务包括多种元素,包括有效载荷数据、 到期日期、优先级等。远程通知支持 两级推送优先级。一个传递通知 立即地。另一个延迟通知的传递,直到 节能时间。除非通知确实需要 立即发货,请使用延期发货方式。

NotificationBestPractices

    我知道您的问题是因为local notification 速度慢,但仍要确保您有优先远程通知。

    我在测试该应用程序使用本地通知时遇到了一定的延迟。也许这就是系统的设计方式,不一定是缺陷。对于 VOIP 情况,我仍然认为您应该使用推送通知来通知呼叫(也许您在发出通知之前有一些内部计算)。但是请查看 Facebook Messenger 应用程序,它看起来确实混合了匹配推送/本地通知来通知用户来电。尝试观察延迟(如果有)。

    制作另一个简单的应用程序,显示与上述相同代码的本地通知,并观察它是否也有一些延迟。对于这个测试,不要使用远程通知来触发本地通知,只需在应用启动后测试或类似的东西。这是为了确保系统是否在推送通知后立即延迟某些应用程序通知?

【讨论】:

非常好的观察结果,我会考虑创建一个测试应用程序来测试本地通知。我们正在使用 VOIP 通知,因为我们一直认为它们的传递速度最快。在我们的例子中,另一端有一个人在等待对方回答/拒绝,所以每一秒都很重要。 @VilleRinne 您对此有什么解决方案吗?我们也面临同样的问题。【参考方案2】:

请尝试设置->常规->重置->重置网络设置

【讨论】:

【参考方案3】:

我找到了可能的原因 - iPhone 与 Apple Watch 配对。尽管手表在抽屉里并关闭了,iPhone 还是试图将通知发送给它。在我们从手表上取消配对 iPhone 并等待一段时间后,一切都变得正常了。

【讨论】:

以上是关于iOS:手机锁定时本地通知显示速度很慢的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 3 中的锁定屏幕清除本地通知

swift中的本地通知警报声

IOS 7锁定屏幕Objective-C的警报本地通知

锁屏ios上的本地通知

iOS5 本地通知 - 滑动或解锁

如何在 Apple Watch 模拟器中测试本地通知?