Flutter集成Voximplant呼叫功能插件flutter_callkit_voximplant的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter集成Voximplant呼叫功能插件flutter_callkit_voximplant的使用

flutter_callkit_voximplant

Flutter SDK用于在iOS上将CallKit集成到Flutter应用程序中。

支持iOS >= 10。

我们写了一篇文章介绍这个插件 - “我们如何使Flutter与CallKit Call Directory协同工作”。 文章提供 英文俄文 版本。

安装

  1. pubspec.yaml文件中添加flutter_callkit_voximplant依赖。
  2. <project root>/ios/Runner/Info.plist文件中添加以下条目,以确保CallKit正常工作:
    <key>UIBackgroundModes</key>
    <array>
      <string>voip</string>
    </array>
    

使用方法

SDK的API尽可能地接近iOS的CallKit框架。可以参考官方文档获取更多信息。以下是主要的不同点:

  • 使用FlutterCallkitPlugin.sharedInstance.reportNewIncomingCallWithUUID:来报告通过VoIP推送通知接收到的新来电。
  • 使用FlutterCallkitPlugin.sharedInstance.hasCallWithUUID:来检查CallKit是否已经有了给定UUID的通话。
  • 使用FCXPlugin.didDisplayIncomingCall处理用reportNewIncomingCallWithUUID报告的来电。
  • 使用FCXPlugin.logLevel调整日志级别。
  • 使用FCXPlugin.processPushCompletion执行从推送接收的完成块(仅限iOS 11及以上)。
  • FCXCallControllerFCXProvider只能是单例模式。

注意:传递给FCXProvider的UUID将被CallKit转换为大写。

初始化

import 'package:flutter_callkit_voximplant/flutter_callkit_voximplant.dart';

// 初始化主插件类:
FCXPlugin _plugin = FCXPlugin();
// 初始化主CallKit类:
FCXProvider _provider = FCXProvider();
FCXCallController _callController = FCXCallController();

try {
  await _callController.configure();
  await _provider.configure(FCXProviderConfiguration('ExampleLocalizedName'));
} catch (_) {
  // 处理异常
}

拨打出站电话

Future<void> makeCall(String contactName, String uuid) async {
  FCXHandle handle = FCXHandle(FCXHandleType.Generic, contactName);
  FCXStartCallAction action = FCXStartCallAction(uuid, handle);
  await _callController.requestTransactionWithAction(action);
}

_provider.performStartCallAction = (startCallAction) async {
  // 配置音频会话
  await startCallAction.fulfill();
};

接收来电

Future<void> handleIncomingCall(String contactName, String uuid) async {
  FCXCallUpdate callUpdate = FCXCallUpdate(localizedCallerName: contactName);
  await _provider.reportNewIncomingCall(uuid, callUpdate);
}

_provider.performAnswerCallAction = (answerCallAction) async {
  // 配置音频会话
  await answerCallAction.fulfill();
};

处理推送通知

由于iOS 13对PushKit VoIP的限制,推送处理必须通过原生iOS代码进行。flutter_callkit_voximplant提供了内置的reportNewIncomingCallWithUUID:callUpdate:providerConfiguration:pushProcessingCompletion:方法来正确处理推送通知。

Swift示例

import Flutter
import flutter_callkit_voximplant
import PushKit
import CallKit

class AppDelegate: FlutterAppDelegate, PKPushRegistryDelegate {
    func pushRegistry(_ registry: PKPushRegistry,
                      didReceiveIncomingPushWith payload: PKPushPayload,
                      for type: PKPushType) {
        processPush(with: payload.dictionaryPayload, and: nil)
    }

    func pushRegistry(_ registry: PKPushRegistry,
                      didReceiveIncomingPushWith payload: PKPushPayload,
                      for type: PKPushType,
                      completion: @escaping () -> Void) {
        processPush(with: payload.dictionaryPayload, and: completion)
    }

    private func processPush(with payload: Dictionary<AnyHashable, Any>,
                             and completion: (() -> Void)?) {
        guard let uuidString = payload["UUID"] as? String,
            let uuid = UUID(uuidString: uuidString),
            let localizedName = payload["identifier"] as? String else {
                return
        }
        
        let callUpdate = CXCallUpdate()
        callUpdate.localizedCallerName = localizedName
        
        let configuration = CXProviderConfiguration(localizedName: "ExampleLocalizedName")
        
        FlutterCallkitPlugin.sharedInstance.reportNewIncomingCall(
            with: uuid,
            callUpdate: callUpdate,
            providerConfiguration: configuration,
            pushProcessingCompletion: completion
        )
    }
}

Objective-C 示例

#import <Flutter/Flutter.h>
#import <FlutterCallkitPlugin.h>
#import <PushKit/PushKit.h>
#import <CallKit/CallKit.h>

@interface AppDelegate : FlutterAppDelegate<PKPushRegistryDelegate>

@end

@implementation AppDelegate

- (void)pushRegistry:(PKPushRegistry *)registry
didReceiveIncomingPushWithPayload:(PKPushPayload *)payload
                          forType:(PKPushType)type {
    [self processPushWithPayload:payload.dictionaryPayload 
            andCompletionHandler:nil];
}

