1 预备环境

在开端集成 ZEGO Express SDK 前,请确保开发环境满足以下要求:

  • Xcode 12.0 或以上版本。
  • iOS 9.0 或以上版本且支撑音视频的 iOS 设备。
  • iOS 设备现已连接到 Internet。

2 项目预备

2.1 创立项目

进入即构官网,在【ZEGO控制台】创立项目,并申请有用的 AppID,这一步很要害,appid为应用的仅有标识,如身份证号,是应用的身份证明,用于明确你的项目及组织身份。zego供给的服务也是基于APP ID;

App ID的获取办法很简单,只需3~5分钟,在即构官网-我的项目-创立即可。创立的项目信息可用于SDK的集成和装备;

2.2 Token 鉴权

  • 登录房间时有必要 运用 Token 鉴权 ,可参阅 Token 鉴权教程
  • 为了便利开发阶段的调试,开发者可直接在 ZEGO 控制台获取暂时 Token(有用期为 24 小时) 来运用,详情请参阅 控制台(新版) – 项目办理 中的 “项目信息”。

3 集成

3.1 项目设置

开端集成前,可参阅如下过程设置你的项目;

如已有项目,本过程可疏忽。

如需新建项目,可按照以下过程创立你的新项目:

  1. 发动 Xcode,在 “Welcome to Xcode” 窗口中单击 “Create a new Xcode project” 或挑选 “File > New > Project” 菜单。在呈现的表单中,挑选 iOS 渠道,并在 “Application” 下挑选 “App”。

    基于 ZEGO SDK 实现 iOS 一对一音视频聊天应用

  2. 填写表单并选取各个选项来装备项目,完成后,单击 “Next”。 有必要供给 “Product Name” 和 “Organization Identifier”,用于创立 App 的仅有标识 “Bundle Identifier”。

    基于 ZEGO SDK 实现 iOS 一对一音视频聊天应用

  3. 挑选项目存储路径,单击 “Create” 创立项目。

    基于 ZEGO SDK 实现 iOS 一对一音视频聊天应用

3.2 导入 SDK

运用 CocoaPods 主动集成

  1. 装置 CocoaPods
  2. 翻开终端,进入项目根目录,履行 pod init 指令创立 Podfile 文件。
  3. 翻开 Podfile 文件,在 “target” 下增加 po``d``'``Z``ego``E``xpress``Engine/V``ideo',需求将 “MyProject” 替换为开发者的 Target 名称。
target 'MyProject' do
    use_frameworks!
    pod 'ZegoExpressEngine/Video'
end
  1. 履行 pod repo update 指令更新本地索引,确保能装置最新版本的 SDK,最新版本号请参阅 下载 SDK 包 中的发布历史。
  2. 履行 pod install 指令装置 SDK。

4 完成流程

用户经过 ZEGO Express SDK 进行视频通话的根本流程为:

用户 A、B 参加房间,用户 B 预览并将音视频流推送到 ZEGO 云服务(推流),用户 A 收到用户 B 推送音视频流的告诉之后,在告诉中播映用户 B 的音视频流(拉流)。

基于 ZEGO SDK 实现 iOS 一对一音视频聊天应用

整个音视频通话推拉流过程的 API 调用时序如下图:

基于 ZEGO SDK 实现 iOS 一对一音视频聊天应用

4.1 初始化

1. 创立界面

根据场景需求,为你的项目创立视频通话的用户界面。咱们推荐你在项目中增加如下元素:

  • 本地视频窗口
  • 远端视频窗口
  • 结束通话按钮
    基于 ZEGO SDK 实现 iOS 一对一音视频聊天应用

2.引进头文件,预备根底作业

