fix:修改图标和其他

This commit is contained in:
2026-03-07 02:02:22 +07:00
parent d874620a83
commit 67495ea864
653 changed files with 78983 additions and 816 deletions

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AvailableLibraries</key>
<array>
<dict>
<key>BinaryPath</key>
<string>RongCallWrapper.framework/RongCallWrapper</string>
<key>LibraryIdentifier</key>
<string>ios-arm64</string>
<key>LibraryPath</key>
<string>RongCallWrapper.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>arm64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
</dict>
<dict>
<key>BinaryPath</key>
<string>RongCallWrapper.framework/RongCallWrapper</string>
<key>LibraryIdentifier</key>
<string>ios-x86_64-simulator</string>
<key>LibraryPath</key>
<string>RongCallWrapper.framework</string>
<key>SupportedArchitectures</key>
<array>
<string>x86_64</string>
</array>
<key>SupportedPlatform</key>
<string>ios</string>
<key>SupportedPlatformVariant</key>
<string>simulator</string>
</dict>
</array>
<key>CFBundlePackageType</key>
<string>XFWK</string>
<key>XCFrameworkFormatVersion</key>
<string>1.0</string>
</dict>
</plist>

View File

@@ -0,0 +1,123 @@
//
// RCCallIWAndroidPushConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSUInteger, RCCallIWImportanceHW) {
/*!
华为推送消息级别 NORMAL表示消息为服务与通讯类。消息提醒方式为锁屏+铃声+震动。
*/
RCCallIWImportanceHWNormal = 0,
/*!
华为推送消息级别 LOW, 表示消息为资讯营销类。消息提醒方式为静默通知,仅在下拉通知栏展示。
*/
RCCallIWImportanceHWLow = 1,
};
@interface RCCallIWAndroidPushConfig : NSObject
/*!
Android 平台 Push 唯一标识
目前支持小米、华为推送平台,默认开发者不需要进行设置,当消息产生推送时,消息的 messageUId 作为 notificationId 使用。
*/
@property (nonatomic, copy) NSString *notificationId;
/*!
小米的渠道 ID
该条消息针对小米使用的推送渠道,如开发者集成了小米推送,需要指定 channelId 时,可向 Android 端研发人员获取channelId 由开发者自行创建。
*/
@property (nonatomic, copy) NSString *channelIdMi;
/*!
小米 Large icon 链接
Large icon 可以出现在大图版和多字版消息中,显示在右边。国内版仅 MIUI12 以上版本支持,以下版本均不支持;国际版支持。图片要求:大小 120 * 120px格式为 png 或者 jpg 格式。
*/
@property (nonatomic, copy) NSString *imageUrlMi;
/*!
华为的渠道 ID
该条消息针对华为使用的推送渠道,如开发者集成了华为推送,需要指定 channelId 时,可向 Android 端研发人员获取channelId 由开发者自行创建。
*/
@property (nonatomic, copy) NSString *channelIdHW;
/*!
华为通知栏消息右侧大图标 URL
如果不设置则不展示通知栏右侧图标URL 使用的协议必须是 HTTPS 协议。
图标文件须小于 512KB图标建议规格大小40dp x 40dp弧角大小为 8dp超出建议规格大小的图标会存在图片压缩或显示不全的情况。
*/
@property (nonatomic, copy) NSString *imageUrlHW;
/*!
华为推送消息级别
*/
@property (nonatomic, assign) RCCallIWImportanceHW importanceHW;
/*!
华为推送消息分类
社交通讯:即时通讯[IM],音频、视频通话[VOIP]
服务提醒:订阅[SUBSCRIPTION],出行[TRAVEL],健康[HEALTH],工作事项提醒[WORK],帐号动态[ACCOUNT],订单&物流[EXPRESS],财务[FINANCE],系统提示[SYSTEM_REMINDER],邮件[MAIL]
资讯营销类:内容资讯/新闻/财经动态/生活资讯/社交动态/调研/其他[MARKETING]
营销活动:产品促销/功能推荐/运营活动/MARKETING
更多信息请参考华为消息分类标准文档: https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/message-classification-0000001149358835
@discussion 默认值为 null如果为 null则以服务配置为准
@since 5.4.0
*/
@property (nonatomic, copy) NSString *categoryHW;
/*!
OPPO 的渠道 ID
该条消息针对 OPPO 使用的推送渠道,如开发者集成了 OPPO 推送,需要指定 channelId 时,可向 Android 端研发人员获取channelId 由开发者自行创建。
*/
@property (nonatomic, copy) NSString *channelIdOPPO;
/*!
VIVO 推送通道类型
开发者集成了 VIVO 推送,需要指定推送类型时,可进行设置。
目前可选值 "0"(运营消息) 和 "1"(系统消息)
*/
@property (nonatomic, copy) NSString *typeVivo;
/*!
Vivo 推送消息分类
系统消息分类
即时消息[IM],账号与资产[ACCOUNT],日程待办[TODO],设备信息[DEVICE_REMINDER],订单与物流[ORDER],订阅提醒[SUBSCRIPTION]
运营消息分类
新闻[NEWS],内容推荐[CONTENT],运营活动[MARKETING],社交动态[SOCIAL]
更多信息请参考 Vivo 消息分类标准文档: https://dev.vivo.com.cn/documentCenter/doc/359
@discussion 默认值为 null如果为 null则以服务配置为准
@since 5.4.2
*/
@property (nonatomic, copy) NSString *categoryVivo;
/*!
FCM 通知类型推送时所使用的分组 id
*/
@property (nonatomic, copy) NSString *collapseKeyFCM;
/*!
FCM 通知类型的推送所使用的通知图片 url
*/
@property (nonatomic, copy) NSString *imageUrlFCM;
/*!
FCM 通知的频道 ID
该应用程序必须使用此频道 ID 创建一个频道,然后才能收到带有该频道 ID 的任何通知。如果您未在请求中发送此频道 ID或者如果应用尚未创建提供的频道 ID则 FCM 使用应用清单中指定的频道 ID。
*/
@property (nonatomic, copy) NSString *channelIdFCM;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,16 @@
//
// RCCallIWAudioConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWAudioConfig : NSObject
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,85 @@
//
// RCCallIWCallSession.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <UIKit/UIKit.h>
#import <RongCallWrapper/RCCallIWUserProfile.h>
#import <RongCallWrapper/RCCallIWDefine.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWCallSession : NSObject
/*!
通话类型
*/
@property (nonatomic, readonly) RCCallIWCallType callType;
/*!
通话媒体类型
*/
@property (nonatomic, readonly) RCCallIWMediaType mediaType;
/*!
通话id
*/
@property (nonatomic, readonly) NSString *callId;
/*!
通话目标id
*/
@property (nonatomic, readonly) NSString *targetId;
/*!
RTC会话唯一标识, 用于 Server API
*/
@property (nonatomic, readonly) NSString *sessionId;
/*!
通话的扩展信息
*/
@property (nonatomic, readonly) NSString *extra;
/*!
通话开始的时间
@discussion 如果是用户呼出的通话则startTime为通话呼出时间如果是呼入的通话则startTime为通话呼入时间。
*/
@property (nonatomic, readonly) long long startTime;
/*!
通话接通时间
*/
@property (nonatomic, readonly) long long connectedTime;
/*!
通话结束时间
*/
@property (nonatomic, readonly) long long endTime;
/*!
当前通话发起者
*/
@property (nonatomic, readonly) RCCallIWUserProfile *caller;
/*!
邀请当前用户到当前通话的邀请者
*/
@property (nonatomic, readonly) RCCallIWUserProfile *inviter;
/*!
当前用户
*/
@property (nonatomic, readonly) RCCallIWUserProfile *mine;
/*!
当前通话的全部用户列表
*/
@property (nonatomic, readonly) NSArray<RCCallIWUserProfile *> *users;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,429 @@
//
// RCCallIWDefine.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#ifndef RCCallIWDefine_h
#define RCCallIWDefine_h
#import <Foundation/Foundation.h>
/*!
用户身份类型
*/
typedef NS_ENUM(NSInteger, RCCallIWUserType) {
/*!
普通身份
*/
RCCallIWUserTypeNormal = 1,
/*!
观察者身份
*/
RCCallIWUserTypeObserver = 2
};
/*!
通话类型
*/
typedef NS_ENUM(NSInteger, RCCallIWCallType) {
/*!
单聊通话
*/
RCCallIWCallTypeSingle = 0,
/*!
群聊通话
*/
RCCallIWCallTypeGroup = 1
};
/*!
通话媒体类型
*/
typedef NS_ENUM(NSInteger, RCCallIWMediaType) {
/*!
音频通话
*/
RCCallIWMediaTypeAudio = 0,
/*!
音视频通话
*/
RCCallIWMediaTypeAudioVideo = 2
};
/*!
相机类型
*/
typedef NS_ENUM(NSInteger, RCCallIWCamera) {
/*!
未指定
*/
RCCallIWCameraNone = -1,
/*!
前置相机
*/
RCCallIWCameraFront = 0,
/*!
后置相机
*/
RCCallIWCameraBack = 1,
};
/*!
网络质量
*/
typedef NS_ENUM(NSInteger, RCCallIWNetworkQuality) {
/*!
未知
*/
RCCallIWNetworkQualityUnknown = 0,
/*!
极好
*/
RCCallIWNetworkQualityExcellent = 1,
/*!
*/
RCCallIWNetworkQualityGood = 2,
/*!
一般
*/
RCCallIWNetworkQualityPoor = 3,
/*!
*/
RCCallIWNetworkQualityBad = 4,
/*!
极差
*/
RCCallIWNetworkQualityTerrible = 5,
};
/*!
视频显示模式
*/
typedef NS_ENUM(NSInteger, RCCallIWViewFitType) {
/*!
拉伸全屏
*/
RCCallIWViewFitTypeFill = 0,
/*!
满屏显示, 等比例填充, 直到填充满整个试图区域,其中一个维度的部分区域会被裁剪
*/
RCCallIWViewFitTypeCover = 1,
/*!
完整显示, 填充黑边, 等比例填充,直达一个维度到达区域边界
*/
RCCallIWViewFitTypeCenter = 2,
};
/*!
通话视频参数
*/
typedef NS_ENUM (NSInteger, RCCallIWVideoProfile) {
/*!
144x256, 15fps, 120~240kbps
*/
RCCallIW_VIDEO_PROFILE_144_256 = 10,
/*!
240x240, 15fps, 120~280kbps
*/
RCCallIW_VIDEO_PROFILE_240_240 = 20,
/*!
240x320, 15fps, 120~400kbps
*/
RCCallIW_VIDEO_PROFILE_240_320 = 30,
/*!
360x480, 15fps, 150~650kbps
*/
RCCallIW_VIDEO_PROFILE_360_480 = 40,
/*!
360x640, 15fps, 180~800kbps
*/
RCCallIW_VIDEO_PROFILE_360_640 = 50,
/*!
480x640, 15fps, 200~900kbps
*/
RCCallIW_VIDEO_PROFILE_480_640 = 60,
/*!
480x720, 15fps, 200~1000kbps
*/
RCCallIW_VIDEO_PROFILE_480_720 = 70,
/*!
720x1280, 15fps, 250~2200kbps
*/
RCCallIW_VIDEO_PROFILE_720_1280 = 80,
/*!
1080x1920, 15fps, 400~4000kbps
*/
RCCallIW_VIDEO_PROFILE_1080_1920 = 90,
/*!
144x256, 30fps, 240~480kbps
*/
RCCallIW_VIDEO_PROFILE_144_256_HIGH = 11,
/*!
240x240, 30fps, 240~360kbps
*/
RCCallIW_VIDEO_PROFILE_240_240_HIGH = 21,
/*!
240x320, 30fps, 240~800kbps
*/
RCCallIW_VIDEO_PROFILE_240_320_HIGH = 31,
/*!
360x480, 30fps, 300~1300kbps
*/
RCCallIW_VIDEO_PROFILE_360_480_HIGH = 41,
/*!
360x640, 30fps, 360~1600kbps
*/
RCCallIW_VIDEO_PROFILE_360_640_HIGH = 51,
/*!
480x640, 30fps, 400~1800kbps
*/
RCCallIW_VIDEO_PROFILE_480_640_HIGH = 61,
/*!
480x720, 30fps, 400~2000kbps
*/
RCCallIW_VIDEO_PROFILE_480_720_HIGH = 71,
/*!
720x1080, 30fps, 500~4400kbps
*/
RCCallIW_VIDEO_PROFILE_720_1280_HIGH = 81,
/*!
1080x1920, 30fps, 800~8000kbps
*/
RCCallIW_VIDEO_PROFILE_1080_1920_HIGH = 91,
};
/*!
摄像机方向
值与 AVCaptureVideoOrientation 一致
*/
typedef NS_ENUM(NSInteger, RCCallIWCameraOrientation) {
RCCallIWCameraOrientationPortrait = 1,
RCCallIWCameraOrientationPortraitUpsideDown = 2,
RCCallIWCameraOrientationLandscapeRight = 3,
RCCallIWCameraOrientationLandscapeLeft = 4,
};
/*!
通话结束原因
*/
typedef NS_ENUM (NSInteger, RCCallIWDisconnectReason) {
/*!
己方取消已发出的通话请求
*/
RCCallIWDisconnectReasonCancel = 1,
/*!
己方拒绝收到的通话请求
*/
RCCallIWDisconnectReasonReject = 2,
/*!
己方挂断
*/
RCCallIWDisconnectReasonHangup = 3,
/*!
己方忙碌
*/
RCCallIWDisconnectReasonBusyLine = 4,
/*!
己方未接听
*/
RCCallIWDisconnectReasonNoResponse = 5,
/*!
己方不支持当前引擎
*/
RCCallIWDisconnectReasonEngineUnsupported = 6,
/*!
己方网络出错
*/
RCCallIWDisconnectReasonNetworkError = 7,
/*!
己方获取媒体资源失败
*/
RCCallIWDisconnectReasonResourceError = 8,
/*!
己方发布资源失败
*/
RCCallIWDisconnectReasonPublishError = 9,
/*!
己方订阅资源失败
*/
RCCallIWDisconnectReasonSubscribeError = 10,
/*!
对方取消已发出的通话请求
*/
RCCallIWDisconnectReasonRemoteCancel = 11,
/*!
对方拒绝收到的通话请求
*/
RCCallIWDisconnectReasonRemoteReject = 12,
/*!
通话过程对方挂断
*/
RCCallIWDisconnectReasonRemoteHangup = 13,
/*!
对方忙碌
*/
RCCallIWDisconnectReasonRemoteBusyLine = 14,
/*!
对方未接听
*/
RCCallIWDisconnectReasonRemoteNoResponse = 15,
/*!
对方不支持当前引擎
*/
RCCallIWDisconnectReasonRemoteEngineUnsupported = 16,
/*!
对方网络错误
*/
RCCallIWDisconnectReasonRemoteNetworkError = 17,
/*!
对方获取媒体资源失败
*/
RCCallIWDisconnectReasonRemoteResourceError = 18,
/*!
对方发布资源失败
*/
RCCallIWDisconnectReasonRemotePublishError = 19,
/*!
对方订阅资源失败
*/
RCCallIWDisconnectReasonRemoteSubscribeError = 20,
/*!
己方其他端已加入新通话
*/
RCCallIWDisconnectReasonKickedByOtherCall = 21,
/*!
己方其他端已在通话中
*/
RCCallIWDisconnectReasonInOtherCall = 22,
/*!
己方已被禁止通话
*/
RCCallIWDisconnectReasonKickedByServer = 23,
/*!
对方其他端已加入新通话
*/
RCCallIWDisconnectReasonRemoteKickedByOtherCall = 24,
/*!
对方其他端已在通话中
*/
RCCallIWDisconnectReasonRemoteInOtherCall = 25,
/*!
对方已被禁止通话
*/
RCCallIWDisconnectReasonRemoteKickedByServer = 26,
/*!
己方其他端已接听
*/
RCCallIWDisconnectReasonAcceptByOtherClient = 27,
/*!
己方其他端已挂断
*/
RCCallIWDisconnectReasonHangupByOtherClient = 28,
/*!
己方被对方加入黑名单
*/
RCCallIWDisconnectReasonAddToBlackList = 29,
/*!
音视频服务已关闭
*/
RCCallIWDisconnectReasonMediaServerClosed = 30,
/*!
己方被降级为观察者
*/
RCCallIWDisconnectReasonDegrade = 31,
/*!
己方摄像头初始化错误,可能是没有打开使用摄像头权限
*/
RCCallIWDisconnectReasonInitVideoError = 32,
/*!
其他端已经接听
*/
RCCallIWDisconnectReasonOtherDeviceHadAccepted = 33,
/*!
im ipc服务已断开
*/
RCCallIWDisconnectReasonServiceDisconnected = 34
};
/*!
通话错误类型
*/
typedef NS_ENUM (NSInteger, RCCallIWErrorCode) {
/*!
成功
*/
RCCallIWSuccess = 0,
/*!
开通的音视频服务没有及时生效或音视频服务已关闭请等待3-5小时后重新安装应用或开启音视频服务再进行测试
*/
RCCallIWEngineNotFound = 1,
/*!
网络不可用
*/
RCCallIWNetworkUnavailable = 2,
/*!
已经处于通话中了
*/
RCCallIWOneCallExisted = 3,
/*!
无效操作
*/
RCCallIWOperationUnavailable = 4,
/*!
参数错误
*/
RCCallIWInvalidParam = 5,
/*!
网络不稳定
*/
RCCallIWNetworkUnstable = 6,
/*!
媒体服务请求失败
*/
RCCallIWMediaRequestFailed = 7,
/*!
媒体服务初始化失败
*/
RCCallIWMediaServerNotReady = 8,
/*!
媒体服务未初始化
*/
RCCallIWMediaServerNotInitialized = 9,
/*!
媒体服务请求超时
*/
RCCallIWMediaRequestTimeout = 10,
/*!
未知的媒体服务错误
*/
RCCallIWMediaUnkownError = 11,
/*!
已被禁止通话
*/
RCCallIWMediaKickedByServerError = 12,
/*!
音视频服务已关闭
*/
RCCallIWMediaServerClosedError = 13,
/*!
音视频发布资源失败
*/
RCCallIWMediaServerPublishError = 14,
/*!
音视频订阅资源失败
*/
RCCallIWMediaServerSubscribeError = 15,
/*!
其他端已在通话中错误
*/
RCCallIWMediaJoinRoomRefuseError = 16
};
#endif /* RCCallIWDefine_h */

