拨出电话时的后台行为,iOS 7 与 iOS 8

Posted

技术标签:

【中文标题】拨出电话时的后台行为,iOS 7 与 iOS 8【英文标题】:Backgrounding behaviour when an outgoing phone call is made, iOS7 vs iOS8 【发布时间】:2014-11-29 03:34:59 【问题描述】:

当我的 ios 应用通过以下操作拨打电话时:

NSString *telephoneUrl = @"tel:12345678";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:telephoneUrl]];

应用生命周期状态会发生什么变化?

例如如果我将以下几行放在上述电话线下方:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
    NSLog(@"dispatch callback was called!!!");
);

在 iOS 7 上,applicationDidEnterBackground 被调用,上面的代码没有运行,当电话终止时,我在电话应用程序中。只有当我返回我的应用程序时才会编写控制台行。

然而,在 iOS 8 上,只有applicationWillResignActive 被调用并且应用程序没有进入后台,当我在电话中时,您实际上可以看到日志正在写入控制台。当通话终止时,我仍在我的应用程序中。

有人可以确认该行为,或将我指向相关文档吗?

【问题讨论】:

听起来 iOS 8 实际上并没有在应用程序后台运行,只是将手机应用程序放在您的应用程序之上。通过加载 Siri 可以体验相同的功能。该应用程序不是活动应用程序,但也没有被后台处理。您是否有正在寻求帮助的实际问题,或者您只是在寻找有关州的更多信息?此外,您可能只是出于调试原因这样做,但应避免将代码设置为在很长时间后执行(显然,在很多情况下,这是唯一有意义的事情,但在这里一般来说)。 我希望有人可能拥有有关电话行为的最终文档,而不是我自己的反复试验。感谢您提供有关 Siri 场景的信息,这是一个有用的示例。 我通常会在提供链接和更完整的 cmets 方面做得更好,但我仅限于手机使用 atm,所以我输入的任何内容都是凭记忆做的。尽管应该注意的是,许多 iOS 8 文档目前更多地是对预期行为与实际行为的描述 - 他们仍在解决许多错误。 【参考方案1】:

是的,iOS 7 和 iOS 8 在这里有所不同。我也找不到有关它的文档。

所以在 iOS 7 中,如果你有来电 applicationWillResignActive: 将首先被调用。如果您拒绝电话 applicationDidEnterBackground 将不会被调用;但如果您接听电话 applicationDidEnterBackground 将被调用,当您结束电话并且您的应用再次激活时 applicationWillEnterForeground: 也会被调用。

但在 iOS 8 中只有 applicationWillResignActive: 无论你接不接电话都会被调用。

【讨论】:

以上是关于拨出电话时的后台行为,iOS 7 与 iOS 8的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中获取最后一个拨出电话状态[关闭]

使用 CallKit 显示用于拨出 VoIP 呼叫的 iOS 本机呼叫 UI

检测拨出电话何时开始播放回铃音

应用程序未运行时的 iOS 7 后台获取

如何在 ios phone phonegap 编程中处理呼出和呼入的应用程序?

URLSession downloadTask 在后台运行时的行为?