From b469805b2d0c9b23ca020cf9356ff137205f856c Mon Sep 17 00:00:00 2001 From: 464027401@qq.com <464027401@qq.com> Date: 星期一, 27 九月 2021 10:22:10 +0800 Subject: [PATCH] 修复来点页面重复呼叫时alert位置不对问题 --- HDLLinPhoneSDK(OC)/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.m | 418 +++++++++++++++++++++++++++++----------------------------- 1 files changed, 209 insertions(+), 209 deletions(-) diff --git "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.m" "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.m" index 36ef23d..fa0b143 100644 --- "a/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.m" +++ "b/HDLLinPhoneSDK\357\274\210OC\357\274\211/HDLLinPhoneSDK/HDLLinphoneProviderDelegate.m" @@ -35,10 +35,10 @@ self.pendingCall = NULL; self.pendingAddr = NULL; self.pendingCallVideo = FALSE; - CXCallController *callController = [[CXCallController alloc] initWithQueue:dispatch_get_main_queue()]; - [callController.callObserver setDelegate:self queue:dispatch_get_main_queue()]; - self.controller = callController; - self.callKitCalls = 0; +// CXCallController *callController = [[CXCallController alloc] initWithQueue:dispatch_get_main_queue()]; +// [callController.callObserver setDelegate:self queue:dispatch_get_main_queue()]; +// self.controller = callController; + self.callKCalls = 0; if (!self) { NSLog(@"ProviderDelegate not initialized..."); @@ -47,21 +47,21 @@ } - (void)config { - CXProviderConfiguration *config = [[CXProviderConfiguration alloc] - initWithLocalizedName:[NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]]; - config.ringtoneSound = @"notes_of_the_optimistic.caf"; - config.supportsVideo = TRUE; - config.iconTemplateImageData = UIImagePNGRepresentation([UIImage imageNamed:@"callkit_logo"]); - - NSArray *ar = @[ [NSNumber numberWithInt:(int)CXHandleTypeGeneric] ]; - NSSet *handleTypes = [[NSSet alloc] initWithArray:ar]; - [config setSupportedHandleTypes:handleTypes]; - [config setMaximumCallGroups:2]; - [config setMaximumCallsPerCallGroup:1]; - //not show app's calls in tel's history - //config.includesCallsInRecents = NO; - self.provider = [[CXProvider alloc] initWithConfiguration:config]; - [self.provider setDelegate:self queue:dispatch_get_main_queue()]; +// CXProviderConfiguration *config = [[CXProviderConfiguration alloc] +// initWithLocalizedName:[NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleDisplayName"]]; +// config.ringtoneSound = @"notes_of_the_optimistic.caf"; +// config.supportsVideo = TRUE; +// config.iconTemplateImageData = UIImagePNGRepresentation([UIImage imageNamed:@"callkit_logo"]); +// +// NSArray *ar = @[ [NSNumber numberWithInt:(int)CXHandleTypeGeneric] ]; +// NSSet *handleTypes = [[NSSet alloc] initWithArray:ar]; +// [config setSupportedHandleTypes:handleTypes]; +// [config setMaximumCallGroups:2]; +// [config setMaximumCallsPerCallGroup:1]; +// //not show app's calls in tel's history +// //config.includesCallsInRecents = NO; +// self.provider = [[CXProvider alloc] initWithConfiguration:config]; +// [self.provider setDelegate:self queue:dispatch_get_main_queue()]; } - (void)configAudioSession:(AVAudioSession *)audioSession { @@ -87,32 +87,32 @@ } } -- (void)reportIncomingCall:(LinphoneCall *) call withUUID:(NSUUID *)uuid handle:(NSString *)handle video:(BOOL)video; { - // Create update to describe the incoming call and caller - CXCallUpdate *update = [[CXCallUpdate alloc] init]; - update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:handle]; - update.supportsDTMF = TRUE; - update.supportsHolding = TRUE; - update.supportsGrouping = TRUE; - update.supportsUngrouping = TRUE; - update.hasVideo = _pendingCallVideo = video; - - // Report incoming call to system -// LOGD(@"CallKit: report new incoming call with call-id: [%@] and UUID: [%@]", [_calls objectForKey:uuid], uuid); - [self.provider reportNewIncomingCallWithUUID:uuid - update:update - completion:^(NSError *error) { - if (error) { -// LOGE(@"CallKit: cannot complete incoming call with call-id: [%@] and UUID: [%@] from [%@] caused by [%@]", -// [_calls objectForKey:uuid], uuid, handle, [error localizedDescription]); - if ([error code] == CXErrorCodeIncomingCallErrorFilteredByDoNotDisturb || - [error code] == CXErrorCodeIncomingCallErrorFilteredByBlockList) - linphone_call_decline(call,LinphoneReasonBusy); /*to give a chance for other devices to answer*/ - else - linphone_call_decline(call,LinphoneReasonUnknown); - } - }]; -} +//- (void)reportIncomingCall:(LinphoneCall *) call withUUID:(NSUUID *)uuid handle:(NSString *)handle video:(BOOL)video; { +// // Create update to describe the incoming call and caller +// CXCallUpdate *update = [[CXCallUpdate alloc] init]; +// update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypeGeneric value:handle]; +// update.supportsDTMF = TRUE; +// update.supportsHolding = TRUE; +// update.supportsGrouping = TRUE; +// update.supportsUngrouping = TRUE; +// update.hasVideo = _pendingCallVideo = video; +// +// // Report incoming call to system +//// LOGD(@"CallKit: report new incoming call with call-id: [%@] and UUID: [%@]", [_calls objectForKey:uuid], uuid); +// [self.provider reportNewIncomingCallWithUUID:uuid +// update:update +// completion:^(NSError *error) { +// if (error) { +//// LOGE(@"CallKit: cannot complete incoming call with call-id: [%@] and UUID: [%@] from [%@] caused by [%@]", +//// [_calls objectForKey:uuid], uuid, handle, [error localizedDescription]); +// if ([error code] == CXErrorCodeIncomingCallErrorFilteredByDoNotDisturb || +// [error code] == CXErrorCodeIncomingCallErrorFilteredByBlockList) +// linphone_call_decline(call,LinphoneReasonBusy); /*to give a chance for other devices to answer*/ +// else +// linphone_call_decline(call,LinphoneReasonUnknown); +// } +// }]; +//} - (void)setPendingCall:(LinphoneCall *)pendingCall { if (pendingCall) { @@ -127,177 +127,177 @@ #pragma mark - CXProviderDelegate Protocol -- (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action { - NSUUID *uuid = action.callUUID; - NSString *callID = [self.calls objectForKey:uuid]; // first, make sure this callid is not already involved in a call -// LOGD(@"CallKit: Answering call with call-id: [%@] and UUID: [%@]", callID, uuid); - [self configAudioSession:[AVAudioSession sharedInstance]]; - [action fulfill]; - LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID]; - if (!call) - return; +//- (void)provider:(CXProvider *)provider performAnswerCallAction:(CXAnswerCallAction *)action { +// NSUUID *uuid = action.callUUID; +// NSString *callID = [self.calls objectForKey:uuid]; // first, make sure this callid is not already involved in a call +//// LOGD(@"CallKit: Answering call with call-id: [%@] and UUID: [%@]", callID, uuid); +// [self configAudioSession:[AVAudioSession sharedInstance]]; +// [action fulfill]; +// LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID]; +// if (!call) +// return; +// +// self.callKitCalls++; +// self.pendingCall = call; +//} - self.callKitCalls++; - self.pendingCall = call; -} - -- (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action { - NSUUID *uuid = action.callUUID; - NSString *callID = [self.calls objectForKey:uuid]; // first, make sure this callid is not already involved in a call - NSLog(@"CallKit: Starting Call with call-id: [%@] and UUID: [%@]", callID, uuid); - // To restart Audio Unit - [self configAudioSession:[AVAudioSession sharedInstance]]; - [action fulfill]; - LinphoneCall *call; - if (![callID isEqualToString:@""]) { - call = linphone_core_get_current_call(LC); - } else { - call = [HDLLinphoneManager.instance callByCallId:callID]; - } - if (call != NULL) { - self.callKitCalls++; - self.pendingCall = call; - } -} - -- (void)provider:(CXProvider *)provider performEndCallAction:(CXEndCallAction *)action { - self.callKitCalls--; - [action fulfill]; - if (linphone_core_is_in_conference(LC)) { - HDLLinphoneManager.instance.conf = TRUE; - linphone_core_terminate_conference(LC); -// LOGD(@"CallKit: Ending the conference"); - } else if (linphone_core_get_calls_nb(LC) > 1) { - HDLLinphoneManager.instance.conf = TRUE; - linphone_core_terminate_all_calls(LC); -// LOGD(@"CallKit: Ending all the ongoing calls"); - } else { - NSUUID *uuid = action.callUUID; - NSString *callID = [self.calls objectForKey:uuid]; - if (callID) { -// LOGD(@"CallKit: Ending the call with call-id: [%@] and UUID: [%@]", callID, uuid); - LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID]; - if (call) { - linphone_call_terminate((LinphoneCall *)call); - } - [self.uuids removeObjectForKey:callID]; - [self.calls removeObjectForKey:uuid]; - } - } -} - -- (void)provider:(CXProvider *)provider performSetMutedCallAction:(nonnull CXSetMutedCallAction *)action { - [action fulfill]; -// if ([[PhoneMainView.instance currentView] equal:CallView.compositeViewDescription]) { -// CallView *view = (CallView *)[PhoneMainView.instance popToView:CallView.compositeViewDescription]; -// [view.microButton toggle]; +//- (void)provider:(CXProvider *)provider performStartCallAction:(CXStartCallAction *)action { +// NSUUID *uuid = action.callUUID; +// NSString *callID = [self.calls objectForKey:uuid]; // first, make sure this callid is not already involved in a call +// NSLog(@"CallKit: Starting Call with call-id: [%@] and UUID: [%@]", callID, uuid); +// // To restart Audio Unit +// [self configAudioSession:[AVAudioSession sharedInstance]]; +// [action fulfill]; +// LinphoneCall *call; +// if (![callID isEqualToString:@""]) { +// call = linphone_core_get_current_call(LC); +// } else { +// call = [HDLLinphoneManager.instance callByCallId:callID]; // } -} +// if (call != NULL) { +// self.callKitCalls++; +// self.pendingCall = call; +// } +//} -- (void)provider:(CXProvider *)provider performSetHeldCallAction:(nonnull CXSetHeldCallAction *)action { - [action fulfill]; - if (linphone_core_is_in_conference(LC) && action.isOnHold) { - linphone_core_leave_conference(LC); -// LOGD(@"CallKit: Leaving conference"); - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self]; - return; - } +//- (void)provider:(CXProvider *)provider performEndCallAction:(CXEndCallAction *)action { +// self.callKitCalls--; +// [action fulfill]; +// if (linphone_core_is_in_conference(LC)) { +// HDLLinphoneManager.instance.conf = TRUE; +// linphone_core_terminate_conference(LC); +//// LOGD(@"CallKit: Ending the conference"); +// } else if (linphone_core_get_calls_nb(LC) > 1) { +// HDLLinphoneManager.instance.conf = TRUE; +// linphone_core_terminate_all_calls(LC); +//// LOGD(@"CallKit: Ending all the ongoing calls"); +// } else { +// NSUUID *uuid = action.callUUID; +// NSString *callID = [self.calls objectForKey:uuid]; +// if (callID) { +//// LOGD(@"CallKit: Ending the call with call-id: [%@] and UUID: [%@]", callID, uuid); +// LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID]; +// if (call) { +// linphone_call_terminate((LinphoneCall *)call); +// } +// [self.uuids removeObjectForKey:callID]; +// [self.calls removeObjectForKey:uuid]; +// } +// } +//} - if (linphone_core_get_calls_nb(LC) > 1 && action.isOnHold) { - linphone_core_pause_all_calls(LC); -// LOGD(@"CallKit: Pausing all ongoing calls"); - return; - } +//- (void)provider:(CXProvider *)provider performSetMutedCallAction:(nonnull CXSetMutedCallAction *)action { +// [action fulfill]; +//// if ([[PhoneMainView.instance currentView] equal:CallView.compositeViewDescription]) { +//// CallView *view = (CallView *)[PhoneMainView.instance popToView:CallView.compositeViewDescription]; +//// [view.microButton toggle]; +//// } +//} - NSUUID *uuid = action.callUUID; - NSString *callID = [self.calls objectForKey:uuid]; - if (!callID) { - return; - } +//- (void)provider:(CXProvider *)provider performSetHeldCallAction:(nonnull CXSetHeldCallAction *)action { +// [action fulfill]; +// if (linphone_core_is_in_conference(LC) && action.isOnHold) { +// linphone_core_leave_conference(LC); +//// LOGD(@"CallKit: Leaving conference"); +// [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self]; +// return; +// } +// +// if (linphone_core_get_calls_nb(LC) > 1 && action.isOnHold) { +// linphone_core_pause_all_calls(LC); +//// LOGD(@"CallKit: Pausing all ongoing calls"); +// return; +// } +// +// NSUUID *uuid = action.callUUID; +// NSString *callID = [self.calls objectForKey:uuid]; +// if (!callID) { +// return; +// } +// +//// LOGD(@"CallKit: Call with call-id: [%@] and UUID: [%@] paused status changed to: []", callID, uuid, action.isOnHold ? @"Paused" : @"Resumed"); +// LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID]; +// if (!call) +// return; +// +// if (action.isOnHold) { +// HDLLinphoneManager.instance.speakerBeforePause = HDLLinphoneManager.instance.speakerEnabled; +// linphone_call_pause((LinphoneCall *)call); +// } else { +// if (linphone_core_get_conference(LC)) { +// linphone_core_enter_conference(LC); +// [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self]; +// } else { +// [self configAudioSession:[AVAudioSession sharedInstance]]; +// self.pendingCall = call; +// } +// } +//} -// LOGD(@"CallKit: Call with call-id: [%@] and UUID: [%@] paused status changed to: []", callID, uuid, action.isOnHold ? @"Paused" : @"Resumed"); - LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID]; - if (!call) - return; +//- (void)provider:(CXProvider *)provider performPlayDTMFCallAction:(CXPlayDTMFCallAction *)action { +// [action fulfill]; +// NSUUID *uuid = action.callUUID; +// NSString *callID = [self.calls objectForKey:uuid]; +//// LOGD(@"CallKit: playing DTMF for call with call-id: [%@] and UUID: [%@]", callID, uuid); +// LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID]; +// char digit = action.digits.UTF8String[0]; +// linphone_call_send_dtmf((LinphoneCall *)call, digit); +//} - if (action.isOnHold) { - HDLLinphoneManager.instance.speakerBeforePause = HDLLinphoneManager.instance.speakerEnabled; - linphone_call_pause((LinphoneCall *)call); - } else { - if (linphone_core_get_conference(LC)) { - linphone_core_enter_conference(LC); - [NSNotificationCenter.defaultCenter postNotificationName:kLinphoneCallUpdate object:self]; - } else { - [self configAudioSession:[AVAudioSession sharedInstance]]; - self.pendingCall = call; - } - } -} +//- (void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession { +// NSLog(@"CallKit: Audio session activated"); +// // Now we can (re)start the call +// if (self.pendingCall) { +// LinphoneCallState state = linphone_call_get_state(self.pendingCall); +// switch (state) { +// case LinphoneCallIncomingReceived: +// [HDLLinphoneManager.instance acceptCall:(LinphoneCall *)self.pendingCall evenWithVideo:_pendingCallVideo]; +// break; +// case LinphoneCallPaused: +// linphone_call_resume((LinphoneCall *)self.pendingCall); +// break; +// case LinphoneCallStreamsRunning: +// // May happen when multiple calls +// break; +// default: +// break; +// } +// } else { +// if (_pendingAddr) { +// [HDLLinphoneManager.instance doCall:_pendingAddr]; +// } else { +//// LOGE(@"CallKit: No pending call"); +// } +// } +// +// [self setPendingCall:NULL]; +// if (_pendingAddr) +// linphone_address_unref(_pendingAddr); +// _pendingAddr = NULL; +// _pendingCallVideo = FALSE; +//} +// +//- (void)provider:(CXProvider *)provider didDeactivateAudioSession:(nonnull AVAudioSession *)audioSession { +// NSLog(@"CallKit : Audio session deactivated"); +// [self setPendingCall:NULL]; +// if (_pendingAddr) +// linphone_address_unref(_pendingAddr); +// _pendingAddr = NULL; +// _pendingCallVideo = FALSE; +//} -- (void)provider:(CXProvider *)provider performPlayDTMFCallAction:(CXPlayDTMFCallAction *)action { - [action fulfill]; - NSUUID *uuid = action.callUUID; - NSString *callID = [self.calls objectForKey:uuid]; -// LOGD(@"CallKit: playing DTMF for call with call-id: [%@] and UUID: [%@]", callID, uuid); - LinphoneCall *call = [HDLLinphoneManager.instance callByCallId:callID]; - char digit = action.digits.UTF8String[0]; - linphone_call_send_dtmf((LinphoneCall *)call, digit); -} - -- (void)provider:(CXProvider *)provider didActivateAudioSession:(AVAudioSession *)audioSession { - NSLog(@"CallKit: Audio session activated"); - // Now we can (re)start the call - if (self.pendingCall) { - LinphoneCallState state = linphone_call_get_state(self.pendingCall); - switch (state) { - case LinphoneCallIncomingReceived: - [HDLLinphoneManager.instance acceptCall:(LinphoneCall *)self.pendingCall evenWithVideo:_pendingCallVideo]; - break; - case LinphoneCallPaused: - linphone_call_resume((LinphoneCall *)self.pendingCall); - break; - case LinphoneCallStreamsRunning: - // May happen when multiple calls - break; - default: - break; - } - } else { - if (_pendingAddr) { - [HDLLinphoneManager.instance doCall:_pendingAddr]; - } else { -// LOGE(@"CallKit: No pending call"); - } - } - - [self setPendingCall:NULL]; - if (_pendingAddr) - linphone_address_unref(_pendingAddr); - _pendingAddr = NULL; - _pendingCallVideo = FALSE; -} - -- (void)provider:(CXProvider *)provider didDeactivateAudioSession:(nonnull AVAudioSession *)audioSession { - NSLog(@"CallKit : Audio session deactivated"); - [self setPendingCall:NULL]; - if (_pendingAddr) - linphone_address_unref(_pendingAddr); - _pendingAddr = NULL; - _pendingCallVideo = FALSE; -} - -- (void)providerDidReset:(CXProvider *)provider { -// LOGD(@"CallKit: Provider reset"); - HDLLinphoneManager.instance.conf = TRUE; - linphone_core_terminate_all_calls(LC); - [self.calls removeAllObjects]; - [self.uuids removeAllObjects]; -} - -#pragma mark - CXCallObserverDelegate Protocol - -- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call { - NSLog(@"CallKit: Call changed"); -} +//- (void)providerDidReset:(CXProvider *)provider { +//// LOGD(@"CallKit: Provider reset"); +// HDLLinphoneManager.instance.conf = TRUE; +// linphone_core_terminate_all_calls(LC); +// [self.calls removeAllObjects]; +// [self.uuids removeAllObjects]; +//} +// +//#pragma mark - CXCallObserverDelegate Protocol +// +//- (void)callObserver:(CXCallObserver *)callObserver callChanged:(CXCall *)call { +// NSLog(@"CallKit: Call changed"); +//} @end -- Gitblit v1.8.0