View File

@@ -0,0 +1,449 @@
//
// RCCallIWEngine.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <UIKit/UIKit.h>
#import <RongCallWrapper/RCCallIWDefine.h>
@class RCCallIWEngineConfig;
@class RCCallIWPushConfig;
@class RCCallIWAudioConfig;
@class RCCallIWVideoConfig;
@class RCCallIWCallSession;
@class RCCallIWUserProfile;
@class RCCallIWBeautyOption;
@protocol RCCallIWEngineDelegate;
@protocol RCCallIWSampleBufferVideoFrameDelegate;
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWEngine : NSObject
/*!
获取引擎实例
@return 引擎实例
*/
+ (RCCallIWEngine *)sharedInstance;
/*!
配置引擎
@param config 引擎配置
*/
- (void)setEngineConfig:(nullable RCCallIWEngineConfig *)config;
/*!
配置推送
@param callPushConfig 呼叫推送配置
@param hangupPushConfig 挂断推送配置
*/
- (void)setPushConfig:(nullable RCCallIWPushConfig *)callPushConfig
hangupPushConfig:(nullable RCCallIWPushConfig *)hangupPushConfig;
/*!
配置推送
@param callPushConfig 呼叫推送配置
@param hangupPushConfig 挂断推送配置
@param enableApplePushKit 设置是否使用苹果 PushKit 推送, YES 使用, NO 不使用
@discussion
是否打开苹果 PushKit 推送, 该推送可以直接激活 App, 注: iOS 13 以后 PushKit 必须结合苹果 CallKit.framework 进行使用, 否则无法正常处理 VoIP 相关推送逻辑,
如果设置为 NO 则使用普通 APNS 消息推送来处理音视频信令逻辑, 默认关闭. 打开之后 App 默认需要自行处理 VoIP 推送唤起 CallKit.framework 的逻辑.
*/
- (void)setPushConfig:(nullable RCCallIWPushConfig *)callPushConfig
hangupPushConfig:(nullable RCCallIWPushConfig *)hangupPushConfig
enableApplePushKit:(BOOL)enableApplePushKit;
/*!
配置音频
@param config 音频配置
*/
- (void)setAudioConfig:(nullable RCCallIWAudioConfig *)config;
/*!
配置视频
@param config 视频配置
*/
- (void)setVideoConfig:(nullable RCCallIWVideoConfig *)config;
/*!
配置监听
@param delegate 监听代理
*/
- (void)setEngineDelegate:(nullable NSObject<RCCallIWEngineDelegate> *)delegate;
/*!
拨打电话-单聊
@param userId 被叫端UserId
@param type 发起的通话媒体类型
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前Call Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)userId
type:(RCCallIWMediaType)type;
/*!
拨打电话-单聊
@param userId 被叫端UserId
@param type 发起的通话媒体类型
@param extra 附件信息
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前通话 Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)userId
type:(RCCallIWMediaType)type
extra:(nullable NSString *)extra;
/*!
拨打电话-群聊
@param groupId 群组Id
@param userIds 被叫端的用户ID列表, 数组中仅填写被叫端UserId, 请不要填写主叫端UserId, 否则无法发起呼叫
@param type 发起的通话媒体类型
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前通话 Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)groupId
userIds:(NSArray<NSString *> *)userIds
type:(RCCallIWMediaType)type;
/*!
拨打电话-群聊
@param groupId 群组Id
@param userIds 被叫端的用户ID列表, 数组中仅填写被叫端UserId, 请不要填写主叫端UserId, 否则无法发起呼叫
@param type 发起的通话媒体类型
@param extra 附件信息
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前通话 Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)groupId
userIds:(NSArray<NSString *> *)userIds
type:(RCCallIWMediaType)type
extra:(nullable NSString *)extra;
/*!
拨打电话-群聊
@param groupId 群组Id
@param userIds 被叫端的用户ID列表, 数组中仅填写被叫端UserId, 请不要填写主叫端UserId, 否则无法发起呼叫
@param observerUserIds 主叫端指定需要以观察者身份加入房间的用户ID列表, 如果主叫端需要以观察者身份加入房间也需要填写主叫端UserId
@param type 发起的通话媒体类型
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前通话 Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)groupId
userIds:(NSArray<NSString *> *)userIds
observerUserIds:(nullable NSArray<NSString *> *)observerUserIds
type:(RCCallIWMediaType)type;
/*!
拨打电话-群聊
@param groupId 群组Id
@param userIds 被叫端的用户ID列表, 数组中仅填写被叫端UserId, 请不要填写主叫端UserId, 否则无法发起呼叫
@param observerUserIds 主叫端指定需要以观察者身份加入房间的用户ID列表, 如果主叫端需要以观察者身份加入房间也需要填写主叫端UserId
@param type 发起的通话媒体类型
@param extra 附件信息
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前通话 Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)groupId
userIds:(NSArray<NSString *> *)userIds
observerUserIds:(nullable NSArray<NSString *> *)observerUserIds
type:(RCCallIWMediaType)type
extra:(nullable NSString *)extra;
/*!
获取当前通话 Session
@return 当前通话 Session
*/
- (RCCallIWCallSession *)getCurrentCallSession;
/*!
接电话
@discussion
如果呼入类型为语音通话,即接受语音通话,如果呼入类型为视频通话,即接受视频通话,打开默认(前置)摄像头。
观察者不开启摄像头。
*/
- (void)accept;
/*!
挂断电话
*/
- (void)hangup;
/*!
麦克风控制
@param enable YES 开启麦克风NO 关闭麦克风
*/
- (void)enableMicrophone:(BOOL)enable;
/*!
获取当前麦克风状态
@return 当前麦克风是否开启
*/
- (BOOL)isEnableMicrophone;
/*!
扬声器控制
@param enable YES 开启扬声器NO 关闭扬声器
*/
- (void)enableSpeaker:(BOOL)enable;
/*!
获取当前扬声器状态
@return 当前扬声器是否开启
*/
- (BOOL)isEnableSpeaker;
/*!
摄像头控制
@param enable YES 开启摄像头NO 关闭摄像头
*/
- (void)enableCamera:(BOOL)enable;
/*!
摄像头控制
@param enable YES 开启摄像头NO 关闭摄像头
@param camera 指定摄像头
*/
- (void)enableCamera:(BOOL)enable camera:(RCCallIWCamera)camera;
/*!
获取当前摄像头状态
@return 当前摄像头是否开启
*/
- (BOOL)isEnableCamera;
/*!
获取当前摄像头
@return 当前摄像头
*/
- (RCCallIWCamera)currentCamera;
/*!
翻转摄像头
*/
- (void)switchCamera;
/*!
设置预览窗口
@param userId 用户id
@param view 视频预览视图
*/
- (void)setVideoView:(NSString *)userId
view:(UIView *)view;
/*!
设置预览窗口
@param userId 用户id
@param view 视频预览视图
@param fit 视频显示模式
*/
- (void)setVideoView:(NSString *)userId
view:(UIView *)view
fit:(RCCallIWViewFitType)fit;
/*!
修改通话媒体类型
@param type 通话媒体类型
*/
- (void)changeMediaType:(RCCallIWMediaType)type;
/*!
邀请用户
@param userIds 被邀请用户id列表
*/
- (void)inviteUsers:(NSArray<NSString *> *)userIds;
/*!
邀请用户
@param userIds 被邀请用户id列表
@param observerUserIds 被邀请观察者id列表
*/
- (void)inviteUsers:(NSArray<NSString *> *)userIds
observerUserIds:(NSArray<NSString *> *)observerUserIds;
- (void)setLocalVideoProcessedDelegate:(id<RCCallIWSampleBufferVideoFrameDelegate>)delegate;
@end
@protocol RCCallIWEngineDelegate <NSObject>
@required
/*!
接收到通话呼入的回调
@param session 通话Session
*/
- (void)didReceiveCall:(RCCallIWCallSession *)session;
/*!
通话已接通
*/
- (void)callDidConnect;
/*!
通话已结束
@param reason 结束原因
*/
- (void)callDidDisconnect:(RCCallIWDisconnectReason)reason;
/*!
对端用户加入了通话
@param user 对端用户信息
*/
- (void)remoteUserDidJoin:(RCCallIWUserProfile *)user;
/*!
对端用户挂断
@param userId 对端用户信息
@param reason 挂断原因
*/
- (void)remoteUserDidLeave:(NSString *)userId
reason:(RCCallIWDisconnectReason)reason;
@optional
/*!
接收到通话呼入的远程通知的回调
*/
- (void)didReceiveCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallIWMediaType)mediaType
userIdList:(NSArray *)userIdList
userDict:(NSDictionary *)userDict
isVoIPPush:(BOOL)isVoIPPush
pushConfig:(RCCallIWPushConfig *)pushConfig;
/*!
接收到取消通话的远程通知的回调
*/
- (void)didCancelCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallIWMediaType)mediaType
userIdList:(NSArray *)userIdList
pushConfig:(RCCallIWPushConfig *)pushConfig
isRemoteCancel:(BOOL)isRemoteCancel;
/*!
开启/关闭摄像头的回调
*/
- (void)didEnableCamera:(RCCallIWCamera)camera
enable:(BOOL)enable;
/*!
切换摄像头的回调
@param camera 当前选择的摄像头
*/
- (void)didSwitchCamera:(RCCallIWCamera)camera;
/*!
通话出现错误的回调
*/
- (void)callDidError:(RCCallIWErrorCode)code;
/*!
开始呼叫通话的回调
*/
- (void)callDidMake;
/*!
对端用户正在振铃
*/
- (void)remoteUserDidRing:(NSString *)userId;
/*!
有用户被邀请加入通话
*/
- (void)remoteUserDidInvite:(NSString *)userId
mediaType:(RCCallIWMediaType)mediaType;
/*!
对端用户切换了媒体类型
*/
- (void)remoteUserDidChangeMediaType:(RCCallIWUserProfile *)user
mediaType:(RCCallIWMediaType)mediaType;
/*!
对端用户开启或关闭了麦克风的状态
*/
- (void)remoteUserDidChangeMicrophoneState:(RCCallIWUserProfile *)user
enable:(BOOL)enable;
/*!
对端用户开启或关闭了摄像头的状态
*/
- (void)remoteUserDidChangeCameraState:(RCCallIWUserProfile *)user
enable:(BOOL)enable;
/*!
当前通话网络状态的回调,该回调方法每秒触发一次
@param user 用户信息
@param quality 网络质量
@discussion
如果user是本端用户, quality代表上行网络质量
如果user是远端用户, quality代表下行网络质量
*/
- (void)user:(RCCallIWUserProfile *)user networkQuality:(RCCallIWNetworkQuality)quality;
/*!
当前通话某用户声音音量回调,该回调方法每两秒触发一次
@param user 用户信息
@param volume 声音音量
@discussion
声音级别: 0~9, 0为无声, 依次变大
如果user是本端用户, volume代表发送音量
如果user是远端用户, volume代表接收音量
*/
- (void)user:(RCCallIWUserProfile *)user audioVolume:(int)volume;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,23 @@
//
// RCCallIWEngineConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/*!
引擎配置
*/
@interface RCCallIWEngineConfig : NSObject
/*!
开启通话记录 默认NO
*/
@property (nonatomic, assign) BOOL enableCallSummary;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,41 @@
//
// RCCallIWFlutterView.h
// RongCallWrapper
//
// Created by 潘铭达 on 2021/6/16.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol RCCallIWFlutterViewDelegate <NSObject>
- (void)changeSize:(int)width height:(int)height;
- (void)changeRotation:(int)rotation;
- (void)firstFrameRendered;
- (void)frameRendered;
// 当原生层摄像头进行操作的时候 通知 Flutter 层的 view 进行视图的镜像操作
- (void)onMirrorChanged:(BOOL)mirror;
@end
@interface RCCallIWFlutterView : NSObject
@property (nonatomic, weak) id<RCCallIWFlutterViewDelegate> textureViewDelegate;
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)new NS_UNAVAILABLE;
- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;
+ (RCCallIWFlutterView *)create;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,41 @@
//
// RCCallIWIOSPushConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWIOSPushConfig : NSObject
/*!
iOS 平台通知栏分组 ID
相同的 thread-id 推送分为一组
iOS10 开始支持
*/
@property (nonatomic, copy) NSString *threadId;
/*!
iOS 标识推送的类型
如果不设置后台默认取消息类型字符串,如 RC:TxtMsg
*/
@property (nonatomic, copy) NSString *category;
/*!
iOS 平台通知覆盖 ID
apnsCollapseId 相同时,新收到的通知会覆盖老的通知,最大 64 字节
iOS10 开始支持
*/
@property (nonatomic, copy) NSString *apnsCollapseId;
/*!
iOS 富文本推送内容
*/
@property (nonatomic, copy) NSString *richMediaUri;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,74 @@
//
// RCCallIWPushConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
#import <RongCallWrapper/RCCallIWIOSPushConfig.h>
#import <RongCallWrapper/RCCallIWAndroidPushConfig.h>
NS_ASSUME_NONNULL_BEGIN
/*!
推送配置
*/
@interface RCCallIWPushConfig : NSObject
/*!
是否屏蔽通知标题
YES: 不显示通知标题
NO: 显示通知标题
@discussion 默认情况下融云单聊消息通知标题为用户名、群聊消息为群名称,设置后不会再显示通知标题。
@discussion 此属性只针目标用户为 iOS 平台时有效Android 第三方推送平台的通知标题为必填项,所以暂不支持。
*/
@property (nonatomic, assign) BOOL disableTitle;
/*!
推送标题
如果没有设置,会使用下面的默认标题显示规则
默认标题显示规则:
内置消息:单聊通知标题显示为发送者名称,群聊通知标题显示为群名称。
自定义消息:默认不显示标题。
*/
@property (nonatomic, copy) NSString *title;
/*!
推送内容
优先使用 MessagePushConfig 的 pushContent如果没有则使用 sendMessage 或者 sendMediaMessage 的 pushContent。
*/
@property (nonatomic, copy) NSString *content;
/*!
远程推送附加信息
优先使用 MessagePushConfig 的 pushData如果没有则使用 sendMessage 或者 sendMediaMessage 的 pushData。
*/
@property (nonatomic, copy) NSString *data;
/*!
是否强制显示通知详情
当目标用户通过 RCPushProfile 中的 updateShowPushContentStatus 设置推送不显示消息详情时,可通过此参数,强制设置该条消息显示推送详情。
*/
@property (nonatomic, assign) BOOL forceShowDetailContent;
/*!
推送模板 ID设置后根据目标用户通过 SDK RCPushProfile 中的 setPushLauguageCode 设置的语言环境,匹配模板中设置的语言内容进行推送,未匹配成功时使用默认内容进行推送,模板内容在“开发者后台-自定义推送文案”中进行设置。
RCMessagePushConfig 中的 Title 和 PushContent 优先级高于模板 IDtemplateId中对应的标题和推送内容。
*/
@property (nonatomic, copy) NSString *templateId;
/*!
iOS 平台相关配置
*/
@property (nonatomic, strong) RCCallIWIOSPushConfig *iOSConfig;
/*!
Android 平台相关配置
*/
@property (nonatomic, strong) RCCallIWAndroidPushConfig *androidConfig;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,41 @@
//
// RCCallIWUserProfile.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
#import <RongCallWrapper/RCCallIWDefine.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWUserProfile : NSObject
/*!
用户身份类型
*/
@property (nonatomic, readonly) RCCallIWUserType userType;
/*!
通话媒体类型
*/
@property (nonatomic, readonly) RCCallIWMediaType mediaType;
/*!
用户id
*/
@property (nonatomic, readonly) NSString *userId;
/*!
用户的通话媒体连接ID
*/
@property (nonatomic, readonly) NSString *mediaId;
/*!
用户是否开启摄像头
*/
@property (nonatomic, readonly) BOOL enableCamera;
/*!
用户是否开启麦克风
*/
@property (nonatomic, readonly) BOOL enableMicrophone;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,40 @@
//
// RCCallIWVideoConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
#import <RongCallWrapper/RCCallIWDefine.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWVideoConfig : NSObject
/*!
视频配置
默认值 RCCallIW_VIDEO_PROFILE_720_1280
*/
@property (nonatomic, assign) RCCallIWVideoProfile profile;
/*!
摄像头
默认值 RCCallIWCameraFront
*/
@property (nonatomic, assign) RCCallIWCamera defaultCamera;
/*!
相机方向
默认值 RCCallIWCameraOrientationPortrait
*/
@property (nonatomic, assign) RCCallIWCameraOrientation cameraOrientation;
/*!
本地预览是否镜像
前置摄像头默认: YES后置摄像头默认: NO
*/
@property (nonatomic, assign) BOOL isPreviewMirror;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,18 @@
//
// RCCallIWVideoFrameDelegate.h
// RongCallWrapper
//
// Created by 潘铭达 on 2021/12/27.
//
#import <AVFoundation/AVFoundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol RCCallIWSampleBufferVideoFrameDelegate <NSObject>
- (void)onPixelBuffer:(CVPixelBufferRef)pixelBuffer;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,23 @@
//
// RCCallIWVideoView.h
// RongCallWrapper
//
// Created by RongCloud on 2023/5/12.
//
#import <UIKit/UIKit.h>
#import <RongRTCLib/RongRTCLib.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWVideoView : UIView
@property (nonatomic, weak, readonly) RCRTCVideoView *videoView;
// 预览是否镜像 (最终设置的是原生 videoView所以要注意设置的时机
@property (nonatomic, assign) BOOL isMirror;
// 原生 videoView 添加完成
@property (nonatomic, copy) void(^nativeVideoViewDidAdd)(RCRTCVideoView *videoView);
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,28 @@
//
// RongCallWrapper.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/12.
//
#import <Foundation/Foundation.h>
//! Project version number for RongCallWrapper.
FOUNDATION_EXPORT double RongCallWrapperVersionNumber;
//! Project version string for RongCallWrapper.
FOUNDATION_EXPORT const unsigned char RongCallWrapperVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <RongCallWrapper/PublicHeader.h>
#import <RongCallWrapper/RCCallIWDefine.h>
#import <RongCallWrapper/RCCallIWEngine.h>
#import <RongCallWrapper/RCCallIWCallSession.h>
#import <RongCallWrapper/RCCallIWEngineConfig.h>
#import <RongCallWrapper/RCCallIWAudioConfig.h>
#import <RongCallWrapper/RCCallIWVideoConfig.h>
#import <RongCallWrapper/RCCallIWPushConfig.h>
#import <RongCallWrapper/RCCallIWIOSPushConfig.h>
#import <RongCallWrapper/RCCallIWAndroidPushConfig.h>
#import <RongCallWrapper/RCCallIWUserProfile.h>
#import <RongCallWrapper/RCCallIWFlutterView.h>
#import <RongCallWrapper/RCCallIWVideoFrameDelegate.h>

