ios - CallKit 查找用于从 native 电话应用程序启动应用程序的号码

标签 ios callkit

我已经在我们的应用中实现了 CallKit。我们的应用调用的电话显示在 native 电话应用的最近通话列表中。

在最近列表中点击我们应用程序的条目时,我们的应用程序将启动。有没有办法找出启动我们的应用程序时使用的号码(/条目)? (openURL 或其他)

最佳答案

您需要在 AppDelegate 上实现 application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool。对于这个特定的操作,userActivity 将有一个 interaction 属性,一个 intent 属性是 INStartAudioCallIntent 的一个实例(或者 INStartVideoCallIntent 如果您的应用程序播放视频)。

intent 对象上有一个 INPerson 联系人对象数组,可用于确定有关所拨内容的信息。

如果您的应用没有将任何联系人加载到系统中,您的通话是一对一的(而不是群组通话)并且您只想访问“已拨号码”,您可能会找到想要的在 intent.contacts?.first?.personH​​andle?.value

另请注意,您需要链接并导入 Intents 框架。

更新

前面的回答只对了一半。有两种获取此信息的方法,两种方法都应该实现。

上面的 continueUserActivity 变体将在点击最近的项目(或选择联系人)时调用,并且您的应用程序已经在运行

但是,如果您的应用当前未运行,则它将启动并且不会调用 continueUserActivity。相反,系统将使用 UIApplicationLaunchOptionsKey.userActivityDictionary 调用您的 AppDelegate 的 didFinishLaunchingWithOptions,其用法如下:

if let activityOptions = launchOptions?[UIApplicationLaunchOptionsKey.userActivityDictionary] as? [String: AnyObject],
   let activity = activityOptions["UIApplicationLaunchOptionsUserActivityKey"] as? NSUserActivity {
  self.launchWithActivity(activity)
}

一旦您拥有 NSUserActivity 实例,其行为就与 continueUserActivity 中的行为相同

再次更新

根据@vivek takrani 在下面的评论中,似乎 continueUserActivity 可能会一直被调用,无论该应用程序之前是否打开过。如果您打算支持它,我会在早期版本的 iOS 10 上对此进行测试,因为我认为在撰写此答案时情况并非如此。

关于ios - CallKit 查找用于从 native 电话应用程序启动应用程序的号码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39789495/

相关文章:

ios - 如何在 swift 3 的 performselector 中发送多个参数?

ios - 如何在 CallKit 上显示背景图片

ios - CallKit CXEndCallAction 报告给另一端 - Swift

ios - 当第二个电话打到我的 iOS voip 应用程序时,如何播放调用等待提示音?

ios - CallKit 扩展开始请求

ios - Xcode 不允许我按住 ctrl 拖动来添加 socket

ios - 如何在按下 tabBar 按钮时调用一个函数,但前提是当前正在按下该 View ?

ios - 无法将 Flutter iOS 应用程序验证到 AppStore

ios - 解包可选值时意外发现 nil [swift 3.0]

ios - CallKit 不会阻止数组中的数字