Flutter VoIP通信插件flutter_ios_voip_kit_karmm的使用
Flutter VoIP通信插件flutter_ios_voip_kit_karmm的使用
flutter_ios_voip_kit_karmm
一对一视频通话使用CallKit和PushKit的Flutter iOS应用。
动机
我们需要使用CallKit来处理来自iOS 13的VoIP通知。查看WWDC2019视频以获取更多信息。因此,与其单独使用CallKit和PushKit,越来越多的需求是将它们一起使用。然而,在网络上仍然很少有同时使用CallKit和PushKit的VoIP通知示例(特别是对于Flutter)。我决定创建一个具有最小必要功能的Flutter插件。您可以使用此插件,但实际目的是帮助您创建符合您服务需求的VoIPKit。
要求
- 仅支持iOS,不支持Android。
- 需要iOS 10或更高版本。
- 仅支持一对一通话,不支持群组通话。
- 需要一个服务器通过APNs推送VoIP通知。
- 若要实际进行视频或语音通话,您需要连接到WebRTC服务(例如:Agora、SkyWay、Amazon Kinesis Video Streams)。
使用方法
1. 安装插件
在pubspec.yaml
文件中添加flutter_ios_voip_kit_karmm
作为依赖项。
dependencies:
flutter_ios_voip_kit_karmm: ^版本号
然后运行以下命令:
flutter pub get
2. 在Xcode中设置功能
- 在Xcode中选择 Background Modes > Voice over IP 和 Remote notifications 并确保开启。
- 启用 Push Notifications。
- 在选择功能后,修改
ios/Runner/Info.plist
文件。
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
<string>voip</string>
</array>
3. 编辑 Info.plist
编辑ios/Runner/Info.plist
文件,添加以下内容:
<key>FIVKIconName</key>
<string>AppIcon-VoIPKit</string>
<key>FIVKLocalizedName</key>
<string>VoIP-Kit</string>
<key>FIVKSupportVideo</key>
<true/>
<key>FIVKSkipRecallScreen</key>
<true/>
4. 为CallKit添加新的图像集
在ios/Runner/Assets.xcassets/AppIcon-VoIPKit
目录下添加一个图标(.png
或 .pdf
),用于锁定iPhone时的来电屏幕。
5. 创建VoIP服务证书
- 访问Apple开发者网站并创建一个新的VoIP服务证书(
.cer
)。
了解更多VoIP最佳实践。 - 使用KeyChain Access从
.cer
生成.p12
文件,并使用openssl生成.pem
文件。
生成.p12
文件的步骤:
- 打开KeyChain Access。
- 导出证书为
.p12
格式。
生成.pem
文件的命令:
openssl pkcs12 -in voip_services.p12 -out voip_services.pem -nodes -clcerts
6. 从您的服务器请求VoIP通知APNs
- 查看Apple文档: 设置远程通知服务器。
- 添加以下数据(payload):
{
"aps": {
"alert": {
"uuid": "<Version 4 UUID (e.g.: https://www.uuidgenerator.net/version4)>",
"incoming_caller_id": "<您的服务用户ID>",
"incoming_caller_name": "<您的服务用户名>"
}
}
}
- 使用curl测试VoIP通知:
curl -v \
-d '{"aps":{"alert":{"uuid":"982cf533-7b1b-4cf6-a6e0-004aab68c503","incoming_caller_id":"0123456789","incoming_caller_name":"Tester"}}}' \
-H "apns-push-type: voip" \
-H "apns-expiration: 0" \
-H "apns-priority: 0" \
-H "apns-topic: <您的应用包名>.voip" \
--http2 \
--cert ./voip_services.pem \
https://api.sandbox.push.apple.com/3/device/<VoIP设备Token>
更多关于Flutter VoIP通信插件flutter_ios_voip_kit_karmm的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter VoIP通信插件flutter_ios_voip_kit_karmm的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
flutter_ios_voip_kit_karmm
是一个用于在 Flutter 应用中实现 iOS VoIP(Voice over Internet Protocol)通信的插件。它允许开发者在 iOS 设备上实现 VoIP 功能,如接听和拨打电话。以下是如何使用 flutter_ios_voip_kit_karmm
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 flutter_ios_voip_kit_karmm
插件的依赖:
dependencies:
flutter:
sdk: flutter
flutter_ios_voip_kit_karmm: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 配置 iOS 项目
在 iOS 项目中,你需要进行一些配置以支持 VoIP 功能。
2.1 启用后台模式
在 Info.plist
文件中,添加以下键值对以启用 VoIP 后台模式:
<key>UIBackgroundModes</key>
<array>
<string>voip</string>
</array>
2.2 配置推送通知
VoIP 功能通常依赖于推送通知来唤醒应用。你需要在 Info.plist
文件中配置推送通知:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
3. 初始化插件
在你的 Flutter 应用中,初始化 flutter_ios_voip_kit_karmm
插件:
import 'package:flutter_ios_voip_kit_karmm/flutter_ios_voip_kit_karmm.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await FlutterIosVoipKitKarmm.initialize();
runApp(MyApp());
}
4. 处理 VoIP 事件
你可以监听 VoIP 事件,如来电、接听、挂断等:
FlutterIosVoipKitKarmm.onCallReceived.listen((call) {
// 处理来电
print('Incoming call from ${call.callerId}');
});
FlutterIosVoipKitKarmm.onCallAnswered.listen((call) {
// 处理接听
print('Call answered');
});
FlutterIosVoipKitKarmm.onCallEnded.listen((call) {
// 处理挂断
print('Call ended');
});
5. 拨打电话
你可以使用插件提供的 API 拨打电话:
FlutterIosVoipKitKarmm.makeCall('1234567890');
6. 处理推送通知
VoIP 功能通常依赖于推送通知来唤醒应用。你需要在 AppDelegate
中处理推送通知:
#import "AppDelegate.h"
#import <flutter_ios_voip_kit_karmm/FlutterIosVoipKitKarmmPlugin.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[FlutterIosVoipKitKarmmPlugin registerWithRegistrar:[self registrarForPlugin:@"FlutterIosVoipKitKarmmPlugin"]];
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
[FlutterIosVoipKitKarmmPlugin didReceiveRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
@end
7. 处理 VoIP 推送通知
你需要在 AppDelegate
中处理 VoIP 推送通知:
- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(PKPushType)type withCompletionHandler:(void (^)(void))completion {
[FlutterIosVoipKitKarmmPlugin didReceiveIncomingPushWithPayload:payload forType:type];
completion();
}
8. 处理 VoIP 通话状态
你可以在 Flutter 中监听 VoIP 通话状态的变化:
FlutterIosVoipKitKarmm.onCallStateChanged.listen((state) {
// 处理通话状态变化
print('Call state changed: $state');
});
9. 结束通话
你可以使用插件提供的 API 结束通话:
FlutterIosVoipKitKarmm.endCall();
10. 处理权限
确保在 iOS 设备上请求必要的权限,如麦克风和摄像头权限:
import 'package:permission_handler/permission_handler.dart';
void requestPermissions() async {
await Permission.microphone.request();
await Permission.camera.request();
}
11. 处理错误
你可以监听插件的错误事件:
FlutterIosVoipKitKarmm.onError.listen((error) {
// 处理错误
print('Error: $error');
});
12. 清理资源
在应用退出时,确保清理 VoIP 相关的资源:
[@override](/user/override)
void dispose() {
FlutterIosVoipKitKarmm.dispose();
super.dispose();
}