View File

@@ -0,0 +1,6 @@
framework module RongCallWrapper {
umbrella header "RongCallWrapper.h"
export *
module * { export * }
}

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Location</key>
<dict>
<key>LocationImageQuality</key>
<real>0.7</real>
<key>LocationImageWidth</key>
<string>480</string>
<key>LocationImageHeight</key>
<string>240</string>
</dict>
<key>File</key>
<dict>
<key>RelativePath</key>
<string>Documents/MyFile</string>
<key>MaxRangeUnit</key>
<real>1048576</real>
</dict>
<key>Voice</key>
<dict>
<key>AudioEncodingBitRate</key>
<real>7950</real>
</dict>
<key>Image</key>
<dict>
<key>ThumbnailQuality</key>
<string>0.3</string>
<key>ThumbnailMaxSize</key>
<string>240</string>
<key>ThumbnailMinSize</key>
<string>100</string>
<key>ImageQuality</key>
<real>0.85</real>
<key>ImageWidth</key>
<integer>1080</integer>
<key>ImageHeight</key>
<integer>1080</integer>
</dict>
<key>CustomerService</key>
<dict>
<key>SuspendWhenLeave</key>
<true/>
</dict>
<key>Download</key>
<dict>
<key>DownloadSliceSize</key>
<real>20971520</real>
</dict>
<key>Sight</key>
<dict>
<key>SightCompressWidth</key>
<integer>540</integer>
<key>SightCompressHeight</key>
<integer>960</integer>
</dict>
<key>HeartBeatInterval</key>
<integer>15</integer>
</dict>
</plist>