- (void)pushRegistry:(PKPushRegistry *)registry
didReceiveIncomingPushWithPayload:(PKPushPayload *)payload
                          forType:(PKPushType)type
            withCompletionHandler:(void (^)(void))completion {
    [self processPushWithPayload:payload.dictionaryPayload
            andCompletionHandler:completion];
}

-(void)processPushWithPayload:(NSDictionary *)payload
         andCompletionHandler:(dispatch_block_t)completion {
    NSUUID *UUID = [[NSUUID alloc] initWithUUIDString:payload[@"UUID"]];
    NSString *localizedName = payload[@"identifier"];
    
    CXCallUpdate *callUpdate = [CXCallUpdate new];
    callUpdate.localizedCallerName = localizedName;
    
    CXProviderConfiguration *configuration =
        [[CXProviderConfiguration alloc]
              initWithLocalizedName:@"ExampleLocalizedName"];
              
    [FlutterCallkitPlugin.sharedInstance reportNewIncomingCallWithUUID:UUID
                                                            callUpdate:callUpdate
                                                 providerConfiguration:configuration
                                              pushProcessingCompletion:completion];
}
@end

Call Blocking and Identification

应用程序可以通过创建Call Directory应用扩展来识别和阻止来电者。更多详细信息请参阅官方文档

参考资料

示例项目

查看完整的示例项目以了解如何实现上述功能,请访问GitHub仓库中的示例项目

希望这些信息可以帮助您成功集成flutter_callkit_voximplant到您的Flutter项目中。如果您有任何问题或需要进一步的帮助,请随时提问!


更多关于Flutter集成Voximplant呼叫功能插件flutter_callkit_voximplant的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter集成Voximplant呼叫功能插件flutter_callkit_voximplant的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中集成并使用flutter_callkit_voximplant插件来实现Voximplant呼叫功能的示例代码。这个插件结合了Voximplant的SDK和iOS/Android的原生CallKit/ConnectionService来实现来电显示和呼叫管理功能。

前提条件

  1. 确保你已经在Flutter项目中添加了flutter_callkit_voximplant依赖。
  2. 你已经有一个Voximplant账户,并获取了必要的API凭证(如SDK密钥)。

步骤 1: 添加依赖

在你的pubspec.yaml文件中添加flutter_callkit_voximplant依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_callkit_voximplant: ^最新版本号

然后运行flutter pub get来获取依赖。

步骤 2: 配置Voximplant

你需要在你的应用中配置Voximplant。这通常涉及到设置SDK密钥和初始化SDK。

iOS 配置

ios/Runner/Info.plist中添加必要的权限,比如麦克风权限:

<key>NSMicrophoneUsageDescription</key>
<string>App needs access to microphone</string>

Android 配置

android/app/src/main/AndroidManifest.xml中添加麦克风权限:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

步骤 3: 初始化Voximplant和CallKit

在你的Flutter应用中初始化Voximplant和flutter_callkit_voximplant插件。

import 'package:flutter/material.dart';
import 'package:flutter_callkit_voximplant/flutter_callkit_voximplant.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  void initState() {
    super.initState();
    _initVoximplant();
  }

  Future<void> _initVoximplant() async {
    // 替换为你的Voximplant SDK密钥
    String sdkKey = 'YOUR_VOXIMPLANT_SDK_KEY';

    // 初始化Voximplant
    await FlutterCallkitVoximplant.initializeVoximplant(sdkKey);

    // 配置CallKit(仅iOS)
    await FlutterCallkitVoximplant.configureCallKit(
      appName: 'MyApp',
      appIcon: 'assets/icon', // 确保在pubspec.yaml中声明了此资源
      localizedName: 'My Application',
      handlesCallsUsingCallKit: true,
    );

    // 设置来电显示(仅iOS)
    await FlutterCallkitVoximplant.setCallerId('YourCallerID', 'Caller Name');

    // 监听来电事件
    FlutterCallkitVoximplant.listenForIncomingCall().listen((call) {
      // 处理来电,例如显示来电界面
      print('Incoming call: ${call.toMap()}');
      // 在这里添加你的来电处理逻辑
    });

    // 监听呼叫结束事件
    FlutterCallkitVoximplant.listenForCallEnded().listen((call) {
      // 处理呼叫结束
      print('Call ended: ${call.toMap()}');
      // 在这里添加你的呼叫结束处理逻辑
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Voximplant CallKit Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 发起呼叫示例(替换为实际的呼叫逻辑)
              String calleeSipUri = 'sip:callee@example.com';
              await FlutterCallkitVoximplant.startCall(calleeSipUri);
            },
            child: Text('Start Call'),
          ),
        ),
      ),
    );
  }
}

注意事项

  1. 权限处理:在实际应用中,你需要在运行时请求麦克风权限(特别是在Android上)。
  2. 资源文件:确保assets/icon等资源文件已正确添加到项目中,并在pubspec.yaml中声明。
  3. 错误处理:添加适当的错误处理逻辑,以处理初始化失败、呼叫失败等情况。
  4. 呼叫逻辑startCall方法仅作为示例,你需要根据实际需求实现完整的呼叫逻辑。

这个示例展示了如何在Flutter应用中集成flutter_callkit_voximplant插件,并初始化Voximplant和CallKit,同时处理来电和呼叫结束事件。根据实际需求,你可能需要进一步扩展和定制这些功能。

回到顶部