CallKit 重新初始化导致 com.apple.CallKit.error.requesttransaction Code=4 (UnknownCallUUID)
CallKit reinitializing causes com.apple.CallKit.error.requesttransaction Code=4 (UnknownCallUUID)
我的 iOS VoIP 应用程序使用 CallKit 来支持本机呼叫集成功能。一开始启动一切正常,但如果我重新初始化 CXProvider 和 CXCallController(为了 disable/enable 功能),来电挂断后我收到错误 "com.apple.CallKit.error.requesttransaction Code=4".
@implementation CallKitHandler
- (void) configureCallKitWith
{
...
self.callKitProvider = [[CXProvider alloc] initWithConfiguration:_cxpConfiguration];
[_callKitProvider setDelegate:self queue:nil];
self.callKitCallController = [CXCallController new];
[_callKitCallController.callObserver setDelegate:self queue:nil];
...
}
- (void) requestEndCallActionWithCall:(Call*) callEnded
{
CXEndCallAction* endCallAction = [[CXEndCallAction alloc] initWithCallUUID:self.callUUId];
CXTransaction* transaction = [[CXTransaction alloc] initWithAction:endCallAction];
OTCLogVerbose (@"requestEndCallActionWithCall '%@' : %@", callEnded.reference, transaction);
[self.callKitCallController requestTransaction:transaction completion:^(NSError* error) {
if (error)
{
OTCLogWarn (@"requestEndCallActionWithCall failed for '%@': %@", _callUUId, [self errorDescriptionOf: error]);
我试图让我的 CallKitHandler class 成为单例,它似乎工作正常,这是唯一可能的解决方案吗?您应该避免在应用运行时重新初始化 CallKit 吗?
A VoIP app should create only one instance of CXProvider
and store it for use globally.
所以,是的:您应该避免每次要重新配置时都实例化 CXProvider
。只保留一个全局引用并在需要时重新配置它。
我的 iOS VoIP 应用程序使用 CallKit 来支持本机呼叫集成功能。一开始启动一切正常,但如果我重新初始化 CXProvider 和 CXCallController(为了 disable/enable 功能),来电挂断后我收到错误 "com.apple.CallKit.error.requesttransaction Code=4".
@implementation CallKitHandler
- (void) configureCallKitWith
{
...
self.callKitProvider = [[CXProvider alloc] initWithConfiguration:_cxpConfiguration];
[_callKitProvider setDelegate:self queue:nil];
self.callKitCallController = [CXCallController new];
[_callKitCallController.callObserver setDelegate:self queue:nil];
...
}
- (void) requestEndCallActionWithCall:(Call*) callEnded
{
CXEndCallAction* endCallAction = [[CXEndCallAction alloc] initWithCallUUID:self.callUUId];
CXTransaction* transaction = [[CXTransaction alloc] initWithAction:endCallAction];
OTCLogVerbose (@"requestEndCallActionWithCall '%@' : %@", callEnded.reference, transaction);
[self.callKitCallController requestTransaction:transaction completion:^(NSError* error) {
if (error)
{
OTCLogWarn (@"requestEndCallActionWithCall failed for '%@': %@", _callUUId, [self errorDescriptionOf: error]);
我试图让我的 CallKitHandler class 成为单例,它似乎工作正常,这是唯一可能的解决方案吗?您应该避免在应用运行时重新初始化 CallKit 吗?
A VoIP app should create only one instance of
CXProvider
and store it for use globally.
所以,是的:您应该避免每次要重新配置时都实例化 CXProvider
。只保留一个全局引用并在需要时重新配置它。