// 引进 ZegoExpressEngine.h 头文件
#import <ZegoExpressEngine/ZegoExpressEngine.h>
@interface ViewController ()<ZegoEventHandler>
//拉取播映其他用户音视频流的 view
@property (strong, nonatomic) UIView *remoteUserView;
//开端视频通话的按钮
@property (strong, nonatomic) UIButton *startVideoTalkButton;
//中止视频通话的按钮
@property (strong, nonatomic) UIButton *stopVideoTalkButton;
@end
- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupUI];
}
- (void)setupUI {
    self.remoteUserView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 180, 250)];
    self.remoteUserView.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:self.remoteUserView];
    self.startVideoTalkButton = [UIButton buttonWithType:UIButtonTypeSystem];
    [self.view addSubview:self.startVideoTalkButton];
    self.startVideoTalkButton.frame = CGRectMake(100, self.view.bounds.size.height - 280, 150, 50);
    [self.startVideoTalkButton.titleLabel setFont:[UIFont systemFontOfSize:32]];
    [self.startVideoTalkButton setTitle:@"开端通话" forState:UIControlStateNormal];
    [self.startVideoTalkButton addTarget:self action:@selector(startVideoTalk:) forControlEvents:UIControlEventTouchUpInside];
    self.stopVideoTalkButton = [UIButton buttonWithType:UIButtonTypeSystem];
    [self.view addSubview:self.stopVideoTalkButton];
    self.stopVideoTalkButton.frame = CGRectMake(100, self.view.bounds.size.height - 200, 150, 50);
    [self.stopVideoTalkButton.titleLabel setFont:[UIFont systemFontOfSize:32]];
    [self.stopVideoTalkButton setTitle:@"中止通话" forState:UIControlStateNormal];
    [self.stopVideoTalkButton setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
    [self.stopVideoTalkButton addTarget:self action:@selector(stopVideoTalk:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)startVideoTalk:(UIButton *)button {
    [self createEngine];
    [self loginRoom];
    [self startPublish];
}

3. 创立引擎

调用 createEngineWithProfile 接口,将申请到的 AppID 传入参数 “appID”,创立引擎单例目标。

注册回调,可将完成了 ZegoEventHandler 的目标(例如 “self”)传入参数 “eventHandler”。

- (void)createEngine {
    ZegoEngineProfile *profile = [[ZegoEngineProfile alloc] init];
    // 请经过官网注册获取,格局为:1234567890
    profile.appID = <#appID#>;
    //通用场景接入
    profile.scenario = ZegoScenarioGeneral;
    // 创立引擎,并注册 self 为 eventHandler 回调。不需求注册回调的话,eventHandler 参数能够传 nil,后续可调用 "-setEventHandler:" 办法设置回调
    [ZegoExpressEngine createEngineWithProfile:profile eventHandler:self];
}

6.2 登录房间

调用 loginRoom 接口登录房间。roomID 和 user 的参数由您本地生成,可是需求满足以下条件:

  • 同一个 AppID 内,需确保 “roomID” 大局仅有。
  • 同一个 AppID 内,需确保 “userID” 大局仅有,主张开发者将 “userID” 与自己业务的账号体系进行相关。
- (void)loginRoom {
    // roomID 由您本地生成,需确保 “roomID” 大局仅有。不同用户要登陆同一个房间才干进行通话
    NSString *roomID = @"room1";
    // 创立用户目标,ZegoUser 的结构办法 userWithUserID 会将 “userName” 设为与传的参数 “userID” 一样。“userID” 与 “userName” 不能为 “nil”,否则会导致登录房间失利。
    // userID 由您本地生成,需确保 “userID” 大局仅有。
    ZegoUser *user = [ZegoUser userWithUserID:@"user1"];
    // 只要传入 “isUserStatusNotify” 参数取值为 “true” 的 ZegoRoomConfig,才干收到 onRoomUserUpdate 回调。
    ZegoRoomConfig *roomConfig = [[ZegoRoomConfig alloc] init];
    //token 由用户自己的服务端生成,为了更快跑通流程,也能够经过即构控制台 https://console.zego.im/dashboard 获取暂时的音视频 token
    roomConfig.token = @"<#token#>";
    roomConfig.isUserStatusNotify = YES;
    // 登录房间
    [[ZegoExpressEngine sharedEngine] loginRoom:roomID user:user config:roomConfig callback:^(int errorCode, NSDictionary * _Nullable extendedData) {
        // (可选回调) 登录房间成果,假如仅重视登录成果,重视此回调即可
        if (errorCode == 0) {
            NSLog(@"房间登录成功");
        } else {
            // 登录失利,请参阅 errorCode 阐明 https://doc-zh.zego.im/article/4377
            NSLog(@"房间登录失利");
        }
    }];
}

登录状态(房间连接状态)回调

调用登录房间接口之后,您可经过监听 onRoomStateUpdate 回调实时监控自己在本房间内的连接状态。

3.3 预览自己的画面,并推送到 ZEGO 音视频云

1. 预览自己的画面

假如期望看到本端的画面,可调用 startPreview 接口设置预览视图,并发动本地预览。

2. 将自己的音视频流推送到 ZEGO 音视频云

在用户调用 loginRoom 接口后,能够直接调用 startPublishingStream 接口,传入 “streamID”,将自己的音视频流推送到 ZEGO 音视频云。您可经过监听 onPublisherStateUpdate 回调知晓推流是否成功。

“streamID” 由您本地生成,可是需求确保:

同一个 AppID 下,“streamID” 大局仅有。假如同一个 AppID 下,不同用户各推了一条 “streamID” 相同的流,后推流的用户推流失利。

- (void)startPublish {
    // 设置本地预览视图并发动预览,视图形式选用 SDK 默许的形式,等比缩放填充整个 View
    [[ZegoExpressEngine sharedEngine] startPreview:[ZegoCanvas canvasWithView:self.view]];
    // 用户调用 loginRoom 之后再调用此接口进行推流
    // 在同一个 AppID 下,开发者需求确保 “streamID” 大局仅有,假如不同用户各推了一条 “streamID” 相同的流,后推流的用户会推流失利。
    [[ZegoExpressEngine sharedEngine] startPublishingStream:@"stream1"];
}

3.4 拉取其他用户的音视频

进行视频通话时,咱们需求拉取到其他用户的音视频。

在同一房间内的其他用户将音视频流推送到 ZEGO 音视频云时,咱们会在 onRoomStreamUpdate 回调中收到音视频流新增的告诉,并能够经过 ZegoStream 获取到某条流的 “streamID”。

咱们能够在该回调中,调用 startPlayingStream ,传入 “streamID” 拉取拉取播映该用户的音视频。您可经过监听 onPlayerStateUpdate 回调知晓是否成功拉取音视频。

// 房间内其他用户推流/中止推流时,咱们会在这儿收到相应流增减的告诉
- (void)onRoomStreamUpdate:(ZegoUpdateType)updateType streamList:(NSArray<ZegoStream *> *)streamList extendedData:(NSDictionary *)extendedData roomID:(NSString *)roomID {
    //当 updateType 为 ZegoUpdateTypeAdd 时,代表有音视频流新增,此刻咱们能够调用 startPlayingStream 接口拉取播映该音视频流
    if (updateType == ZegoUpdateTypeAdd) {
        // 开端拉流,设置远端拉流渲染视图,视图形式选用 SDK 默许的形式,等比缩放填充整个View
        // 如下 remoteUserView 为 UI 界面上 View.这儿为了使示例代码更加简练,咱们只拉取新增的音视频流列表中第的第一条流,在实践的业务中,主张开发者循环遍历 streamList ,拉取每一条音视频流
        NSString *streamID = streamList[0].streamID;
        [[ZegoExpressEngine sharedEngine] startPlayingStream:streamID canvas:[ZegoCanvas canvasWithView:self.remoteUserView]];
    }
}

7 运转作用

音视频的根底功能已完成,接下来咱们运转下作用,1步快速查验成果。

step1 , 与老友一起装置编译好的App,在手机上能够看到对方并进行通话互动。

完成以上,阐明你成功啦!

Enjoy与老友的欢喜韶光!

获取更多文档、Demo、技能协助

获取本文的Demo、开发文档、技能支撑。

获取SDK的商务活动、抢手产品。

注册即构ZEGO开发者帐号,快速开端。