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中设置功能

  1. 在Xcode中选择 Background Modes > Voice over IP 和 Remote notifications 并确保开启。
  2. 启用 Push Notifications
  3. 在选择功能后,修改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服务证书

  1. 访问Apple开发者网站并创建一个新的VoIP服务证书(.cer)。
    了解更多VoIP最佳实践
  2. 使用KeyChain Access从.cer生成.p12文件,并使用openssl生成.pem文件。

生成.p12文件的步骤:

  1. 打开KeyChain Access。
  2. 导出证书为.p12格式。

生成.pem文件的命令:

openssl pkcs12 -in voip_services.p12 -out voip_services.pem -nodes -clcerts

6. 从您的服务器请求VoIP通知APNs

  1. 查看Apple文档: 设置远程通知服务器
  2. 添加以下数据(payload):
{
    "aps": {
        "alert": {
            "uuid": "<Version 4 UUID (e.g.: https://www.uuidgenerator.net/version4)>",
            "incoming_caller_id": "<您的服务用户ID>",
            "incoming_caller_name": "<您的服务用户名>"
        }
    }
}
  1. 使用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

1 回复

更多关于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();
}
回到顶部