View File

@@ -0,0 +1,372 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Headers/RCCallIWAndroidPushConfig.h</key>
<data>
c8Nr+zXJBvG4EEuUrT1QFmj5fnQ=
</data>
<key>Headers/RCCallIWAudioConfig.h</key>
<data>
kGPMWb7BecYVlHQ9V+f794nOR4w=
</data>
<key>Headers/RCCallIWCallSession.h</key>
<data>
AnhTDcH3VjceT8E5vwfn4M1KRkE=
</data>
<key>Headers/RCCallIWDefine.h</key>
<data>
DAGsL8w84kqw8ZXp2cNbh7QSWLI=
</data>
<key>Headers/RCCallIWEngine.h</key>
<data>
Z4zTFQqdlABKiqe5+snC7d6/BpA=
</data>
<key>Headers/RCCallIWEngineConfig.h</key>
<data>
yQGCGoe19+myITZLqeO0VadV7Js=
</data>
<key>Headers/RCCallIWFlutterView.h</key>
<data>
y2cqUnU8QMNZ3CG0+C2mMNsxzic=
</data>
<key>Headers/RCCallIWIOSPushConfig.h</key>
<data>
8qkNfl6i7/7v8+Ff+yCXkSZcbKA=
</data>
<key>Headers/RCCallIWPushConfig.h</key>
<data>
Dl/lC2HDVoElj5rdcPDirtFy00I=
</data>
<key>Headers/RCCallIWUserProfile.h</key>
<data>
OirfPQvRXiMSA7f7QCyBpmskr8E=
</data>
<key>Headers/RCCallIWVideoConfig.h</key>
<data>
kOdMpo6eHS1xv3wjNG6+ZiTkjLo=
</data>
<key>Headers/RCCallIWVideoFrameDelegate.h</key>
<data>
4E8xM7l79Q0pj+PqnOIaLalKHZ0=
</data>
<key>Headers/RCCallIWVideoView.h</key>
<data>
ibFWGpV35ABCTAhuEtUsgKHQVnw=
</data>
<key>Headers/RongCallWrapper.h</key>
<data>
vXZ3cAYx+Hn3GKcucUwV0K4j8DQ=
</data>
<key>Info.plist</key>
<data>
Izr+R4U9kf63yZbS/sbtv1Hgxto=
</data>
<key>Modules/module.modulemap</key>
<data>
mB2JsmGuPd2g/QyaXMtdCzdDuzw=
</data>
<key>RCConfig.plist</key>
<data>
QA7nn/q1j2Y4AJbaGtBBs8g71xE=
</data>
<key>RongRTCLib.bundle/HwAiVadModel.bin</key>
<data>
ATcRMel9IwX111oJWJbEEm8fxLw=
</data>
<key>RongRTCLib.bundle/HwAinrModel.bin</key>
<data>
B8kB+UwS+Djpk42nGs6PsuZb4i4=
</data>
</dict>
<key>files2</key>
<dict>
<key>Headers/RCCallIWAndroidPushConfig.h</key>
<dict>
<key>hash</key>
<data>
c8Nr+zXJBvG4EEuUrT1QFmj5fnQ=
</data>
<key>hash2</key>
<data>
tUBraHIlNP/nvghXtWtweS8roeTuGXH5le7Gtoqg2lI=
</data>
</dict>
<key>Headers/RCCallIWAudioConfig.h</key>
<dict>
<key>hash</key>
<data>
kGPMWb7BecYVlHQ9V+f794nOR4w=
</data>
<key>hash2</key>
<data>
h7YMB2G9xbeDIdlGpjDdy7VeEd1V1lY0bhUhPnmj7do=
</data>
</dict>
<key>Headers/RCCallIWCallSession.h</key>
<dict>
<key>hash</key>
<data>
AnhTDcH3VjceT8E5vwfn4M1KRkE=
</data>
<key>hash2</key>
<data>
47JdoajKNgc8PvI2M1lo7XgKFDap/8zNE5aubhiMO9g=
</data>
</dict>
<key>Headers/RCCallIWDefine.h</key>
<dict>
<key>hash</key>
<data>
DAGsL8w84kqw8ZXp2cNbh7QSWLI=
</data>
<key>hash2</key>
<data>
Txy4g9BC23EsyFZkra0VUfIXAZ+pOnmxcrIhTeyNNSw=
</data>
</dict>
<key>Headers/RCCallIWEngine.h</key>
<dict>
<key>hash</key>
<data>
Z4zTFQqdlABKiqe5+snC7d6/BpA=
</data>
<key>hash2</key>
<data>
N8ZP4WzDTeXJ9tD15nIZiMEXBKA1ndfNuInF3WNd1pE=
</data>
</dict>
<key>Headers/RCCallIWEngineConfig.h</key>
<dict>
<key>hash</key>
<data>
yQGCGoe19+myITZLqeO0VadV7Js=
</data>
<key>hash2</key>
<data>
+LkKAOHRYcPLjKrmOMYPRIr8DULzitIdlJyGE/v7hIo=
</data>
</dict>
<key>Headers/RCCallIWFlutterView.h</key>
<dict>
<key>hash</key>
<data>
y2cqUnU8QMNZ3CG0+C2mMNsxzic=
</data>
<key>hash2</key>
<data>
IgRu9C00s2UBfZL10F56c7rG2Xu3yS1AM1ET+CChUlQ=
</data>
</dict>
<key>Headers/RCCallIWIOSPushConfig.h</key>
<dict>
<key>hash</key>
<data>
8qkNfl6i7/7v8+Ff+yCXkSZcbKA=
</data>
<key>hash2</key>
<data>
4IZfnNPqAtJn0v1WGY1M4TmPWPwWbaeNWxUf2qNdFKw=
</data>
</dict>
<key>Headers/RCCallIWPushConfig.h</key>
<dict>
<key>hash</key>
<data>
Dl/lC2HDVoElj5rdcPDirtFy00I=
</data>
<key>hash2</key>
<data>
h+XlKn0zxZLWTqirksIReWFIy98pxSzpVOxUcCzgudo=
</data>
</dict>
<key>Headers/RCCallIWUserProfile.h</key>
<dict>
<key>hash</key>
<data>
OirfPQvRXiMSA7f7QCyBpmskr8E=
</data>
<key>hash2</key>
<data>
QmOPdaT/+idE+GEzrr3QR9BAsf0n10xelqc6s0vnOfw=
</data>
</dict>
<key>Headers/RCCallIWVideoConfig.h</key>
<dict>
<key>hash</key>
<data>
kOdMpo6eHS1xv3wjNG6+ZiTkjLo=
</data>
<key>hash2</key>
<data>
UOkF0SEprFatUeYdw91eH8BhSBNcYalRGdJV7OeZszw=
</data>
</dict>
<key>Headers/RCCallIWVideoFrameDelegate.h</key>
<dict>
<key>hash</key>
<data>
4E8xM7l79Q0pj+PqnOIaLalKHZ0=
</data>
<key>hash2</key>
<data>
eVaF/p0qpzOF6/ryCEJ7Q2gdkyovIwmHM2QRFaFLjrU=
</data>
</dict>
<key>Headers/RCCallIWVideoView.h</key>
<dict>
<key>hash</key>
<data>
ibFWGpV35ABCTAhuEtUsgKHQVnw=
</data>
<key>hash2</key>
<data>
jiI7NxMC7CAXlY9mE0LW6YkSMEXIfnjoVS7yDUorUBg=
</data>
</dict>
<key>Headers/RongCallWrapper.h</key>
<dict>
<key>hash</key>
<data>
vXZ3cAYx+Hn3GKcucUwV0K4j8DQ=
</data>
<key>hash2</key>
<data>
TjeCqYh2mGPCDpHUTUAWlH8YPUvjci/ocEqzb+pJWoM=
</data>
</dict>
<key>Modules/module.modulemap</key>
<dict>
<key>hash</key>
<data>
mB2JsmGuPd2g/QyaXMtdCzdDuzw=
</data>
<key>hash2</key>
<data>
HjxU8CFo4bZWSBFLKJxPfiAlkZdKpuae+1t2Iqu0d+s=
</data>
</dict>
<key>RCConfig.plist</key>
<dict>
<key>hash</key>
<data>
QA7nn/q1j2Y4AJbaGtBBs8g71xE=
</data>
<key>hash2</key>
<data>
q9qti/DvWdK6nHCUQ3R/b3gsZ4wASUjoeUzGtn7YyXI=
</data>
</dict>
<key>RongRTCLib.bundle/HwAiVadModel.bin</key>
<dict>
<key>hash</key>
<data>
ATcRMel9IwX111oJWJbEEm8fxLw=
</data>
<key>hash2</key>
<data>
rI/0N8nw9Ktvh3flHD50aM1unvKAoT4PXCZogPS4lzo=
</data>
</dict>
<key>RongRTCLib.bundle/HwAinrModel.bin</key>
<dict>
<key>hash</key>
<data>
B8kB+UwS+Djpk42nGs6PsuZb4i4=
</data>
<key>hash2</key>
<data>
wWEpSmpBqk1A1pnvwExjRDLmRm4kLI6s07dug5+9ftg=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,123 @@
//
// RCCallIWAndroidPushConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
typedef NS_ENUM(NSUInteger, RCCallIWImportanceHW) {
/*!
华为推送消息级别 NORMAL表示消息为服务与通讯类。消息提醒方式为锁屏+铃声+震动。
*/
RCCallIWImportanceHWNormal = 0,
/*!
华为推送消息级别 LOW, 表示消息为资讯营销类。消息提醒方式为静默通知,仅在下拉通知栏展示。
*/
RCCallIWImportanceHWLow = 1,
};
@interface RCCallIWAndroidPushConfig : NSObject
/*!
Android 平台 Push 唯一标识
目前支持小米、华为推送平台,默认开发者不需要进行设置,当消息产生推送时,消息的 messageUId 作为 notificationId 使用。
*/
@property (nonatomic, copy) NSString *notificationId;
/*!
小米的渠道 ID
该条消息针对小米使用的推送渠道,如开发者集成了小米推送,需要指定 channelId 时,可向 Android 端研发人员获取channelId 由开发者自行创建。
*/
@property (nonatomic, copy) NSString *channelIdMi;
/*!
小米 Large icon 链接
Large icon 可以出现在大图版和多字版消息中,显示在右边。国内版仅 MIUI12 以上版本支持,以下版本均不支持;国际版支持。图片要求:大小 120 * 120px格式为 png 或者 jpg 格式。
*/
@property (nonatomic, copy) NSString *imageUrlMi;
/*!
华为的渠道 ID
该条消息针对华为使用的推送渠道,如开发者集成了华为推送,需要指定 channelId 时,可向 Android 端研发人员获取channelId 由开发者自行创建。
*/
@property (nonatomic, copy) NSString *channelIdHW;
/*!
华为通知栏消息右侧大图标 URL
如果不设置则不展示通知栏右侧图标URL 使用的协议必须是 HTTPS 协议。
图标文件须小于 512KB图标建议规格大小40dp x 40dp弧角大小为 8dp超出建议规格大小的图标会存在图片压缩或显示不全的情况。
*/
@property (nonatomic, copy) NSString *imageUrlHW;
/*!
华为推送消息级别
*/
@property (nonatomic, assign) RCCallIWImportanceHW importanceHW;
/*!
华为推送消息分类
社交通讯:即时通讯[IM],音频、视频通话[VOIP]
服务提醒:订阅[SUBSCRIPTION],出行[TRAVEL],健康[HEALTH],工作事项提醒[WORK],帐号动态[ACCOUNT],订单&物流[EXPRESS],财务[FINANCE],系统提示[SYSTEM_REMINDER],邮件[MAIL]
资讯营销类:内容资讯/新闻/财经动态/生活资讯/社交动态/调研/其他[MARKETING]
营销活动:产品促销/功能推荐/运营活动/MARKETING
更多信息请参考华为消息分类标准文档: https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/message-classification-0000001149358835
@discussion 默认值为 null如果为 null则以服务配置为准
@since 5.4.0
*/
@property (nonatomic, copy) NSString *categoryHW;
/*!
OPPO 的渠道 ID
该条消息针对 OPPO 使用的推送渠道,如开发者集成了 OPPO 推送,需要指定 channelId 时,可向 Android 端研发人员获取channelId 由开发者自行创建。
*/
@property (nonatomic, copy) NSString *channelIdOPPO;
/*!
VIVO 推送通道类型
开发者集成了 VIVO 推送,需要指定推送类型时,可进行设置。
目前可选值 "0"(运营消息) 和 "1"(系统消息)
*/
@property (nonatomic, copy) NSString *typeVivo;
/*!
Vivo 推送消息分类
系统消息分类
即时消息[IM],账号与资产[ACCOUNT],日程待办[TODO],设备信息[DEVICE_REMINDER],订单与物流[ORDER],订阅提醒[SUBSCRIPTION]
运营消息分类
新闻[NEWS],内容推荐[CONTENT],运营活动[MARKETING],社交动态[SOCIAL]
更多信息请参考 Vivo 消息分类标准文档: https://dev.vivo.com.cn/documentCenter/doc/359
@discussion 默认值为 null如果为 null则以服务配置为准
@since 5.4.2
*/
@property (nonatomic, copy) NSString *categoryVivo;
/*!
FCM 通知类型推送时所使用的分组 id
*/
@property (nonatomic, copy) NSString *collapseKeyFCM;
/*!
FCM 通知类型的推送所使用的通知图片 url
*/
@property (nonatomic, copy) NSString *imageUrlFCM;
/*!
FCM 通知的频道 ID
该应用程序必须使用此频道 ID 创建一个频道,然后才能收到带有该频道 ID 的任何通知。如果您未在请求中发送此频道 ID或者如果应用尚未创建提供的频道 ID则 FCM 使用应用清单中指定的频道 ID。
*/
@property (nonatomic, copy) NSString *channelIdFCM;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,16 @@
//
// RCCallIWAudioConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWAudioConfig : NSObject
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,85 @@
//
// RCCallIWCallSession.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <UIKit/UIKit.h>
#import <RongCallWrapper/RCCallIWUserProfile.h>
#import <RongCallWrapper/RCCallIWDefine.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWCallSession : NSObject
/*!
通话类型
*/
@property (nonatomic, readonly) RCCallIWCallType callType;
/*!
通话媒体类型
*/
@property (nonatomic, readonly) RCCallIWMediaType mediaType;
/*!
通话id
*/
@property (nonatomic, readonly) NSString *callId;
/*!
通话目标id
*/
@property (nonatomic, readonly) NSString *targetId;
/*!
RTC会话唯一标识, 用于 Server API
*/
@property (nonatomic, readonly) NSString *sessionId;
/*!
通话的扩展信息
*/
@property (nonatomic, readonly) NSString *extra;
/*!
通话开始的时间
@discussion 如果是用户呼出的通话则startTime为通话呼出时间如果是呼入的通话则startTime为通话呼入时间。
*/
@property (nonatomic, readonly) long long startTime;
/*!
通话接通时间
*/
@property (nonatomic, readonly) long long connectedTime;
/*!
通话结束时间
*/
@property (nonatomic, readonly) long long endTime;
/*!
当前通话发起者
*/
@property (nonatomic, readonly) RCCallIWUserProfile *caller;
/*!
邀请当前用户到当前通话的邀请者
*/
@property (nonatomic, readonly) RCCallIWUserProfile *inviter;
/*!
当前用户
*/
@property (nonatomic, readonly) RCCallIWUserProfile *mine;
/*!
当前通话的全部用户列表
*/
@property (nonatomic, readonly) NSArray<RCCallIWUserProfile *> *users;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,429 @@
//
// RCCallIWDefine.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#ifndef RCCallIWDefine_h
#define RCCallIWDefine_h
#import <Foundation/Foundation.h>
/*!
用户身份类型
*/
typedef NS_ENUM(NSInteger, RCCallIWUserType) {
/*!
普通身份
*/
RCCallIWUserTypeNormal = 1,
/*!
观察者身份
*/
RCCallIWUserTypeObserver = 2
};
/*!
通话类型
*/
typedef NS_ENUM(NSInteger, RCCallIWCallType) {
/*!
单聊通话
*/
RCCallIWCallTypeSingle = 0,
/*!
群聊通话
*/
RCCallIWCallTypeGroup = 1
};
/*!
通话媒体类型
*/
typedef NS_ENUM(NSInteger, RCCallIWMediaType) {
/*!
音频通话
*/
RCCallIWMediaTypeAudio = 0,
/*!
音视频通话
*/
RCCallIWMediaTypeAudioVideo = 2
};
/*!
相机类型
*/
typedef NS_ENUM(NSInteger, RCCallIWCamera) {
/*!
未指定
*/
RCCallIWCameraNone = -1,
/*!
前置相机
*/
RCCallIWCameraFront = 0,
/*!
后置相机
*/
RCCallIWCameraBack = 1,
};
/*!
网络质量
*/
typedef NS_ENUM(NSInteger, RCCallIWNetworkQuality) {
/*!
未知
*/
RCCallIWNetworkQualityUnknown = 0,
/*!
极好
*/
RCCallIWNetworkQualityExcellent = 1,
/*!
*/
RCCallIWNetworkQualityGood = 2,
/*!
一般
*/
RCCallIWNetworkQualityPoor = 3,
/*!
*/
RCCallIWNetworkQualityBad = 4,
/*!
极差
*/
RCCallIWNetworkQualityTerrible = 5,
};
/*!
视频显示模式
*/
typedef NS_ENUM(NSInteger, RCCallIWViewFitType) {
/*!
拉伸全屏
*/
RCCallIWViewFitTypeFill = 0,
/*!
满屏显示, 等比例填充, 直到填充满整个试图区域,其中一个维度的部分区域会被裁剪
*/
RCCallIWViewFitTypeCover = 1,
/*!
完整显示, 填充黑边, 等比例填充,直达一个维度到达区域边界
*/
RCCallIWViewFitTypeCenter = 2,
};
/*!
通话视频参数
*/
typedef NS_ENUM (NSInteger, RCCallIWVideoProfile) {
/*!
144x256, 15fps, 120~240kbps
*/
RCCallIW_VIDEO_PROFILE_144_256 = 10,
/*!
240x240, 15fps, 120~280kbps
*/
RCCallIW_VIDEO_PROFILE_240_240 = 20,
/*!
240x320, 15fps, 120~400kbps
*/
RCCallIW_VIDEO_PROFILE_240_320 = 30,
/*!
360x480, 15fps, 150~650kbps
*/
RCCallIW_VIDEO_PROFILE_360_480 = 40,
/*!
360x640, 15fps, 180~800kbps
*/
RCCallIW_VIDEO_PROFILE_360_640 = 50,
/*!
480x640, 15fps, 200~900kbps
*/
RCCallIW_VIDEO_PROFILE_480_640 = 60,
/*!
480x720, 15fps, 200~1000kbps
*/
RCCallIW_VIDEO_PROFILE_480_720 = 70,
/*!
720x1280, 15fps, 250~2200kbps
*/
RCCallIW_VIDEO_PROFILE_720_1280 = 80,
/*!
1080x1920, 15fps, 400~4000kbps
*/
RCCallIW_VIDEO_PROFILE_1080_1920 = 90,
/*!
144x256, 30fps, 240~480kbps
*/
RCCallIW_VIDEO_PROFILE_144_256_HIGH = 11,
/*!
240x240, 30fps, 240~360kbps
*/
RCCallIW_VIDEO_PROFILE_240_240_HIGH = 21,
/*!
240x320, 30fps, 240~800kbps
*/
RCCallIW_VIDEO_PROFILE_240_320_HIGH = 31,
/*!
360x480, 30fps, 300~1300kbps
*/
RCCallIW_VIDEO_PROFILE_360_480_HIGH = 41,
/*!
360x640, 30fps, 360~1600kbps
*/
RCCallIW_VIDEO_PROFILE_360_640_HIGH = 51,
/*!
480x640, 30fps, 400~1800kbps
*/
RCCallIW_VIDEO_PROFILE_480_640_HIGH = 61,
/*!
480x720, 30fps, 400~2000kbps
*/
RCCallIW_VIDEO_PROFILE_480_720_HIGH = 71,
/*!
720x1080, 30fps, 500~4400kbps
*/
RCCallIW_VIDEO_PROFILE_720_1280_HIGH = 81,
/*!
1080x1920, 30fps, 800~8000kbps
*/
RCCallIW_VIDEO_PROFILE_1080_1920_HIGH = 91,
};
/*!
摄像机方向
值与 AVCaptureVideoOrientation 一致
*/
typedef NS_ENUM(NSInteger, RCCallIWCameraOrientation) {
RCCallIWCameraOrientationPortrait = 1,
RCCallIWCameraOrientationPortraitUpsideDown = 2,
RCCallIWCameraOrientationLandscapeRight = 3,
RCCallIWCameraOrientationLandscapeLeft = 4,
};
/*!
通话结束原因
*/
typedef NS_ENUM (NSInteger, RCCallIWDisconnectReason) {
/*!
己方取消已发出的通话请求
*/
RCCallIWDisconnectReasonCancel = 1,
/*!
己方拒绝收到的通话请求
*/
RCCallIWDisconnectReasonReject = 2,
/*!
己方挂断
*/
RCCallIWDisconnectReasonHangup = 3,
/*!
己方忙碌
*/
RCCallIWDisconnectReasonBusyLine = 4,
/*!
己方未接听
*/
RCCallIWDisconnectReasonNoResponse = 5,
/*!
己方不支持当前引擎
*/
RCCallIWDisconnectReasonEngineUnsupported = 6,
/*!
己方网络出错
*/
RCCallIWDisconnectReasonNetworkError = 7,
/*!
己方获取媒体资源失败
*/
RCCallIWDisconnectReasonResourceError = 8,
/*!
己方发布资源失败
*/
RCCallIWDisconnectReasonPublishError = 9,
/*!
己方订阅资源失败
*/
RCCallIWDisconnectReasonSubscribeError = 10,
/*!
对方取消已发出的通话请求
*/
RCCallIWDisconnectReasonRemoteCancel = 11,
/*!
对方拒绝收到的通话请求
*/
RCCallIWDisconnectReasonRemoteReject = 12,
/*!
通话过程对方挂断
*/
RCCallIWDisconnectReasonRemoteHangup = 13,
/*!
对方忙碌
*/
RCCallIWDisconnectReasonRemoteBusyLine = 14,
/*!
对方未接听
*/
RCCallIWDisconnectReasonRemoteNoResponse = 15,
/*!
对方不支持当前引擎
*/
RCCallIWDisconnectReasonRemoteEngineUnsupported = 16,
/*!
对方网络错误
*/
RCCallIWDisconnectReasonRemoteNetworkError = 17,
/*!
对方获取媒体资源失败
*/
RCCallIWDisconnectReasonRemoteResourceError = 18,
/*!
对方发布资源失败
*/
RCCallIWDisconnectReasonRemotePublishError = 19,
/*!
对方订阅资源失败
*/
RCCallIWDisconnectReasonRemoteSubscribeError = 20,
/*!
己方其他端已加入新通话
*/
RCCallIWDisconnectReasonKickedByOtherCall = 21,
/*!
己方其他端已在通话中
*/
RCCallIWDisconnectReasonInOtherCall = 22,
/*!
己方已被禁止通话
*/
RCCallIWDisconnectReasonKickedByServer = 23,
/*!
对方其他端已加入新通话
*/
RCCallIWDisconnectReasonRemoteKickedByOtherCall = 24,
/*!
对方其他端已在通话中
*/
RCCallIWDisconnectReasonRemoteInOtherCall = 25,
/*!
对方已被禁止通话
*/
RCCallIWDisconnectReasonRemoteKickedByServer = 26,
/*!
己方其他端已接听
*/
RCCallIWDisconnectReasonAcceptByOtherClient = 27,
/*!
己方其他端已挂断
*/
RCCallIWDisconnectReasonHangupByOtherClient = 28,
/*!
己方被对方加入黑名单
*/
RCCallIWDisconnectReasonAddToBlackList = 29,
/*!
音视频服务已关闭
*/
RCCallIWDisconnectReasonMediaServerClosed = 30,
/*!
己方被降级为观察者
*/
RCCallIWDisconnectReasonDegrade = 31,
/*!
己方摄像头初始化错误,可能是没有打开使用摄像头权限
*/
RCCallIWDisconnectReasonInitVideoError = 32,
/*!
其他端已经接听
*/
RCCallIWDisconnectReasonOtherDeviceHadAccepted = 33,
/*!
im ipc服务已断开
*/
RCCallIWDisconnectReasonServiceDisconnected = 34
};
/*!
通话错误类型
*/
typedef NS_ENUM (NSInteger, RCCallIWErrorCode) {
/*!
成功
*/
RCCallIWSuccess = 0,
/*!
开通的音视频服务没有及时生效或音视频服务已关闭请等待3-5小时后重新安装应用或开启音视频服务再进行测试
*/
RCCallIWEngineNotFound = 1,
/*!
网络不可用
*/
RCCallIWNetworkUnavailable = 2,
/*!
已经处于通话中了
*/
RCCallIWOneCallExisted = 3,
/*!
无效操作
*/
RCCallIWOperationUnavailable = 4,
/*!
参数错误
*/
RCCallIWInvalidParam = 5,
/*!
网络不稳定
*/
RCCallIWNetworkUnstable = 6,
/*!
媒体服务请求失败
*/
RCCallIWMediaRequestFailed = 7,
/*!
媒体服务初始化失败
*/
RCCallIWMediaServerNotReady = 8,
/*!
媒体服务未初始化
*/
RCCallIWMediaServerNotInitialized = 9,
/*!
媒体服务请求超时
*/
RCCallIWMediaRequestTimeout = 10,
/*!
未知的媒体服务错误
*/
RCCallIWMediaUnkownError = 11,
/*!
已被禁止通话
*/
RCCallIWMediaKickedByServerError = 12,
/*!
音视频服务已关闭
*/
RCCallIWMediaServerClosedError = 13,
/*!
音视频发布资源失败
*/
RCCallIWMediaServerPublishError = 14,
/*!
音视频订阅资源失败
*/
RCCallIWMediaServerSubscribeError = 15,
/*!
其他端已在通话中错误
*/
RCCallIWMediaJoinRoomRefuseError = 16
};
#endif /* RCCallIWDefine_h */

