CallKit Framework 是否可以拨打、接听和结束电话呼叫,还是仅用于 VOIP 呼叫?

Is it possible with CallKit Framework to make, answer and end telephonic call or is it used for VOIP call only?

我想在 CallKit 的帮助下对电话呼叫执行操作,但根据 Apple 文档,它只能用于拨打 VOIP 电话,有什么方法可以让我拨出电话、结束电话在 CallKit 的帮助下当前通话和接听来电。

我正在使用私有框架 (TelephonyUtilities),尝试进行上述活动。

NSBundle *bundlePath = [NSBundle bundleWithPath:@"/System/Library/PrivateFrameworks/TelephonyUtilities.framework"];
 if ([bundlePath load]) {   
    Class TUCallCenter = NSClassFromString(@"TUCallCenter");
    id tuCallCenter = [TUCallCenter sharedInstance];
}

但是 none 的 TUCallCenter 方法允许我从我的应用程序发起电话呼叫。尽管有定义的方法可用。 其中一些是:

- (id)_dial:(id)arg1 callID:(int)arg2 service:(int)arg3 sourceIdentifier:(id)arg4 dialType:(int)arg5 uniqueProxyIdentifier:(id)arg6;
- (id)_dialWithRequest:(id)arg1 completion:(id /* block */)arg2;
- (id)callWithCallUUID:(id)arg1;
- (id)callWithStatus:(int)arg1;
- (id)callWithUniqueProxyIdentifier:(id)arg1;
- (id)callsWithStatus:(int)arg1;
- (id)dial:(id)arg1 callID:(int)arg2 service:(int)arg3;
- (id)dial:(id)arg1 callID:(int)arg2 service:(int)arg3 sourceIdentifier:(id)arg4 uniqueProxyIdentifier:(id)arg5;
- (id)dial:(id)arg1 service:(int)arg2;
- (id)dialEmergency:(id)arg1;
- (id)dialEmergency:(id)arg1 sourceIdentifier:(id)arg2;
- (id)dialWithRequest:(id)arg1;
- (void)dialWithRequest:(id)arg1 completion:(id /* block */)arg2;

不是没有越狱(编辑:或者不使用私有框架,用于私有发布的应用程序)恐怕。

CallKit 旨在使您的 VoIP 通话显示在 Phone 应用程序中,就像这里的这些一样。 CallKit 还可以使您的 VoIP 应用程序的呼叫对用户来说就像普通语音呼叫一样。

您正在寻找的东西需要一个私有框架,但在这种情况下,您要么为越狱版本编码,要么为您的客户编写私有版本。为此,您可能需要查看 TelephonyUtilities.framework。检查一下 here. TUCall seems to be a call object through which you can get the details or end it, while TUCallCenter 有一个 incomingCalls 方法。所以这确实可以工作,只是在私人版本中,而不是 App Store 应用程序。

CallKit

显示您应用的 VoIP 服务的系统呼叫 UI,并协调您的呼叫服务与其他应用和系统。


概览

CallKit 可让您将呼叫服务与系统上其他与呼叫相关的应用集成。 CallKit 提供呼叫接口,您处理与您的 VoIP 服务的后端通信。对于来电和去电,CallKit 显示与 Phone 应用程序相同的界面,使您的应用程序具有更原生的外观和感觉。 CallKit 会适当地响应系统级行为,例如“请勿打扰”。

除了处理电话外,您还可以提供一个 Call Directory 应用程序扩展,以提供来电显示信息和与您的服务相关的已阻止号码列表。

正在接收来电

直接接收来电方法会导致 VOIP 应用程序中使用的 PushKit 静默通知。

// MARK: PKPushRegistryDelegate
func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, forType type: PKPushType) {
    // report new incoming call
}

因此,除了 VOIP 应用程序之外,没有机会使用 CallKit。

https://developer.apple.com/documentation/callkit

希望这有助于理解场景。