Flutter集成Voximplant呼叫功能插件flutter_callkit_voximplant的使用
Flutter集成Voximplant呼叫功能插件flutter_callkit_voximplant的使用
flutter_callkit_voximplant
Flutter SDK用于在iOS上将CallKit集成到Flutter应用程序中。
支持iOS >= 10。
我们写了一篇文章介绍这个插件 - “我们如何使Flutter与CallKit Call Directory协同工作”。 文章提供 英文 和 俄文 版本。
安装
- 在
pubspec.yaml
文件中添加flutter_callkit_voximplant
依赖。 - 在
<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及以上)。 FCXCallController
和FCXProvider
只能是单例模式。
注意:传递给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应用扩展来识别和阻止来电者。更多详细信息请参阅官方文档。
参考资料
- iOS CallKit Framework Documentation by Apple: Apple开发者文档
示例项目
查看完整的示例项目以了解如何实现上述功能,请访问GitHub仓库中的示例项目。
希望这些信息可以帮助您成功集成flutter_callkit_voximplant
到您的Flutter项目中。如果您有任何问题或需要进一步的帮助,请随时提问!
更多关于Flutter集成Voximplant呼叫功能插件flutter_callkit_voximplant的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter集成Voximplant呼叫功能插件flutter_callkit_voximplant的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中集成并使用flutter_callkit_voximplant
插件来实现Voximplant呼叫功能的示例代码。这个插件结合了Voximplant的SDK和iOS/Android的原生CallKit/ConnectionService来实现来电显示和呼叫管理功能。
前提条件
- 确保你已经在Flutter项目中添加了
flutter_callkit_voximplant
依赖。 - 你已经有一个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'),
),
),
),
);
}
}
注意事项
- 权限处理:在实际应用中,你需要在运行时请求麦克风权限(特别是在Android上)。
- 资源文件:确保
assets/icon
等资源文件已正确添加到项目中,并在pubspec.yaml
中声明。 - 错误处理:添加适当的错误处理逻辑,以处理初始化失败、呼叫失败等情况。
- 呼叫逻辑:
startCall
方法仅作为示例,你需要根据实际需求实现完整的呼叫逻辑。
这个示例展示了如何在Flutter应用中集成flutter_callkit_voximplant
插件,并初始化Voximplant和CallKit,同时处理来电和呼叫结束事件。根据实际需求,你可能需要进一步扩展和定制这些功能。