View File

@@ -0,0 +1,449 @@
//
// RCCallIWEngine.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <UIKit/UIKit.h>
#import <RongCallWrapper/RCCallIWDefine.h>
@class RCCallIWEngineConfig;
@class RCCallIWPushConfig;
@class RCCallIWAudioConfig;
@class RCCallIWVideoConfig;
@class RCCallIWCallSession;
@class RCCallIWUserProfile;
@class RCCallIWBeautyOption;
@protocol RCCallIWEngineDelegate;
@protocol RCCallIWSampleBufferVideoFrameDelegate;
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWEngine : NSObject
/*!
获取引擎实例
@return 引擎实例
*/
+ (RCCallIWEngine *)sharedInstance;
/*!
配置引擎
@param config 引擎配置
*/
- (void)setEngineConfig:(nullable RCCallIWEngineConfig *)config;
/*!
配置推送
@param callPushConfig 呼叫推送配置
@param hangupPushConfig 挂断推送配置
*/
- (void)setPushConfig:(nullable RCCallIWPushConfig *)callPushConfig
hangupPushConfig:(nullable RCCallIWPushConfig *)hangupPushConfig;
/*!
配置推送
@param callPushConfig 呼叫推送配置
@param hangupPushConfig 挂断推送配置
@param enableApplePushKit 设置是否使用苹果 PushKit 推送, YES 使用, NO 不使用
@discussion
是否打开苹果 PushKit 推送, 该推送可以直接激活 App, 注: iOS 13 以后 PushKit 必须结合苹果 CallKit.framework 进行使用, 否则无法正常处理 VoIP 相关推送逻辑,
如果设置为 NO 则使用普通 APNS 消息推送来处理音视频信令逻辑, 默认关闭. 打开之后 App 默认需要自行处理 VoIP 推送唤起 CallKit.framework 的逻辑.
*/
- (void)setPushConfig:(nullable RCCallIWPushConfig *)callPushConfig
hangupPushConfig:(nullable RCCallIWPushConfig *)hangupPushConfig
enableApplePushKit:(BOOL)enableApplePushKit;
/*!
配置音频
@param config 音频配置
*/
- (void)setAudioConfig:(nullable RCCallIWAudioConfig *)config;
/*!
配置视频
@param config 视频配置
*/
- (void)setVideoConfig:(nullable RCCallIWVideoConfig *)config;
/*!
配置监听
@param delegate 监听代理
*/
- (void)setEngineDelegate:(nullable NSObject<RCCallIWEngineDelegate> *)delegate;
/*!
拨打电话-单聊
@param userId 被叫端UserId
@param type 发起的通话媒体类型
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前Call Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)userId
type:(RCCallIWMediaType)type;
/*!
拨打电话-单聊
@param userId 被叫端UserId
@param type 发起的通话媒体类型
@param extra 附件信息
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前通话 Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)userId
type:(RCCallIWMediaType)type
extra:(nullable NSString *)extra;
/*!
拨打电话-群聊
@param groupId 群组Id
@param userIds 被叫端的用户ID列表, 数组中仅填写被叫端UserId, 请不要填写主叫端UserId, 否则无法发起呼叫
@param type 发起的通话媒体类型
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前通话 Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)groupId
userIds:(NSArray<NSString *> *)userIds
type:(RCCallIWMediaType)type;
/*!
拨打电话-群聊
@param groupId 群组Id
@param userIds 被叫端的用户ID列表, 数组中仅填写被叫端UserId, 请不要填写主叫端UserId, 否则无法发起呼叫
@param type 发起的通话媒体类型
@param extra 附件信息
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前通话 Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)groupId
userIds:(NSArray<NSString *> *)userIds
type:(RCCallIWMediaType)type
extra:(nullable NSString *)extra;
/*!
拨打电话-群聊
@param groupId 群组Id
@param userIds 被叫端的用户ID列表, 数组中仅填写被叫端UserId, 请不要填写主叫端UserId, 否则无法发起呼叫
@param observerUserIds 主叫端指定需要以观察者身份加入房间的用户ID列表, 如果主叫端需要以观察者身份加入房间也需要填写主叫端UserId
@param type 发起的通话媒体类型
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前通话 Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)groupId
userIds:(NSArray<NSString *> *)userIds
observerUserIds:(nullable NSArray<NSString *> *)observerUserIds
type:(RCCallIWMediaType)type;
/*!
拨打电话-群聊
@param groupId 群组Id
@param userIds 被叫端的用户ID列表, 数组中仅填写被叫端UserId, 请不要填写主叫端UserId, 否则无法发起呼叫
@param observerUserIds 主叫端指定需要以观察者身份加入房间的用户ID列表, 如果主叫端需要以观察者身份加入房间也需要填写主叫端UserId
@param type 发起的通话媒体类型
@param extra 附件信息
@discussion
如果type为音视频直接打开默认前置摄像头。
@return 当前通话 Session
*/
- (RCCallIWCallSession *)startCall:(NSString *)groupId
userIds:(NSArray<NSString *> *)userIds
observerUserIds:(nullable NSArray<NSString *> *)observerUserIds
type:(RCCallIWMediaType)type
extra:(nullable NSString *)extra;
/*!
获取当前通话 Session
@return 当前通话 Session
*/
- (RCCallIWCallSession *)getCurrentCallSession;
/*!
接电话
@discussion
如果呼入类型为语音通话,即接受语音通话,如果呼入类型为视频通话,即接受视频通话,打开默认(前置)摄像头。
观察者不开启摄像头。
*/
- (void)accept;
/*!
挂断电话
*/
- (void)hangup;
/*!
麦克风控制
@param enable YES 开启麦克风NO 关闭麦克风
*/
- (void)enableMicrophone:(BOOL)enable;
/*!
获取当前麦克风状态
@return 当前麦克风是否开启
*/
- (BOOL)isEnableMicrophone;
/*!
扬声器控制
@param enable YES 开启扬声器NO 关闭扬声器
*/
- (void)enableSpeaker:(BOOL)enable;
/*!
获取当前扬声器状态
@return 当前扬声器是否开启
*/
- (BOOL)isEnableSpeaker;
/*!
摄像头控制
@param enable YES 开启摄像头NO 关闭摄像头
*/
- (void)enableCamera:(BOOL)enable;
/*!
摄像头控制
@param enable YES 开启摄像头NO 关闭摄像头
@param camera 指定摄像头
*/
- (void)enableCamera:(BOOL)enable camera:(RCCallIWCamera)camera;
/*!
获取当前摄像头状态
@return 当前摄像头是否开启
*/
- (BOOL)isEnableCamera;
/*!
获取当前摄像头
@return 当前摄像头
*/
- (RCCallIWCamera)currentCamera;
/*!
翻转摄像头
*/
- (void)switchCamera;
/*!
设置预览窗口
@param userId 用户id
@param view 视频预览视图
*/
- (void)setVideoView:(NSString *)userId
view:(UIView *)view;
/*!
设置预览窗口
@param userId 用户id
@param view 视频预览视图
@param fit 视频显示模式
*/
- (void)setVideoView:(NSString *)userId
view:(UIView *)view
fit:(RCCallIWViewFitType)fit;
/*!
修改通话媒体类型
@param type 通话媒体类型
*/
- (void)changeMediaType:(RCCallIWMediaType)type;
/*!
邀请用户
@param userIds 被邀请用户id列表
*/
- (void)inviteUsers:(NSArray<NSString *> *)userIds;
/*!
邀请用户
@param userIds 被邀请用户id列表
@param observerUserIds 被邀请观察者id列表
*/
- (void)inviteUsers:(NSArray<NSString *> *)userIds
observerUserIds:(NSArray<NSString *> *)observerUserIds;
- (void)setLocalVideoProcessedDelegate:(id<RCCallIWSampleBufferVideoFrameDelegate>)delegate;
@end
@protocol RCCallIWEngineDelegate <NSObject>
@required
/*!
接收到通话呼入的回调
@param session 通话Session
*/
- (void)didReceiveCall:(RCCallIWCallSession *)session;
/*!
通话已接通
*/
- (void)callDidConnect;
/*!
通话已结束
@param reason 结束原因
*/
- (void)callDidDisconnect:(RCCallIWDisconnectReason)reason;
/*!
对端用户加入了通话
@param user 对端用户信息
*/
- (void)remoteUserDidJoin:(RCCallIWUserProfile *)user;
/*!
对端用户挂断
@param userId 对端用户信息
@param reason 挂断原因
*/
- (void)remoteUserDidLeave:(NSString *)userId
reason:(RCCallIWDisconnectReason)reason;
@optional
/*!
接收到通话呼入的远程通知的回调
*/
- (void)didReceiveCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallIWMediaType)mediaType
userIdList:(NSArray *)userIdList
userDict:(NSDictionary *)userDict
isVoIPPush:(BOOL)isVoIPPush
pushConfig:(RCCallIWPushConfig *)pushConfig;
/*!
接收到取消通话的远程通知的回调
*/
- (void)didCancelCallRemoteNotification:(NSString *)callId
inviterUserId:(NSString *)inviterUserId
mediaType:(RCCallIWMediaType)mediaType
userIdList:(NSArray *)userIdList
pushConfig:(RCCallIWPushConfig *)pushConfig
isRemoteCancel:(BOOL)isRemoteCancel;
/*!
开启/关闭摄像头的回调
*/
- (void)didEnableCamera:(RCCallIWCamera)camera
enable:(BOOL)enable;
/*!
切换摄像头的回调
@param camera 当前选择的摄像头
*/
- (void)didSwitchCamera:(RCCallIWCamera)camera;
/*!
通话出现错误的回调
*/
- (void)callDidError:(RCCallIWErrorCode)code;
/*!
开始呼叫通话的回调
*/
- (void)callDidMake;
/*!
对端用户正在振铃
*/
- (void)remoteUserDidRing:(NSString *)userId;
/*!
有用户被邀请加入通话
*/
- (void)remoteUserDidInvite:(NSString *)userId
mediaType:(RCCallIWMediaType)mediaType;
/*!
对端用户切换了媒体类型
*/
- (void)remoteUserDidChangeMediaType:(RCCallIWUserProfile *)user
mediaType:(RCCallIWMediaType)mediaType;
/*!
对端用户开启或关闭了麦克风的状态
*/
- (void)remoteUserDidChangeMicrophoneState:(RCCallIWUserProfile *)user
enable:(BOOL)enable;
/*!
对端用户开启或关闭了摄像头的状态
*/
- (void)remoteUserDidChangeCameraState:(RCCallIWUserProfile *)user
enable:(BOOL)enable;
/*!
当前通话网络状态的回调,该回调方法每秒触发一次
@param user 用户信息
@param quality 网络质量
@discussion
如果user是本端用户, quality代表上行网络质量
如果user是远端用户, quality代表下行网络质量
*/
- (void)user:(RCCallIWUserProfile *)user networkQuality:(RCCallIWNetworkQuality)quality;
/*!
当前通话某用户声音音量回调,该回调方法每两秒触发一次
@param user 用户信息
@param volume 声音音量
@discussion
声音级别: 0~9, 0为无声, 依次变大
如果user是本端用户, volume代表发送音量
如果user是远端用户, volume代表接收音量
*/
- (void)user:(RCCallIWUserProfile *)user audioVolume:(int)volume;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,23 @@
//
// RCCallIWEngineConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
/*!
引擎配置
*/
@interface RCCallIWEngineConfig : NSObject
/*!
开启通话记录 默认NO
*/
@property (nonatomic, assign) BOOL enableCallSummary;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,41 @@
//
// RCCallIWFlutterView.h
// RongCallWrapper
//
// Created by 潘铭达 on 2021/6/16.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol RCCallIWFlutterViewDelegate <NSObject>
- (void)changeSize:(int)width height:(int)height;
- (void)changeRotation:(int)rotation;
- (void)firstFrameRendered;
- (void)frameRendered;
// 当原生层摄像头进行操作的时候 通知 Flutter 层的 view 进行视图的镜像操作
- (void)onMirrorChanged:(BOOL)mirror;
@end
@interface RCCallIWFlutterView : NSObject
@property (nonatomic, weak) id<RCCallIWFlutterViewDelegate> textureViewDelegate;
- (instancetype)init NS_UNAVAILABLE;
- (instancetype)new NS_UNAVAILABLE;
- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;
+ (RCCallIWFlutterView *)create;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,41 @@
//
// RCCallIWIOSPushConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWIOSPushConfig : NSObject
/*!
iOS 平台通知栏分组 ID
相同的 thread-id 推送分为一组
iOS10 开始支持
*/
@property (nonatomic, copy) NSString *threadId;
/*!
iOS 标识推送的类型
如果不设置后台默认取消息类型字符串,如 RC:TxtMsg
*/
@property (nonatomic, copy) NSString *category;
/*!
iOS 平台通知覆盖 ID
apnsCollapseId 相同时,新收到的通知会覆盖老的通知,最大 64 字节
iOS10 开始支持
*/
@property (nonatomic, copy) NSString *apnsCollapseId;
/*!
iOS 富文本推送内容
*/
@property (nonatomic, copy) NSString *richMediaUri;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,74 @@
//
// RCCallIWPushConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
#import <RongCallWrapper/RCCallIWIOSPushConfig.h>
#import <RongCallWrapper/RCCallIWAndroidPushConfig.h>
NS_ASSUME_NONNULL_BEGIN
/*!
推送配置
*/
@interface RCCallIWPushConfig : NSObject
/*!
是否屏蔽通知标题
YES: 不显示通知标题
NO: 显示通知标题
@discussion 默认情况下融云单聊消息通知标题为用户名、群聊消息为群名称,设置后不会再显示通知标题。
@discussion 此属性只针目标用户为 iOS 平台时有效Android 第三方推送平台的通知标题为必填项,所以暂不支持。
*/
@property (nonatomic, assign) BOOL disableTitle;
/*!
推送标题
如果没有设置,会使用下面的默认标题显示规则
默认标题显示规则:
内置消息:单聊通知标题显示为发送者名称,群聊通知标题显示为群名称。
自定义消息:默认不显示标题。
*/
@property (nonatomic, copy) NSString *title;
/*!
推送内容
优先使用 MessagePushConfig 的 pushContent如果没有则使用 sendMessage 或者 sendMediaMessage 的 pushContent。
*/
@property (nonatomic, copy) NSString *content;
/*!
远程推送附加信息
优先使用 MessagePushConfig 的 pushData如果没有则使用 sendMessage 或者 sendMediaMessage 的 pushData。
*/
@property (nonatomic, copy) NSString *data;
/*!
是否强制显示通知详情
当目标用户通过 RCPushProfile 中的 updateShowPushContentStatus 设置推送不显示消息详情时,可通过此参数,强制设置该条消息显示推送详情。
*/
@property (nonatomic, assign) BOOL forceShowDetailContent;
/*!
推送模板 ID设置后根据目标用户通过 SDK RCPushProfile 中的 setPushLauguageCode 设置的语言环境,匹配模板中设置的语言内容进行推送,未匹配成功时使用默认内容进行推送,模板内容在“开发者后台-自定义推送文案”中进行设置。
RCMessagePushConfig 中的 Title 和 PushContent 优先级高于模板 IDtemplateId中对应的标题和推送内容。
*/
@property (nonatomic, copy) NSString *templateId;
/*!
iOS 平台相关配置
*/
@property (nonatomic, strong) RCCallIWIOSPushConfig *iOSConfig;
/*!
Android 平台相关配置
*/
@property (nonatomic, strong) RCCallIWAndroidPushConfig *androidConfig;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,41 @@
//
// RCCallIWUserProfile.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
#import <RongCallWrapper/RCCallIWDefine.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWUserProfile : NSObject
/*!
用户身份类型
*/
@property (nonatomic, readonly) RCCallIWUserType userType;
/*!
通话媒体类型
*/
@property (nonatomic, readonly) RCCallIWMediaType mediaType;
/*!
用户id
*/
@property (nonatomic, readonly) NSString *userId;
/*!
用户的通话媒体连接ID
*/
@property (nonatomic, readonly) NSString *mediaId;
/*!
用户是否开启摄像头
*/
@property (nonatomic, readonly) BOOL enableCamera;
/*!
用户是否开启麦克风
*/
@property (nonatomic, readonly) BOOL enableMicrophone;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,40 @@
//
// RCCallIWVideoConfig.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/14.
//
#import <Foundation/Foundation.h>
#import <RongCallWrapper/RCCallIWDefine.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWVideoConfig : NSObject
/*!
视频配置
默认值 RCCallIW_VIDEO_PROFILE_720_1280
*/
@property (nonatomic, assign) RCCallIWVideoProfile profile;
/*!
摄像头
默认值 RCCallIWCameraFront
*/
@property (nonatomic, assign) RCCallIWCamera defaultCamera;
/*!
相机方向
默认值 RCCallIWCameraOrientationPortrait
*/
@property (nonatomic, assign) RCCallIWCameraOrientation cameraOrientation;
/*!
本地预览是否镜像
前置摄像头默认: YES后置摄像头默认: NO
*/
@property (nonatomic, assign) BOOL isPreviewMirror;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,18 @@
//
// RCCallIWVideoFrameDelegate.h
// RongCallWrapper
//
// Created by 潘铭达 on 2021/12/27.
//
#import <AVFoundation/AVFoundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol RCCallIWSampleBufferVideoFrameDelegate <NSObject>
- (void)onPixelBuffer:(CVPixelBufferRef)pixelBuffer;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,23 @@
//
// RCCallIWVideoView.h
// RongCallWrapper
//
// Created by RongCloud on 2023/5/12.
//
#import <UIKit/UIKit.h>
#import <RongRTCLib/RongRTCLib.h>
NS_ASSUME_NONNULL_BEGIN
@interface RCCallIWVideoView : UIView
@property (nonatomic, weak, readonly) RCRTCVideoView *videoView;
// 预览是否镜像 (最终设置的是原生 videoView所以要注意设置的时机
@property (nonatomic, assign) BOOL isMirror;
// 原生 videoView 添加完成
@property (nonatomic, copy) void(^nativeVideoViewDidAdd)(RCRTCVideoView *videoView);
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,28 @@
//
// RongCallWrapper.h
// RongCallWrapper
//
// Created by RongCloud on 2021/7/12.
//
#import <Foundation/Foundation.h>
//! Project version number for RongCallWrapper.
FOUNDATION_EXPORT double RongCallWrapperVersionNumber;
//! Project version string for RongCallWrapper.
FOUNDATION_EXPORT const unsigned char RongCallWrapperVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <RongCallWrapper/PublicHeader.h>
#import <RongCallWrapper/RCCallIWDefine.h>
#import <RongCallWrapper/RCCallIWEngine.h>
#import <RongCallWrapper/RCCallIWCallSession.h>
#import <RongCallWrapper/RCCallIWEngineConfig.h>
#import <RongCallWrapper/RCCallIWAudioConfig.h>
#import <RongCallWrapper/RCCallIWVideoConfig.h>
#import <RongCallWrapper/RCCallIWPushConfig.h>
#import <RongCallWrapper/RCCallIWIOSPushConfig.h>
#import <RongCallWrapper/RCCallIWAndroidPushConfig.h>
#import <RongCallWrapper/RCCallIWUserProfile.h>
#import <RongCallWrapper/RCCallIWFlutterView.h>
#import <RongCallWrapper/RCCallIWVideoFrameDelegate.h>

