Ios CallKit查找用于从本机手机应用启动应用的号码

Ios CallKit查找用于从本机手机应用启动应用的号码,ios,callkit,Ios,Callkit,我已经在我们的应用程序中实现了CallKit。我们的应用程序拨打的电话显示在本机手机应用程序的最近通话列表中 在最近列表中点击我们的应用程序条目时,我们的应用程序启动。有没有办法找出启动我们应用程序使用的号码(/条目)?(openURL或其他东西)您需要在AppDelegate上实现应用程序(应用程序:UIApplication,continueUserActivity用户活动:NSUserActivity,restorationHandler:([AnyObject]?)->Void)->Bo

我已经在我们的应用程序中实现了CallKit。我们的应用程序拨打的电话显示在本机手机应用程序的最近通话列表中


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

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

intent对象上有一个
INPerson
contact对象数组,可用于确定有关所拨打电话的信息

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

还请注意,您需要链接并导入
意图
框架

更新

先前的答案只对了一半。获取这些信息有两种方法,两种方法都应该实现

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

但是,如果您的应用程序当前未运行,则将启动该应用程序,并且不会调用
continueUserActivity
。相反,系统将使用
UIApplicationLaunchOptions.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的早期版本上进行测试,因为我认为在撰写此答案时情况并非如此。

谢谢,这正是我所需要的@RasmusHöglund&Colin,当点击最近列表时,我的应用程序没有启动,也没有在最近列表中显示看涨期权。我不知道我错过了什么?它只会打开应用程序创建的条目(使用callkit)。您是否有应用程序最近创建的条目?@RJVKumar另外,为了让您的应用程序显示在联系人列表和系统的其他部分中,您必须在
CXProviderConfiguration
上设置
SupportedHandletTypes
,以包括应用程序支持的句柄类型。这将启用直接从联系人使用应用程序呼叫的选项。嘿,continueUserActivity方法一直被调用,即使用户从呼叫日志中单击呼叫时也是如此&应用程序已关闭。您可以在Swift 4中获得解决方案。希望这对你有帮助。