iOS Callkit - 来电最近记录
iOS Callkit - incoming Call Recents History
我在我们的应用程序中实现了呼叫工具包,仅用于在应用程序关闭或在后台(推送呼叫通知)时收到来电。我只是注意到,每次我接到一个电话并使用 callkit 显示它时,这个电话会自动出现在通话记录中(本机 Call App 中的“最近”选项卡)。
每次我点击其中一个最近的应用程序时,我的应用程序都会恢复或启动。
我想让应用程序在用户按下最近的电话后拨出电话,但我没有找到任何相关信息。
- 有没有一种方法可以检测到该应用程序是从最近一次点击的调用中打开/恢复的?
- 我们可以禁用这个 callkit 功能吗?
感谢提供信息:)
I wanted to make the app place an outgoing call after the user press
the recent call but I didn't find anything about it.
在您应用的 Info.plist
中,您必须在 NSUserActivityTypes
键中包含 INStartAudioCallIntent
and/or INStartVideoCallIntent
,并且您的应用委托必须实现 -application:continueUserActivity:restorationHandler:
方法来处理开始调用的意图。有关详细信息,请参阅 Speakerbox 示例应用程序。
Can we disable this callkit feature ?
如果您不为通话 CXCallUpdate
设置 remoteHandle
,则“最近”中的项目将不可按。
供将来参考;
呼叫工具包提供者配置应该有这个通用和 phone 数字类型列表
config.supportedHandleTypes = [.generic,.phoneNumber]
Callkit update remotehandle 应该像下面这样初始化
update.remoteHandle = CXHandle(type: .generic, value:String(describing: payload.dictionaryPayload["caller_id"]!))
3.You 应通过选择项目>目标>构建阶段> Link Binary With Libraries 添加 Intents.framework 到您的项目并单击 + 按钮
您应该将 INStartCallIntent 添加到您的 info.plist 中,如下所示
<key> NSUserActivityTypes </key>
<array>
<string>INStartCallIntent</string>
</array>
for swift 5 您应该将以下功能添加到您的 SceneDelegate.swift
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {}
或者 swift 4 及以下你应该添加下面的函数到 Appdelegate.swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
return true
}
然后将下面的代码添加到您的继续用户活动功能
let interaction = userActivity.interaction
if let startAudioCallIntent = interaction?.intent as? INStartAudioCallIntent{
let contact = startAudioCallIntent.contacts?.first
let contactHandle = contact?.personHandle
if let phoneNumber = contactHandle?.value {
print(phoneNumber)
// Your Call Logic
}
}
}
你应该得到一个警告
INStartAudioCallIntent' was deprecated in iOS 13.0: INStartAudioCallIntent is deprecated. Please adopt INStartCallIntent instead
应用此建议失败,因为无法将 startAudioCallIntent 强制转换为 INStartCallIntent,因此请忽略它。
非常重要当应用程序终止时,不会调用场景委托中的继续用户活动功能,因此运行您在应用程序启动时的意图,您应该将代码块添加到
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {}
你的代码应该如下所示
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let contentView = ContentView()
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView.environmentObject(AppDelegate.shared)) // This is my code so you may not use Appadelegate.shared. ignore it
self.window = window
window.makeKeyAndVisible()
}
if let userActivity = connectionOptions.userActivities.first {
let interaction = userActivity.interaction
if let startAudioCallIntent = interaction?.intent as? INStartAudioCallIntent{
let contact = startAudioCallIntent.contacts?.first
let contactHandle = contact?.personHandle
if let phoneNumber = contactHandle?.value {
// Your Call Logic
}
}
}
}
我在我们的应用程序中实现了呼叫工具包,仅用于在应用程序关闭或在后台(推送呼叫通知)时收到来电。我只是注意到,每次我接到一个电话并使用 callkit 显示它时,这个电话会自动出现在通话记录中(本机 Call App 中的“最近”选项卡)。
每次我点击其中一个最近的应用程序时,我的应用程序都会恢复或启动。 我想让应用程序在用户按下最近的电话后拨出电话,但我没有找到任何相关信息。
- 有没有一种方法可以检测到该应用程序是从最近一次点击的调用中打开/恢复的?
- 我们可以禁用这个 callkit 功能吗?
感谢提供信息:)
I wanted to make the app place an outgoing call after the user press the recent call but I didn't find anything about it.
在您应用的 Info.plist
中,您必须在 NSUserActivityTypes
键中包含 INStartAudioCallIntent
and/or INStartVideoCallIntent
,并且您的应用委托必须实现 -application:continueUserActivity:restorationHandler:
方法来处理开始调用的意图。有关详细信息,请参阅 Speakerbox 示例应用程序。
Can we disable this callkit feature ?
如果您不为通话 CXCallUpdate
设置 remoteHandle
,则“最近”中的项目将不可按。
供将来参考;
呼叫工具包提供者配置应该有这个通用和 phone 数字类型列表
config.supportedHandleTypes = [.generic,.phoneNumber]
Callkit update remotehandle 应该像下面这样初始化
update.remoteHandle = CXHandle(type: .generic, value:String(describing: payload.dictionaryPayload["caller_id"]!))
3.You 应通过选择项目>目标>构建阶段> Link Binary With Libraries 添加 Intents.framework 到您的项目并单击 + 按钮
您应该将 INStartCallIntent 添加到您的 info.plist 中,如下所示
<key> NSUserActivityTypes </key> <array> <string>INStartCallIntent</string> </array>
for swift 5 您应该将以下功能添加到您的 SceneDelegate.swift
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {}
或者 swift 4 及以下你应该添加下面的函数到 Appdelegate.swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
return true
}
然后将下面的代码添加到您的继续用户活动功能
let interaction = userActivity.interaction
if let startAudioCallIntent = interaction?.intent as? INStartAudioCallIntent{
let contact = startAudioCallIntent.contacts?.first
let contactHandle = contact?.personHandle
if let phoneNumber = contactHandle?.value {
print(phoneNumber)
// Your Call Logic
}
}
}
你应该得到一个警告
INStartAudioCallIntent' was deprecated in iOS 13.0: INStartAudioCallIntent is deprecated. Please adopt INStartCallIntent instead
应用此建议失败,因为无法将 startAudioCallIntent 强制转换为 INStartCallIntent,因此请忽略它。
非常重要当应用程序终止时,不会调用场景委托中的继续用户活动功能,因此运行您在应用程序启动时的意图,您应该将代码块添加到
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {}
你的代码应该如下所示
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let contentView = ContentView()
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView.environmentObject(AppDelegate.shared)) // This is my code so you may not use Appadelegate.shared. ignore it
self.window = window
window.makeKeyAndVisible()
}
if let userActivity = connectionOptions.userActivities.first {
let interaction = userActivity.interaction
if let startAudioCallIntent = interaction?.intent as? INStartAudioCallIntent{
let contact = startAudioCallIntent.contacts?.first
let contactHandle = contact?.personHandle
if let phoneNumber = contactHandle?.value {
// Your Call Logic
}
}
}
}