View File

@@ -0,0 +1,6 @@
framework module RongCallWrapper {
umbrella header "RongCallWrapper.h"
export *
module * { export * }
}

View File

@@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Location</key>
<dict>
<key>LocationImageQuality</key>
<real>0.7</real>
<key>LocationImageWidth</key>
<string>480</string>
<key>LocationImageHeight</key>
<string>240</string>
</dict>
<key>File</key>
<dict>
<key>RelativePath</key>
<string>Documents/MyFile</string>
<key>MaxRangeUnit</key>
<real>1048576</real>
</dict>
<key>Voice</key>
<dict>
<key>AudioEncodingBitRate</key>
<real>7950</real>
</dict>
<key>Image</key>
<dict>
<key>ThumbnailQuality</key>
<string>0.3</string>
<key>ThumbnailMaxSize</key>
<string>240</string>
<key>ThumbnailMinSize</key>
<string>100</string>
<key>ImageQuality</key>
<real>0.85</real>
<key>ImageWidth</key>
<integer>1080</integer>
<key>ImageHeight</key>
<integer>1080</integer>
</dict>
<key>CustomerService</key>
<dict>
<key>SuspendWhenLeave</key>
<true/>
</dict>
<key>Download</key>
<dict>
<key>DownloadSliceSize</key>
<real>20971520</real>
</dict>
<key>Sight</key>
<dict>
<key>SightCompressWidth</key>
<integer>540</integer>
<key>SightCompressHeight</key>
<integer>960</integer>
</dict>
<key>HeartBeatInterval</key>
<integer>15</integer>
</dict>
</plist>

