通话为视频时,在CallKit来电屏幕中显示视频按钮

我正在使用以下代码接收视频通话。我的应用程序具有音频和视频通话功能,并且我正在使用linphone + CallKit。

- (void)config {
    CXProviderConfiguration *config = [[CXProviderConfiguration alloc]
                                       initWithLocalizedName:[NSBundle.mainBundle objectForInfoDictionaryKey:@"CFBundleName"]];
    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];


    self.provider = [[CXProvider alloc] initWithConfiguration:config];
    [self.provider setDelegate:self queue:dispatch_get_main_queue()];
}



- (void)reportIncomingCall:(LinphoneCall *) call withUUID:(NSUUID *)uuid handle:(NSString *)handle video:(BOOL)video
{
    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 = video;
    linphone_call_ref(call);
    // Report incoming call to system
    LOGD(@"CallKit: report new incoming call");

    [self.provider reportNewIncomingCallWithUUID:uuid
                                          update:update
                                      completion:^(NSError *error) {
                                          if (error) {
                                              LOGE(@"CallKit: cannot complete incoming call from [%@] caused by [%@]",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);
                                              }
                                          }
                                          linphone_call_unref(call);
                                      }];
}

请参阅随附的视频通话UI的屏幕截图。它显示用于音频和视频通话的相同UI(按钮)。我想在视频通话时显示视频通话按钮。是否可以使用CallKit?如果可能,需要进行哪些更改?预先感谢。

通话为视频时,在CallKit来电屏幕中显示视频按钮

zhaojiejie 回答:通话为视频时,在CallKit来电屏幕中显示视频按钮

否,不幸的是,无法自定义CallKit来电UI。这就是为什么诸如WhatApp之类的应用程序使用推送通知来通知视频通话,而不是依靠CallKit的原因。

,

请查看此演示。 CallKit 有一个 supportsVideo 的属性 CXProviderConfiguration 和一个 hasVideo 的属性 CXHandle。 它对我来说很好用。检查下面的演示链接。

https://websitebeaver.com/callkit-swift-tutorial-super-easy

func setupVdeoCall() {
        let config = CXProviderConfiguration(localizedName: "My App")
        config.iconTemplateImageData = UIImagePNGRepresentation(UIImage(named: "pizza")!)
        config.ringtoneSound = "ringtone.caf"
        config.includesCallsInRecents = false;
        config.supportsVideo = true;
        let provider = CXProvider(configuration: config)
        provider.setDelegate(self,queue: nil)
        let update = CXCallUpdate()
        update.remoteHandle = CXHandle(type: .generic,value: "Pete Za")
        update.hasVideo = true
        provider.reportNewIncomingCall(with: UUID(),update: update,completion: { error in })
    }

所以只需在 ProviderDelegate.swift 文件中进行修改,如下所示。

    static var providerConfiguration: CXProviderConfiguration {
        let localizedName = NSLocalizedString("CallKitDemo",comment: "Name of application")
        let providerConfiguration = CXProviderConfiguration(localizedName: localizedName)

        providerConfiguration.supportsVideo = true. //For Video Call Enable
        
        providerConfiguration.includesCallsInRecents = false; //Show hide from phone recent call history
        
        providerConfiguration.maximumCallsPerCallGroup = 1

        providerConfiguration.supportedHandleTypes = [.phoneNumber]

        providerConfiguration.iconTemplateImageData = #imageLiteral(resourceName: "IconMask").pngData()

        providerConfiguration.ringtoneSound = "Ringtone.caf"
        
        return providerConfiguration
    }

和reportIncomingCall()

func reportIncomingCall(uuid: UUID,handle: String,hasVideo: Bool = false,completion: ((NSError?) -> Void)? = nil) {
        // Construct a CXCallUpdate describing the incoming call,including the caller.
        let update = CXCallUpdate()
        update.remoteHandle = CXHandle(type: .phoneNumber,value: handle)
        update.hasVideo = hasVideo //For Video Call available or not

        // pre-heat the AVAudioSession
        //OTAudioDeviceManager.setAudioDevice(OTDefaultAudioDevice.sharedInstance())
        
        // Report the incoming call to the system
        provider.reportNewIncomingCall(with: uuid,update: update) { error in
            /*
                Only add incoming call to the app's list of calls if the call was allowed (i.e. there was no error)
                since calls may be "denied" for various legitimate reasons. See CXErrorCodeIncomingCallError.
             */
            if error == nil {
                let call = SpeakerboxCall(uuid: uuid)
                call.handle = handle

                self.callManager.addCall(call)
            }
            
            completion?(error as NSError?)
        }
    }
本文链接:https://www.f2er.com/3151811.html

大家都在问