iOS - 在本机 iOS 最近通话 table 视图中单击呼叫者时触发传出 VOIP 呼叫

iOS - Trigger outgoing VOIP Call on clicking the caller in the native iOS Recent call table view

我已经为我的应用程序实施了 CallKit,以便 trigger/receive 通过使用 WebRTC 在我们的应用程序中进行音频和视频通话。无缝运行,没有任何问题。

据我所知,有 3 种方法可以从 Call Kit 触发呼叫。

  1. 在应用内进行互动
  2. 使用支持的自定义 URL 方案打开 link
  3. 正在使用 Siri 发起 VoIP 呼叫

截至目前,我没有任何要求使用 Siri 发起呼叫,但我们需要在用户单击本机 iOS 最近通话屏幕中的任何单元格时发起呼叫,然后路由到我们的应用程序并触发外出呼叫。

而且当用户呼叫其他用户时我们的应用程序包含很少的元数据,例如 receiverID 等。因此当用户错过来自其他用户的呼叫时,我需要存储此元数据并且我需要触发呼叫当用户单击使用所有这些元数据的 iOS 最近通话屏幕的未接来电列表时。

我正在浏览 Apple 提供的 CallKit "Speakerbox" 示例应用程序。我发现他们正在使用自定义 URL 方案,就像我们用于 iOS 应用程序的深度链接一样。

所以我需要一些建议是否可以使用 URL 方案来实现,如果可以,我如何将元数据(自定义对象)存储在 CXHandle 对象中。

在这里粘贴我的相同答案:

验证 remoteHandle 和 supportedHandleTypes,两者应符合您的要求。

callUpdate.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:[NSString stringWithFormat:@"%@", phoneno]];
configuration.supportedHandleTypes = [NSSet setWithObjects:[NSNumber numberWithInteger:CXHandleTypeGeneric],[NSNumber numberWithInteger:CXHandleTypePhoneNumber], nil];

如果句柄不匹配,您将无法处理 NSUserActivity。

实现此方法获取回调,

- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray * _Nullable))restorationHandler {}

对于 Swift 5 你应该将 continueuserActivity 函数定义为 SceneDelegate.swift 如下所示

   func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
 
        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
                }
     
        }
        return
    }

请参考这个