View File

@@ -0,0 +1,372 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Headers/RCCallIWAndroidPushConfig.h</key>
<data>
c8Nr+zXJBvG4EEuUrT1QFmj5fnQ=
</data>
<key>Headers/RCCallIWAudioConfig.h</key>
<data>
kGPMWb7BecYVlHQ9V+f794nOR4w=
</data>
<key>Headers/RCCallIWCallSession.h</key>
<data>
AnhTDcH3VjceT8E5vwfn4M1KRkE=
</data>
<key>Headers/RCCallIWDefine.h</key>
<data>
DAGsL8w84kqw8ZXp2cNbh7QSWLI=
</data>
<key>Headers/RCCallIWEngine.h</key>
<data>
Z4zTFQqdlABKiqe5+snC7d6/BpA=
</data>
<key>Headers/RCCallIWEngineConfig.h</key>
<data>
yQGCGoe19+myITZLqeO0VadV7Js=
</data>
<key>Headers/RCCallIWFlutterView.h</key>
<data>
y2cqUnU8QMNZ3CG0+C2mMNsxzic=
</data>
<key>Headers/RCCallIWIOSPushConfig.h</key>
<data>
8qkNfl6i7/7v8+Ff+yCXkSZcbKA=
</data>
<key>Headers/RCCallIWPushConfig.h</key>
<data>
Dl/lC2HDVoElj5rdcPDirtFy00I=
</data>
<key>Headers/RCCallIWUserProfile.h</key>
<data>
OirfPQvRXiMSA7f7QCyBpmskr8E=
</data>
<key>Headers/RCCallIWVideoConfig.h</key>
<data>
kOdMpo6eHS1xv3wjNG6+ZiTkjLo=
</data>
<key>Headers/RCCallIWVideoFrameDelegate.h</key>
<data>
4E8xM7l79Q0pj+PqnOIaLalKHZ0=
</data>
<key>Headers/RCCallIWVideoView.h</key>
<data>
ibFWGpV35ABCTAhuEtUsgKHQVnw=
</data>
<key>Headers/RongCallWrapper.h</key>
<data>
vXZ3cAYx+Hn3GKcucUwV0K4j8DQ=
</data>
<key>Info.plist</key>
<data>
eSwRbQaZaWWJvuK9mFRGBJ74yy0=
</data>
<key>Modules/module.modulemap</key>
<data>
mB2JsmGuPd2g/QyaXMtdCzdDuzw=
</data>
<key>RCConfig.plist</key>
<data>
QA7nn/q1j2Y4AJbaGtBBs8g71xE=
</data>
<key>RongRTCLib.bundle/HwAiVadModel.bin</key>
<data>
ATcRMel9IwX111oJWJbEEm8fxLw=
</data>
<key>RongRTCLib.bundle/HwAinrModel.bin</key>
<data>
B8kB+UwS+Djpk42nGs6PsuZb4i4=
</data>
</dict>
<key>files2</key>
<dict>
<key>Headers/RCCallIWAndroidPushConfig.h</key>
<dict>
<key>hash</key>
<data>
c8Nr+zXJBvG4EEuUrT1QFmj5fnQ=
</data>
<key>hash2</key>
<data>
tUBraHIlNP/nvghXtWtweS8roeTuGXH5le7Gtoqg2lI=
</data>
</dict>
<key>Headers/RCCallIWAudioConfig.h</key>
<dict>
<key>hash</key>
<data>
kGPMWb7BecYVlHQ9V+f794nOR4w=
</data>
<key>hash2</key>
<data>
h7YMB2G9xbeDIdlGpjDdy7VeEd1V1lY0bhUhPnmj7do=
</data>
</dict>
<key>Headers/RCCallIWCallSession.h</key>
<dict>
<key>hash</key>
<data>
AnhTDcH3VjceT8E5vwfn4M1KRkE=
</data>
<key>hash2</key>
<data>
47JdoajKNgc8PvI2M1lo7XgKFDap/8zNE5aubhiMO9g=
</data>
</dict>
<key>Headers/RCCallIWDefine.h</key>
<dict>
<key>hash</key>
<data>
DAGsL8w84kqw8ZXp2cNbh7QSWLI=
</data>
<key>hash2</key>
<data>
Txy4g9BC23EsyFZkra0VUfIXAZ+pOnmxcrIhTeyNNSw=
</data>
</dict>
<key>Headers/RCCallIWEngine.h</key>
<dict>
<key>hash</key>
<data>
Z4zTFQqdlABKiqe5+snC7d6/BpA=
</data>
<key>hash2</key>
<data>
N8ZP4WzDTeXJ9tD15nIZiMEXBKA1ndfNuInF3WNd1pE=
</data>
</dict>
<key>Headers/RCCallIWEngineConfig.h</key>
<dict>
<key>hash</key>
<data>
yQGCGoe19+myITZLqeO0VadV7Js=
</data>
<key>hash2</key>
<data>
+LkKAOHRYcPLjKrmOMYPRIr8DULzitIdlJyGE/v7hIo=
</data>
</dict>
<key>Headers/RCCallIWFlutterView.h</key>
<dict>
<key>hash</key>
<data>
y2cqUnU8QMNZ3CG0+C2mMNsxzic=
</data>
<key>hash2</key>
<data>
IgRu9C00s2UBfZL10F56c7rG2Xu3yS1AM1ET+CChUlQ=
</data>
</dict>
<key>Headers/RCCallIWIOSPushConfig.h</key>
<dict>
<key>hash</key>
<data>
8qkNfl6i7/7v8+Ff+yCXkSZcbKA=
</data>
<key>hash2</key>
<data>
4IZfnNPqAtJn0v1WGY1M4TmPWPwWbaeNWxUf2qNdFKw=
</data>
</dict>
<key>Headers/RCCallIWPushConfig.h</key>
<dict>
<key>hash</key>
<data>
Dl/lC2HDVoElj5rdcPDirtFy00I=
</data>
<key>hash2</key>
<data>
h+XlKn0zxZLWTqirksIReWFIy98pxSzpVOxUcCzgudo=
</data>
</dict>
<key>Headers/RCCallIWUserProfile.h</key>
<dict>
<key>hash</key>
<data>
OirfPQvRXiMSA7f7QCyBpmskr8E=
</data>
<key>hash2</key>
<data>
QmOPdaT/+idE+GEzrr3QR9BAsf0n10xelqc6s0vnOfw=
</data>
</dict>
<key>Headers/RCCallIWVideoConfig.h</key>
<dict>
<key>hash</key>
<data>
kOdMpo6eHS1xv3wjNG6+ZiTkjLo=
</data>
<key>hash2</key>
<data>
UOkF0SEprFatUeYdw91eH8BhSBNcYalRGdJV7OeZszw=
</data>
</dict>
<key>Headers/RCCallIWVideoFrameDelegate.h</key>
<dict>
<key>hash</key>
<data>
4E8xM7l79Q0pj+PqnOIaLalKHZ0=
</data>
<key>hash2</key>
<data>
eVaF/p0qpzOF6/ryCEJ7Q2gdkyovIwmHM2QRFaFLjrU=
</data>
</dict>
<key>Headers/RCCallIWVideoView.h</key>
<dict>
<key>hash</key>
<data>
ibFWGpV35ABCTAhuEtUsgKHQVnw=
</data>
<key>hash2</key>
<data>
jiI7NxMC7CAXlY9mE0LW6YkSMEXIfnjoVS7yDUorUBg=
</data>
</dict>
<key>Headers/RongCallWrapper.h</key>
<dict>
<key>hash</key>
<data>
vXZ3cAYx+Hn3GKcucUwV0K4j8DQ=
</data>
<key>hash2</key>
<data>
TjeCqYh2mGPCDpHUTUAWlH8YPUvjci/ocEqzb+pJWoM=
</data>
</dict>
<key>Modules/module.modulemap</key>
<dict>
<key>hash</key>
<data>
mB2JsmGuPd2g/QyaXMtdCzdDuzw=
</data>
<key>hash2</key>
<data>
HjxU8CFo4bZWSBFLKJxPfiAlkZdKpuae+1t2Iqu0d+s=
</data>
</dict>
<key>RCConfig.plist</key>
<dict>
<key>hash</key>
<data>
QA7nn/q1j2Y4AJbaGtBBs8g71xE=
</data>
<key>hash2</key>
<data>
q9qti/DvWdK6nHCUQ3R/b3gsZ4wASUjoeUzGtn7YyXI=
</data>
</dict>
<key>RongRTCLib.bundle/HwAiVadModel.bin</key>
<dict>
<key>hash</key>
<data>
ATcRMel9IwX111oJWJbEEm8fxLw=
</data>
<key>hash2</key>
<data>
rI/0N8nw9Ktvh3flHD50aM1unvKAoT4PXCZogPS4lzo=
</data>
</dict>
<key>RongRTCLib.bundle/HwAinrModel.bin</key>
<dict>
<key>hash</key>
<data>
B8kB+UwS+Djpk42nGs6PsuZb4i4=
</data>
<key>hash2</key>
<data>
wWEpSmpBqk1A1pnvwExjRDLmRm4kLI6s07dug5+9ftg=
</data>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>