From d6183187259155cc90720da0f2b2f5af81b93d73 Mon Sep 17 00:00:00 2001 From: abyyxwang Date: Mon, 21 Jun 2021 14:47:31 +0800 Subject: [PATCH] =?UTF-8?q?iOS=20=E5=8D=87=E7=BA=A78.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- iOS/Demo/README.md | 75 --- .../TXLiteAVDemo.xcodeproj/project.pbxproj | 344 ++++++++++--- iOS/Demo/TXLiteAVDemo/App/Info.plist | 4 +- .../App/Main/MainViewController.m | 36 +- iOS/Demo/TXLiteAVDemo/App/ReplayKit2Define.h | 4 + .../back.imageset/Contents.json | 23 + .../back.imageset/bgm_back.png | Bin 0 -> 290 bytes .../back.imageset/bgm_back@2x.png | Bin 0 -> 550 bytes .../back.imageset/bgm_back@3x.png | Bin 0 -> 985 bytes .../checkbox_nor.imageset/Contents.json | 23 + .../checkbox_nor.imageset/checkbox_nor.png | Bin 0 -> 709 bytes .../checkbox_nor.imageset/checkbox_nor@2x.png | Bin 0 -> 1513 bytes .../checkbox_nor.imageset/checkbox_nor@3x.png | Bin 0 -> 2378 bytes .../checkbox_sel.imageset/Contents.json | 23 + .../checkbox_sel.imageset/checkbox_sel.png | Bin 0 -> 690 bytes .../checkbox_sel.imageset/checkbox_sel@2x.png | Bin 0 -> 1215 bytes .../checkbox_sel.imageset/checkbox_sel@3x.png | Bin 0 -> 1816 bytes .../exit.imageset/Contents.json | 23 + .../exit.imageset/exitRoom.png | Bin 0 -> 924 bytes .../exit.imageset/exitRoom@2x.png | Bin 0 -> 1981 bytes .../exit.imageset/exitRoom@3x.png | Bin 0 -> 3012 bytes .../main_mine_about.imageset/Contents.json | 23 + .../\345\205\263\344\272\216.png" | Bin 0 -> 1064 bytes .../\345\205\263\344\272\216@2x.png" | Bin 0 -> 1984 bytes .../\345\205\263\344\272\216@3x.png" | Bin 0 -> 3204 bytes .../Contents.json | 23 + .../black_back.png | Bin 0 -> 345 bytes .../black_back@2x.png | Bin 0 -> 576 bytes .../black_back@3x.png | Bin 0 -> 884 bytes .../main_mine_detail.imageset/Contents.json | 23 + .../\350\257\246\346\203\205.png" | Bin 0 -> 295 bytes .../\350\257\246\346\203\205@2x.png" | Bin 0 -> 698 bytes .../\350\257\246\346\203\205@3x.png" | Bin 0 -> 1084 bytes .../Contents.json | 23 + ...5\350\264\243\347\224\263\346\230\216.png" | Bin 0 -> 960 bytes ...50\264\243\347\224\263\346\230\216@2x.png" | Bin 0 -> 1731 bytes ...50\264\243\347\224\263\346\230\216@3x.png" | Bin 0 -> 2844 bytes .../main_mine_edit.imageset/Contents.json | 23 + .../\347\274\226\350\276\221.png" | Bin 0 -> 372 bytes .../\347\274\226\350\276\221@2x.png" | Bin 0 -> 470 bytes .../\347\274\226\350\276\221@3x.png" | Bin 0 -> 571 bytes .../main_mine_privacy.imageset/Contents.json | 23 + ...0\347\247\201\346\235\241\346\254\276.png" | Bin 0 -> 1053 bytes ...47\247\201\346\235\241\346\254\276@2x.png" | Bin 0 -> 1972 bytes ...47\247\201\346\235\241\346\254\276@3x.png" | Bin 0 -> 3280 bytes .../resign.imageset/Contents.json | 21 + .../resign.imageset/resign.png | Bin 0 -> 2349 bytes .../userAgreement.imageset/Contents.json | 23 + .../userAgreement.imageset/userAgreement.png | Bin 0 -> 900 bytes .../userAgreement@2x.png | Bin 0 -> 1625 bytes .../userAgreement@3x.png | Bin 0 -> 2702 bytes .../en.lproj/AppPortalLocalized.strings | 31 ++ .../zh-Hans.lproj/AppPortalLocalized.strings | 31 ++ .../en.lproj/TRTCDemoLocalized.strings | 3 + .../zh-Hans.lproj/TRTCDemoLocalized.strings | 3 + .../en.lproj/V2LiveLocalized.strings | 7 + .../zh-Hans.lproj/V2LiveLocalized.strings | 8 + .../TXLiteAVDemo/App/TRTC-Appstore-Info.plist | 4 +- .../project.pbxproj | 8 +- .../View/AudioEffectSettingView.h | 1 + .../View/AudioEffectSettingView.m | 4 + .../TCBeautyPanel/TCBeautyPanelView.m | 9 +- .../LiveRoom/MLVBLiveRoom.m | 57 ++- .../LivePlayerDemo/PlayViewController.m | 414 +++++----------- .../CameraPushDemo/CameraPushViewController.m | 448 +++++++---------- .../CameraPushDemo/PushLogView.m | 21 - .../PushMoreSettingViewController.h | 25 - .../PushMoreSettingViewController.m | 185 +------ .../PushSettingViewController.h | 14 +- .../PushSettingViewController.m | 73 +-- .../ScreenPushDemo/ScreenPushViewController.m | 461 ++++-------------- 71 files changed, 1110 insertions(+), 1434 deletions(-) delete mode 100644 iOS/Demo/README.md create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/back.imageset/Contents.json create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/back.imageset/bgm_back.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/back.imageset/bgm_back@2x.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/back.imageset/bgm_back@3x.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_nor.imageset/Contents.json create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_nor.imageset/checkbox_nor.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_nor.imageset/checkbox_nor@2x.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_nor.imageset/checkbox_nor@3x.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_sel.imageset/Contents.json create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_sel.imageset/checkbox_sel.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_sel.imageset/checkbox_sel@2x.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_sel.imageset/checkbox_sel@3x.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/exit.imageset/Contents.json create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/exit.imageset/exitRoom.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/exit.imageset/exitRoom@2x.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/exit.imageset/exitRoom@3x.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_about.imageset/Contents.json create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_about.imageset/\345\205\263\344\272\216.png" create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_about.imageset/\345\205\263\344\272\216@2x.png" create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_about.imageset/\345\205\263\344\272\216@3x.png" create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_about_back.imageset/Contents.json create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_about_back.imageset/black_back.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_about_back.imageset/black_back@2x.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_about_back.imageset/black_back@3x.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_detail.imageset/Contents.json create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_detail.imageset/\350\257\246\346\203\205.png" create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_detail.imageset/\350\257\246\346\203\205@2x.png" create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_detail.imageset/\350\257\246\346\203\205@3x.png" create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_disclaimer.imageset/Contents.json create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_disclaimer.imageset/\345\205\215\350\264\243\347\224\263\346\230\216.png" create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_disclaimer.imageset/\345\205\215\350\264\243\347\224\263\346\230\216@2x.png" create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_disclaimer.imageset/\345\205\215\350\264\243\347\224\263\346\230\216@3x.png" create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_edit.imageset/Contents.json create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_edit.imageset/\347\274\226\350\276\221.png" create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_edit.imageset/\347\274\226\350\276\221@2x.png" create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_edit.imageset/\347\274\226\350\276\221@3x.png" create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_privacy.imageset/Contents.json create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_privacy.imageset/\351\232\220\347\247\201\346\235\241\346\254\276.png" create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_privacy.imageset/\351\232\220\347\247\201\346\235\241\346\254\276@2x.png" create mode 100644 "iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_privacy.imageset/\351\232\220\347\247\201\346\235\241\346\254\276@3x.png" create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/resign.imageset/Contents.json create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/resign.imageset/resign.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/userAgreement.imageset/Contents.json create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/userAgreement.imageset/userAgreement.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/userAgreement.imageset/userAgreement@2x.png create mode 100644 iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/userAgreement.imageset/userAgreement@3x.png diff --git a/iOS/Demo/README.md b/iOS/Demo/README.md deleted file mode 100644 index af4d2c8d..00000000 --- a/iOS/Demo/README.md +++ /dev/null @@ -1,75 +0,0 @@ -## 如何跑通 Demo 与 小直播 App -> 小直播需要您搭建一个业务后台用来进行帐号和回看列表的管理,请参考:[快速搭建“小直播”](https://cloud.tencent.com/document/product/454/15187) 。 - -本文将一步一步教您如何跑通 Github 提供的 Demo 以及 小直播 App - -- 步骤一:申请 Licence。 -- 步骤二:将 Licence 内容填写到 App 的相关位置。 -- 步骤三:将 Bundle Identifier 修改为申请 License 时填写的Bundle Id。 - -## 步骤一:申请 Licence - -您可以申请测试的28天免费的 Licence 进行调试,也可以直接申请正式版 Licence。 - -### 方式一:申请测试 Licence - -您可以免费申请测试 License(基础版,有效期28天)体验测试,具体步骤如下: -- 登录腾讯云官网,进入 [移动直播 License](https://console.cloud.tencent.com/live/license),并填写相应的信息:在 Package Name 中填写 Android 的包名,Bundle Id 中填写 iOS 的 bundleId。 - -![](https://main.qcloudimg.com/raw/edd99f145276ad5250f0ca5d0f5d4980.png) - -- 创建成功后页面会显示生成的 License 信息,这里需要记下 Key 和 LicenseUrl,在 SDK 的初始化时需要传入这两个参数。 - -![](https://main.qcloudimg.com/raw/ce722e4038a86b85d96b2cb9f5a058e8.png) - -### 方式二:购买正式 Licence - -当您的测试 License 过期了,可以点击 [购买移动直播套餐](https://buy.cloud.tencent.com/mobilelive) ,可以免费获得一年有效的 License 使用权限。 -![](https://main.qcloudimg.com/raw/52004efac93e7e6c8f446e53830816a3.png) - -> 购买“移动直播 SDK 套餐包”后,在 [移动直播 License](https://console.cloud.tencent.com/live/license) 页面下部会有 “一键切换普通版” 按钮。当点击切换的时候,会再次确认 Bundle ID 和 Package Name,如与提交到商店的不一致请进行修改,一旦切换成功,License信息不能再做修改 - -## 步骤二:填写 Licence 信息到 App 中 - -iOS 中填写 Licence 的接口为: - -``` -[TXLiveBase setLicenceURL:@"您的 Licence URL" key:@"您的 Licence Key"); -``` - -- **填写到 Demo 中** - -Demo 中填写 Licence 的位置在 `Demo/TXLiteAVDemo/App/AppDelegate.m` 和 `Demo/ReplaykitUpload/SampleHandler.m` (用于录屏推流)中: - -``` -[TXLiveBase setLicenceURL:@"<#Licence URL#>" key:@"<#Licence Key#>"]; -``` - -- **填写到小直播 App 中** - -小直播 App 中填写 Licence 的位置在 ` XiaoZhiBo/XiaoZhiBoApp/Classes/App/AppDelegate.m`中 - -``` -[TXLiveBase setLicenceURL:@"<#Licence URL#>" key:@"<#Licence Key#>"]; -``` - -## 步骤三:将 Bundle Identifier 修改为申请 License 时填写的Bundle Id。 - -### 如下图所示,分两步修改 Demo 的 Bundle Identifier - -- **步骤一:修改 Target: TXLiteAVDemo_Smart 的 Budle Identifier** - -![](https://main.qcloudimg.com/raw/6231af8c59df8de803cf856b1c50ea6e.png) - -- **步骤二:修改 Target: TXReplaykitUpload_Smart 的 Budle Identifier** - -![](https://main.qcloudimg.com/raw/64da88974e8f62d6e0f28208e766169a.png) - -### 如下图所示,修改小直播 App 的 Bundle Identifier - -![](https://main.qcloudimg.com/raw/3c2d09095d6ec0c3bb559f099d039d70.png) - - -## 关于 Licence - -关于 Licence 的更多信息,您可以查阅[腾讯云 - Licence 使用指南]()。 diff --git a/iOS/Demo/TXLiteAVDemo.xcodeproj/project.pbxproj b/iOS/Demo/TXLiteAVDemo.xcodeproj/project.pbxproj index f4c74d14..5b3cc2a1 100644 --- a/iOS/Demo/TXLiteAVDemo.xcodeproj/project.pbxproj +++ b/iOS/Demo/TXLiteAVDemo.xcodeproj/project.pbxproj @@ -3,10 +3,11 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ + 15ECE7E8EE1B83957612D299 /* AppUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F2F0E547215BFF033785B58 /* AppUtils.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 1DC7F349A2B6380DCA056281 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; 1EA0A986FB03B486F983DE95 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; 2840D91C24B8562200723FBC /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2840D91B24B8562200723FBC /* AudioToolbox.framework */; }; @@ -15,7 +16,7 @@ 2840D92E24B8801800723FBC /* SDWebImagePlaceholderImageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2840D92824B85E2A00723FBC /* SDWebImagePlaceholderImageManager.swift */; }; 2840D93124B880EF00723FBC /* SDWebImagePlaceholderImageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2840D92824B85E2A00723FBC /* SDWebImagePlaceholderImageManager.swift */; }; 285FB46824BEA52F00FFB2BC /* TXVoiceRoomService.m in Sources */ = {isa = PBXBuildFile; fileRef = 4046B13924B36AD700F27349 /* TXVoiceRoomService.m */; }; - 35A72DD4F6E9172DB7265D6B /* LoginViewController_Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7082A6FE37581C713AEEF7 /* LoginViewController_Mock.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 2E26BD32BCDAB0F776195556 /* LoginViewController_Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41CFA7ADD5BA0F62C3C2C91C /* LoginViewController_Mock.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 40091E6B1F4FCBB9009B882D /* ScanQRController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 40F853561EE8FCDF00EE47D7 /* ScanQRController.mm */; }; 40091E6F1F4FCBB9009B882D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 40F853261EE8FC8400EE47D7 /* AppDelegate.m */; }; 40091E761F4FCBB9009B882D /* AppLogMgr.m in Sources */ = {isa = PBXBuildFile; fileRef = 40F853281EE8FC8400EE47D7 /* AppLogMgr.m */; }; @@ -166,6 +167,11 @@ 402A010424506F740037A219 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 402A010024506F740037A219 /* main.m */; }; 402A010524506F740037A219 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 402A010024506F740037A219 /* main.m */; }; 402A010624506F740037A219 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 402A010024506F740037A219 /* main.m */; }; + 4038CEDF2669CE3200813912 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40F8553A1EE8FDBF00EE47D7 /* Accelerate.framework */; }; + 4038CEE12669CE3A00813912 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40F8553A1EE8FDBF00EE47D7 /* Accelerate.framework */; }; + 4038CEE22669CE4000813912 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40F8553A1EE8FDBF00EE47D7 /* Accelerate.framework */; }; + 4038CEE32669CE4600813912 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40F8553A1EE8FDBF00EE47D7 /* Accelerate.framework */; }; + 4038CEE42669CE4C00813912 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40F8553A1EE8FDBF00EE47D7 /* Accelerate.framework */; }; 4040CC4D2497C79400CA4FAA /* TRTCVoiceRoomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4040CC122497C79300CA4FAA /* TRTCVoiceRoomManager.swift */; }; 4040CC4E2497C79400CA4FAA /* TRTCVoiceRoomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4040CC122497C79300CA4FAA /* TRTCVoiceRoomManager.swift */; }; 4040CC4F2497C79400CA4FAA /* TRTCVoiceRoomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4040CC122497C79300CA4FAA /* TRTCVoiceRoomManager.swift */; }; @@ -488,6 +494,8 @@ 40AC7316246D35A300FAF33D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 40F853221EE8FC7300EE47D7 /* Assets.xcassets */; }; 40AC7319246D35A300FAF33D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 40F853331EE8FC9B00EE47D7 /* Main.storyboard */; }; 40AC7324246D361100FAF33D /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; + 40B18A5C2670AEA500553049 /* PhotoUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 40B18A592670AEA500553049 /* PhotoUtil.m */; }; + 40B18A5D2670AEA500553049 /* TXColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 40B18A5B2670AEA500553049 /* TXColor.m */; }; 40B3F6762446E518000C37A3 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 40F853261EE8FC8400EE47D7 /* AppDelegate.m */; }; 40B3F6942446E518000C37A3 /* AppLogMgr.m in Sources */ = {isa = PBXBuildFile; fileRef = 40F853281EE8FC8400EE47D7 /* AppLogMgr.m */; }; 40B3F6AE2446E518000C37A3 /* TCBeautyPanel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40AA536524458EC800303EF7 /* TCBeautyPanel.framework */; }; @@ -754,7 +762,6 @@ 40EF364B24BC4134006AA4BB /* RoomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40EF364924BC4134006AA4BB /* RoomManager.swift */; }; 40EF364C24BC4134006AA4BB /* RoomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40EF364924BC4134006AA4BB /* RoomManager.swift */; }; 40EF364D24BC4134006AA4BB /* RoomManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40EF364924BC4134006AA4BB /* RoomManager.swift */; }; - 43EA7D35C20FEDFD6C8DBFD9 /* ProfileViewController+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 164D8969678FDC96A4C42134 /* ProfileViewController+UI.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 4509E5D322816E8D001FF14A /* LiveRoomAccPlayerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4509E5D222816E8D001FF14A /* LiveRoomAccPlayerView.m */; }; 4509E5D422816E8D001FF14A /* LiveRoomAccPlayerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4509E5D222816E8D001FF14A /* LiveRoomAccPlayerView.m */; }; 4509E5D522816E8D001FF14A /* LiveRoomAccPlayerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4509E5D222816E8D001FF14A /* LiveRoomAccPlayerView.m */; }; @@ -795,6 +802,10 @@ 45E74D9B23B22BCD00C22B31 /* ThemeConfigurator.m in Sources */ = {isa = PBXBuildFile; fileRef = 45E74D9A23B22BCD00C22B31 /* ThemeConfigurator.m */; }; 45E74D9C23B22BCD00C22B31 /* ThemeConfigurator.m in Sources */ = {isa = PBXBuildFile; fileRef = 45E74D9A23B22BCD00C22B31 /* ThemeConfigurator.m */; }; 45F3B3A1232A239D00666F7C /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 40F855361EE8FDAD00EE47D7 /* AssetsLibrary.framework */; }; + 4717325126705C4A005F772E /* SoundTouch.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4717324E26705C4A005F772E /* SoundTouch.xcframework */; }; + 4717325626705C77005F772E /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; + 4717325726705CE4005F772E /* BuildFile in Embed Frameworks */ = {isa = PBXBuildFile; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 4717325926705CE8005F772E /* SoundTouch.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 4717324E26705C4A005F772E /* SoundTouch.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 47642A9B261491B90020F1BA /* launchimage_en@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 47642A99261491B90020F1BA /* launchimage_en@3x.png */; }; 47642A9C261491B90020F1BA /* launchimage_en@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 47642A99261491B90020F1BA /* launchimage_en@3x.png */; }; 47642A9D261491B90020F1BA /* launchimage_en@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 47642A99261491B90020F1BA /* launchimage_en@3x.png */; }; @@ -1032,10 +1043,10 @@ 47E8CCCC260C4EB2001CF672 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 47E8CCCF260C4EB2001CF672 /* InfoPlist.strings */; }; 47E8CCCD260C4EB2001CF672 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 47E8CCCF260C4EB2001CF672 /* InfoPlist.strings */; }; 4B6BFC9AAE7FC00699D73AA8 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; + 4D245521777E1C91BCCE0F58 /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6FFA8D04E7B76CCECCBA101 /* ProfileViewController.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 51A289FB230FB95800B9B73F /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51A289F8230FB93A00B9B73F /* OpenAL.framework */; }; 51A289FC230FB96000B9B73F /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51A289F8230FB93A00B9B73F /* OpenAL.framework */; }; 51CE9F98231944BE00B620BD /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51A289F8230FB93A00B9B73F /* OpenAL.framework */; }; - 5C6CBD7BCA68426F9BF024C6 /* AppUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC44C91D289F545A82864FAF /* AppUtils.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 6A1C109B2281A675005D7BD9 /* PushLogView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A1C109A2281A674005D7BD9 /* PushLogView.m */; }; 6A1C109C2281A675005D7BD9 /* PushLogView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A1C109A2281A674005D7BD9 /* PushLogView.m */; }; 6A1C109D2281A675005D7BD9 /* PushLogView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6A1C109A2281A674005D7BD9 /* PushLogView.m */; }; @@ -1062,14 +1073,6 @@ 6A5031CA249D122800701E6B /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; 6A5031D7249D132F00701E6B /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; 6A50320F24A0E72200701E6B /* TRTCMeetingDef.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AAEC2642497807200B57D86 /* TRTCMeetingDef.m */; }; - 6A50323F24A1AF6B00701E6B /* UserAgreementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A50323E24A1AF6B00701E6B /* UserAgreementViewController.swift */; }; - 6A50324024A1AF6B00701E6B /* UserAgreementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A50323E24A1AF6B00701E6B /* UserAgreementViewController.swift */; }; - 6A50324224A1AF6B00701E6B /* UserAgreementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A50323E24A1AF6B00701E6B /* UserAgreementViewController.swift */; }; - 6A50324324A1AF6B00701E6B /* UserAgreementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A50323E24A1AF6B00701E6B /* UserAgreementViewController.swift */; }; - 6A50324524A1B03700701E6B /* UserAgreementViewController+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A50324424A1B03700701E6B /* UserAgreementViewController+UI.swift */; }; - 6A50324624A1B03700701E6B /* UserAgreementViewController+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A50324424A1B03700701E6B /* UserAgreementViewController+UI.swift */; }; - 6A50324824A1B03700701E6B /* UserAgreementViewController+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A50324424A1B03700701E6B /* UserAgreementViewController+UI.swift */; }; - 6A50324924A1B03700701E6B /* UserAgreementViewController+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A50324424A1B03700701E6B /* UserAgreementViewController+UI.swift */; }; 6A5032A524A25E2100701E6B /* GenerateTestUserSig.m in Sources */ = {isa = PBXBuildFile; fileRef = 40B3F8DC2446E6C5000C37A3 /* GenerateTestUserSig.m */; }; 6AAEC26B2497807200B57D86 /* TRTCMeetingRoomDemo.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6AAEC24C2497807100B57D86 /* TRTCMeetingRoomDemo.xcassets */; }; 6AAEC26C2497807200B57D86 /* TRTCMeetingRoomDemo.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6AAEC24C2497807100B57D86 /* TRTCMeetingRoomDemo.xcassets */; }; @@ -1158,7 +1161,6 @@ 6AAEC2C52497807200B57D86 /* TXMeetingPair.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AAEC2672497807200B57D86 /* TXMeetingPair.m */; }; 6AAEC2C62497807200B57D86 /* TXMeetingPair.m in Sources */ = {isa = PBXBuildFile; fileRef = 6AAEC2672497807200B57D86 /* TXMeetingPair.m */; }; 6AAEC3A52499F93300B57D86 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; - 6C441406009C189AB24AACA6 /* LoginViewController+UI_Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25A428C96A8362146DE5EFCA /* LoginViewController+UI_Mock.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 7B107D8F4C4B5BF9184EC193 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; 7B5A2DBC25B0355400B4B469 /* V2QRGenerateViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B5A2D8D25B0355400B4B469 /* V2QRGenerateViewController.xib */; }; 7B5A2DBD25B0355400B4B469 /* V2QRGenerateViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7B5A2D8D25B0355400B4B469 /* V2QRGenerateViewController.xib */; }; @@ -1204,6 +1206,73 @@ 7B5A2DE525B0355400B4B469 /* v2live.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7B5A2DBA25B0355400B4B469 /* v2live.xcassets */; }; 7B5A2DE625B0355400B4B469 /* V2LiveUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5A2DBB25B0355400B4B469 /* V2LiveUtils.m */; }; 7B5A2DE725B0355400B4B469 /* V2LiveUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5A2DBB25B0355400B4B469 /* V2LiveUtils.m */; }; + 85A60FC0CD0D139C8509767B /* ProfileViewController+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 738F5C1FA9D95751B40FEF1A /* ProfileViewController+UI.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 88ABB5F0266DCB0D0050C38A /* TRTCWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB5EF266DCB0D0050C38A /* TRTCWebViewController.swift */; }; + 88ABB5F1266DCB0D0050C38A /* TRTCWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB5EF266DCB0D0050C38A /* TRTCWebViewController.swift */; }; + 88ABB5F2266DCB0D0050C38A /* TRTCWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB5EF266DCB0D0050C38A /* TRTCWebViewController.swift */; }; + 88ABB5F4266DCB0D0050C38A /* TRTCWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB5EF266DCB0D0050C38A /* TRTCWebViewController.swift */; }; + 88ABB5F5266DCB0D0050C38A /* TRTCWebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB5EF266DCB0D0050C38A /* TRTCWebViewController.swift */; }; + 88ABB61D266DD0E80050C38A /* PrivacyPolicy.html in Resources */ = {isa = PBXBuildFile; fileRef = 88ABB61C266DD0E80050C38A /* PrivacyPolicy.html */; }; + 88ABB61E266DD0E80050C38A /* PrivacyPolicy.html in Resources */ = {isa = PBXBuildFile; fileRef = 88ABB61C266DD0E80050C38A /* PrivacyPolicy.html */; }; + 88ABB61F266DD0E80050C38A /* PrivacyPolicy.html in Resources */ = {isa = PBXBuildFile; fileRef = 88ABB61C266DD0E80050C38A /* PrivacyPolicy.html */; }; + 88ABB621266DD0E80050C38A /* PrivacyPolicy.html in Resources */ = {isa = PBXBuildFile; fileRef = 88ABB61C266DD0E80050C38A /* PrivacyPolicy.html */; }; + 88ABB622266DD0E80050C38A /* PrivacyPolicy.html in Resources */ = {isa = PBXBuildFile; fileRef = 88ABB61C266DD0E80050C38A /* PrivacyPolicy.html */; }; + 88ABB630266DD0FB0050C38A /* UserAgreement.html in Resources */ = {isa = PBXBuildFile; fileRef = 88ABB62F266DD0FA0050C38A /* UserAgreement.html */; }; + 88ABB631266DD0FB0050C38A /* UserAgreement.html in Resources */ = {isa = PBXBuildFile; fileRef = 88ABB62F266DD0FA0050C38A /* UserAgreement.html */; }; + 88ABB632266DD0FB0050C38A /* UserAgreement.html in Resources */ = {isa = PBXBuildFile; fileRef = 88ABB62F266DD0FA0050C38A /* UserAgreement.html */; }; + 88ABB634266DD0FB0050C38A /* UserAgreement.html in Resources */ = {isa = PBXBuildFile; fileRef = 88ABB62F266DD0FA0050C38A /* UserAgreement.html */; }; + 88ABB635266DD0FB0050C38A /* UserAgreement.html in Resources */ = {isa = PBXBuildFile; fileRef = 88ABB62F266DD0FA0050C38A /* UserAgreement.html */; }; + 88ABB64C266DFE220050C38A /* MineRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB643266DFE220050C38A /* MineRootView.swift */; }; + 88ABB64D266DFE220050C38A /* MineRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB643266DFE220050C38A /* MineRootView.swift */; }; + 88ABB64E266DFE220050C38A /* MineRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB643266DFE220050C38A /* MineRootView.swift */; }; + 88ABB650266DFE220050C38A /* MineRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB643266DFE220050C38A /* MineRootView.swift */; }; + 88ABB651266DFE220050C38A /* MineRootView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB643266DFE220050C38A /* MineRootView.swift */; }; + 88ABB652266DFE220050C38A /* MineViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB644266DFE220050C38A /* MineViewModel.swift */; }; + 88ABB653266DFE220050C38A /* MineViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB644266DFE220050C38A /* MineViewModel.swift */; }; + 88ABB654266DFE220050C38A /* MineViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB644266DFE220050C38A /* MineViewModel.swift */; }; + 88ABB656266DFE220050C38A /* MineViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB644266DFE220050C38A /* MineViewModel.swift */; }; + 88ABB657266DFE220050C38A /* MineViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB644266DFE220050C38A /* MineViewModel.swift */; }; + 88ABB658266DFE220050C38A /* MineAboutResignViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB645266DFE220050C38A /* MineAboutResignViewController.swift */; }; + 88ABB659266DFE220050C38A /* MineAboutResignViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB645266DFE220050C38A /* MineAboutResignViewController.swift */; }; + 88ABB65A266DFE220050C38A /* MineAboutResignViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB645266DFE220050C38A /* MineAboutResignViewController.swift */; }; + 88ABB65C266DFE220050C38A /* MineAboutResignViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB645266DFE220050C38A /* MineAboutResignViewController.swift */; }; + 88ABB65D266DFE220050C38A /* MineAboutResignViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB645266DFE220050C38A /* MineAboutResignViewController.swift */; }; + 88ABB65E266DFE220050C38A /* MineAboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB646266DFE220050C38A /* MineAboutViewController.swift */; }; + 88ABB65F266DFE230050C38A /* MineAboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB646266DFE220050C38A /* MineAboutViewController.swift */; }; + 88ABB660266DFE230050C38A /* MineAboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB646266DFE220050C38A /* MineAboutViewController.swift */; }; + 88ABB662266DFE230050C38A /* MineAboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB646266DFE220050C38A /* MineAboutViewController.swift */; }; + 88ABB663266DFE230050C38A /* MineAboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB646266DFE220050C38A /* MineAboutViewController.swift */; }; + 88ABB664266DFE230050C38A /* MineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB647266DFE220050C38A /* MineViewController.swift */; }; + 88ABB665266DFE230050C38A /* MineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB647266DFE220050C38A /* MineViewController.swift */; }; + 88ABB666266DFE230050C38A /* MineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB647266DFE220050C38A /* MineViewController.swift */; }; + 88ABB668266DFE230050C38A /* MineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB647266DFE220050C38A /* MineViewController.swift */; }; + 88ABB669266DFE230050C38A /* MineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB647266DFE220050C38A /* MineViewController.swift */; }; + 88ABB66A266DFE230050C38A /* TRTCAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB649266DFE220050C38A /* TRTCAlerts.swift */; }; + 88ABB66B266DFE230050C38A /* TRTCAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB649266DFE220050C38A /* TRTCAlerts.swift */; }; + 88ABB66C266DFE230050C38A /* TRTCAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB649266DFE220050C38A /* TRTCAlerts.swift */; }; + 88ABB66E266DFE230050C38A /* TRTCAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB649266DFE220050C38A /* TRTCAlerts.swift */; }; + 88ABB66F266DFE230050C38A /* TRTCAlerts.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB649266DFE220050C38A /* TRTCAlerts.swift */; }; + 88ABB670266DFE230050C38A /* MineAlertContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB64A266DFE220050C38A /* MineAlertContentView.swift */; }; + 88ABB671266DFE230050C38A /* MineAlertContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB64A266DFE220050C38A /* MineAlertContentView.swift */; }; + 88ABB672266DFE230050C38A /* MineAlertContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB64A266DFE220050C38A /* MineAlertContentView.swift */; }; + 88ABB674266DFE230050C38A /* MineAlertContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB64A266DFE220050C38A /* MineAlertContentView.swift */; }; + 88ABB675266DFE230050C38A /* MineAlertContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB64A266DFE220050C38A /* MineAlertContentView.swift */; }; + 88ABB676266DFE230050C38A /* TRTCAlertControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB64B266DFE220050C38A /* TRTCAlertControl.swift */; }; + 88ABB677266DFE230050C38A /* TRTCAlertControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB64B266DFE220050C38A /* TRTCAlertControl.swift */; }; + 88ABB678266DFE230050C38A /* TRTCAlertControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB64B266DFE220050C38A /* TRTCAlertControl.swift */; }; + 88ABB67A266DFE230050C38A /* TRTCAlertControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB64B266DFE220050C38A /* TRTCAlertControl.swift */; }; + 88ABB67B266DFE230050C38A /* TRTCAlertControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB64B266DFE220050C38A /* TRTCAlertControl.swift */; }; + 88ABB689266E01870050C38A /* LayoutDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB688266E01870050C38A /* LayoutDefine.swift */; }; + 88ABB68A266E01870050C38A /* LayoutDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB688266E01870050C38A /* LayoutDefine.swift */; }; + 88ABB68B266E01870050C38A /* LayoutDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB688266E01870050C38A /* LayoutDefine.swift */; }; + 88ABB68D266E01870050C38A /* LayoutDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB688266E01870050C38A /* LayoutDefine.swift */; }; + 88ABB68E266E01870050C38A /* LayoutDefine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB688266E01870050C38A /* LayoutDefine.swift */; }; + 88ABB6C8266F17900050C38A /* PrivacyPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB6C7266F17900050C38A /* PrivacyPopView.swift */; }; + 88ABB6C9266F17900050C38A /* PrivacyPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB6C7266F17900050C38A /* PrivacyPopView.swift */; }; + 88ABB6CA266F17900050C38A /* PrivacyPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB6C7266F17900050C38A /* PrivacyPopView.swift */; }; + 88ABB6CC266F17900050C38A /* PrivacyPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB6C7266F17900050C38A /* PrivacyPopView.swift */; }; + 88ABB6CD266F17900050C38A /* PrivacyPopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88ABB6C7266F17900050C38A /* PrivacyPopView.swift */; }; + 8BCBBCAC26AF7CD10BC9C818 /* CommonUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5EF67E246DB262D2537B3B1 /* CommonUtils.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 8D6AAF4C1D56E796151BFC2B /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; 910E179F2080A27500178D86 /* TXMoviePlayerNetApi.m in Sources */ = {isa = PBXBuildFile; fileRef = 910E179E2080A27500178D86 /* TXMoviePlayerNetApi.m */; }; 910E17A02080A27500178D86 /* TXMoviePlayerNetApi.m in Sources */ = {isa = PBXBuildFile; fileRef = 910E179E2080A27500178D86 /* TXMoviePlayerNetApi.m */; }; @@ -1234,7 +1303,6 @@ 91F87A7F1FF4A0FD001644B1 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 91F87A7E1FF4A0FC001644B1 /* libsqlite3.tbd */; }; 91F87A801FF4A101001644B1 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 91F87A7E1FF4A0FC001644B1 /* libsqlite3.tbd */; }; 91F87A811FF4A109001644B1 /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 91F87A7E1FF4A0FC001644B1 /* libsqlite3.tbd */; }; - 9312D80AC5AAD71A96A96A15 /* ProfileManager_Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 709679551E529BDAC156BCCC /* ProfileManager_Mock.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 944B0A98D288A86246E2C14B /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; A035040820D20A01007E61C6 /* QRCode.m in Sources */ = {isa = PBXBuildFile; fileRef = A035040720D20A01007E61C6 /* QRCode.m */; }; A035040920D20A01007E61C6 /* QRCode.m in Sources */ = {isa = PBXBuildFile; fileRef = A035040720D20A01007E61C6 /* QRCode.m */; }; @@ -1323,12 +1391,10 @@ BAD147E325FB570400FB40DD /* UIButton+V2.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5A2DA625B0355400B4B469 /* UIButton+V2.m */; }; BAD147F125FB570400FB40DD /* V2PusherViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5A2DB725B0355400B4B469 /* V2PusherViewController.m */; }; BAD147F425FB570400FB40DD /* V2PlayerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5A2DB125B0355400B4B469 /* V2PlayerViewController.m */; }; - BAD147F525FB570400FB40DD /* TXColor.m in Sources */ = {isa = PBXBuildFile; fileRef = A06E8559214F9EC200DF949B /* TXColor.m */; }; BAD147FA25FB570400FB40DD /* SmallButton.m in Sources */ = {isa = PBXBuildFile; fileRef = A0428A3620D3CFDB00CA79D5 /* SmallButton.m */; }; BAD147FC25FB570400FB40DD /* V2PusherSettingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5A2D9325B0355400B4B469 /* V2PusherSettingViewController.m */; }; BAD147FE25FB570400FB40DD /* UISegmentedControl+V2.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5A2DA825B0355400B4B469 /* UISegmentedControl+V2.m */; }; BAD1480025FB570400FB40DD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 402A010024506F740037A219 /* main.m */; }; - BAD1480325FB570400FB40DD /* PhotoUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = 4540802B23292D4400C3CAD5 /* PhotoUtil.m */; }; BAD1480525FB570400FB40DD /* SimpleIPC.m in Sources */ = {isa = PBXBuildFile; fileRef = 45CC58AA246290BB002A914E /* SimpleIPC.m */; }; BAD1480925FB570400FB40DD /* V2QRGenerateViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5A2DB225B0355400B4B469 /* V2QRGenerateViewController.m */; }; BAD1480D25FB570400FB40DD /* V2QRScanViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B5A2D8F25B0355400B4B469 /* V2QRScanViewController.m */; }; @@ -1366,12 +1432,10 @@ BAD14CA925FB655B00FB40DD /* CommonUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40B3F9DC2446EF11000C37A3 /* CommonUtils.swift */; }; BAD14CAA25FB655B00FB40DD /* AppUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40B3F9DB2446EF11000C37A3 /* AppUtils.swift */; }; BAD14CAB25FB655B00FB40DD /* ProfileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40495B3E2459466900AF53CB /* ProfileManager.swift */; }; - BAD14CAC25FB655F00FB40DD /* UserAgreementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A50323E24A1AF6B00701E6B /* UserAgreementViewController.swift */; }; BAD14CAD25FB655F00FB40DD /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40495B3A2459466900AF53CB /* LoginViewController.swift */; }; BAD14CAE25FB655F00FB40DD /* LoginViewController+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40495B392459466900AF53CB /* LoginViewController+UI.swift */; }; BAD14CAF25FB655F00FB40DD /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40495B3B2459466900AF53CB /* ProfileViewController.swift */; }; BAD14CB025FB655F00FB40DD /* ProfileViewController+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40495B3C2459466900AF53CB /* ProfileViewController+UI.swift */; }; - BAD14CB125FB655F00FB40DD /* UserAgreementViewController+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A50324424A1B03700701E6B /* UserAgreementViewController+UI.swift */; }; BD32F8A6AF7CC2FF9A53096E /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; C600497825ECE75C00EAEB17 /* TRTCChatSalonHandsUpTipsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C600497725ECE75C00EAEB17 /* TRTCChatSalonHandsUpTipsView.swift */; }; C600497925ECE75C00EAEB17 /* TRTCChatSalonHandsUpTipsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C600497725ECE75C00EAEB17 /* TRTCChatSalonHandsUpTipsView.swift */; }; @@ -1543,9 +1607,9 @@ D6E5D1C320B7B62000812B2F /* ScreenPushViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D6E5D1C220B7B62000812B2F /* ScreenPushViewController.m */; }; D6E5D1C420B7B62000812B2F /* ScreenPushViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D6E5D1C220B7B62000812B2F /* ScreenPushViewController.m */; }; D6E5D1C520B7B62000812B2F /* ScreenPushViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D6E5D1C220B7B62000812B2F /* ScreenPushViewController.m */; }; - ED26FADBF5206DFDBB033B6A /* ProfileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B89E7003C4E62D204C48C933 /* ProfileViewController.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + ED1BBFA5DF561082831CB60A /* LoginViewController+UI_Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9329C41FC3B5C3962B59AB62 /* LoginViewController+UI_Mock.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; EF69648B8809D6DEA1B7139D /* libPods-TXReplaykitUpload_Smart.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B8883463F7DB6469C26CDBF /* libPods-TXReplaykitUpload_Smart.a */; }; - F1457AC447AE6B7E772CAC62 /* CommonUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F48FB1CA32567C5E158CC95 /* CommonUtils.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + FC225971E54AD1F629BA9097 /* ProfileManager_Mock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CEA59D6445EAA33AD428471 /* ProfileManager_Mock.swift */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; FDD4BF2B24A1F8AE0015388B /* VideoEditor.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FDD4BF2824A1F8AD0015388B /* VideoEditor.xcassets */; }; FDD4BF2C24A1F8AE0015388B /* VideoEditor.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FDD4BF2824A1F8AD0015388B /* VideoEditor.xcassets */; }; FDD4BF2D24A1F8AE0015388B /* VideoEditor.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = FDD4BF2824A1F8AD0015388B /* VideoEditor.xcassets */; }; @@ -1795,12 +1859,10 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 164D8969678FDC96A4C42134 /* ProfileViewController+UI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "ProfileViewController+UI.swift"; sourceTree = ""; }; - 25A428C96A8362146DE5EFCA /* LoginViewController+UI_Mock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "LoginViewController+UI_Mock.swift"; sourceTree = ""; }; + 1CEA59D6445EAA33AD428471 /* ProfileManager_Mock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ProfileManager_Mock.swift; sourceTree = ""; }; 2840D91B24B8562200723FBC /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 2840D92824B85E2A00723FBC /* SDWebImagePlaceholderImageManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDWebImagePlaceholderImageManager.swift; sourceTree = ""; }; 3B8883463F7DB6469C26CDBF /* libPods-TXReplaykitUpload_Smart.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-TXReplaykitUpload_Smart.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3F48FB1CA32567C5E158CC95 /* CommonUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CommonUtils.swift; sourceTree = ""; }; 3FE55542D416212AADE83B12 /* Pods-TXLiteAVDemo_Smart.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TXLiteAVDemo_Smart.debug.xcconfig"; path = "Target Support Files/Pods-TXLiteAVDemo_Smart/Pods-TXLiteAVDemo_Smart.debug.xcconfig"; sourceTree = ""; }; 400922A11F4FCC52009B882D /* TXLiteAVDemo_Smart.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TXLiteAVDemo_Smart.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4011CC0E24E4DDB600C543D7 /* TRTCCallingCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TRTCCallingCell.swift; sourceTree = ""; }; @@ -1897,6 +1959,10 @@ 40A7CFD7245FC0CF00E792A5 /* TRTCLiveRoomDemo.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = TRTCLiveRoomDemo.xcassets; sourceTree = ""; }; 40AA533524458EC800303EF7 /* TCBeautyPanel.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = TCBeautyPanel.xcodeproj; sourceTree = ""; }; 40AA539724459DF900303EF7 /* UGCKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = UGCKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 40B18A582670AEA500553049 /* TXColor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TXColor.h; sourceTree = ""; }; + 40B18A592670AEA500553049 /* PhotoUtil.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PhotoUtil.m; sourceTree = ""; }; + 40B18A5A2670AEA500553049 /* PhotoUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PhotoUtil.h; sourceTree = ""; }; + 40B18A5B2670AEA500553049 /* TXColor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TXColor.m; sourceTree = ""; }; 40B3F8DC2446E6C5000C37A3 /* GenerateTestUserSig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GenerateTestUserSig.m; sourceTree = ""; }; 40B3F8DD2446E6C5000C37A3 /* GenerateTestUserSig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GenerateTestUserSig.h; sourceTree = ""; }; 40B3F9272446E6C6000C37A3 /* LiveRoomMainViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LiveRoomMainViewController.swift; sourceTree = ""; }; @@ -2029,6 +2095,7 @@ 40F855481EE8FDF100EE47D7 /* libresolv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libresolv.tbd; path = usr/lib/libresolv.tbd; sourceTree = SDKROOT; }; 40F8554C1EE8FDFC00EE47D7 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; 40F8554E1EE8FE0100EE47D7 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; }; + 41CFA7ADD5BA0F62C3C2C91C /* LoginViewController_Mock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LoginViewController_Mock.swift; sourceTree = ""; }; 4509E5D122816E8D001FF14A /* LiveRoomAccPlayerView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LiveRoomAccPlayerView.h; sourceTree = ""; }; 4509E5D222816E8D001FF14A /* LiveRoomAccPlayerView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LiveRoomAccPlayerView.m; sourceTree = ""; }; 450CFC1123AB5CC800A17FD0 /* VideoRecordConfigViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VideoRecordConfigViewController.m; sourceTree = ""; }; @@ -2046,6 +2113,8 @@ 45D8448C23B64395001CD3A9 /* UGCUploadList.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UGCUploadList.m; sourceTree = ""; }; 45E74D9923B22BCD00C22B31 /* ThemeConfigurator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ThemeConfigurator.h; sourceTree = ""; }; 45E74D9A23B22BCD00C22B31 /* ThemeConfigurator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ThemeConfigurator.m; sourceTree = ""; }; + 4717324D26705C4A005F772E /* FFmpeg.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = FFmpeg.xcframework; path = ../SDK/FFmpeg.xcframework; sourceTree = ""; }; + 4717324E26705C4A005F772E /* SoundTouch.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = SoundTouch.xcframework; path = ../SDK/SoundTouch.xcframework; sourceTree = ""; }; 47642A8C261490960020F1BA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 47642A99261491B90020F1BA /* launchimage_en@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "launchimage_en@3x.png"; sourceTree = ""; }; 47642A9A261491B90020F1BA /* launchimage_en@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "launchimage_en@2x.png"; sourceTree = ""; }; @@ -2128,8 +2197,6 @@ 6A3107172272E31A002F6115 /* PushBgmControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PushBgmControl.h; sourceTree = ""; }; 6A3107182272E31A002F6115 /* PushBgmControl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PushBgmControl.m; sourceTree = ""; }; 6A503178249D03B200701E6B /* TRTCInfo.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = TRTCInfo.plist; sourceTree = ""; }; - 6A50323E24A1AF6B00701E6B /* UserAgreementViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAgreementViewController.swift; sourceTree = ""; }; - 6A50324424A1B03700701E6B /* UserAgreementViewController+UI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserAgreementViewController+UI.swift"; sourceTree = ""; }; 6AAEC24C2497807100B57D86 /* TRTCMeetingRoomDemo.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = TRTCMeetingRoomDemo.xcassets; sourceTree = ""; }; 6AAEC24E2497807100B57D86 /* TRTCMeetingNewViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TRTCMeetingNewViewController.swift; sourceTree = ""; }; 6AAEC24F2497807100B57D86 /* CenterSegmentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CenterSegmentView.swift; sourceTree = ""; }; @@ -2159,8 +2226,7 @@ 6AAEC2692497807200B57D86 /* IMProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IMProtocol.h; sourceTree = ""; }; 6AAEC26A2497807200B57D86 /* TRTCMeetingDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TRTCMeetingDef.h; sourceTree = ""; }; 6F3B8CE66F615B5126697B01 /* Pods-TXLiteAVDemo_Smart.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TXLiteAVDemo_Smart.release.xcconfig"; path = "Target Support Files/Pods-TXLiteAVDemo_Smart/Pods-TXLiteAVDemo_Smart.release.xcconfig"; sourceTree = ""; }; - 709679551E529BDAC156BCCC /* ProfileManager_Mock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ProfileManager_Mock.swift; sourceTree = ""; }; - 7A7082A6FE37581C713AEEF7 /* LoginViewController_Mock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LoginViewController_Mock.swift; sourceTree = ""; }; + 738F5C1FA9D95751B40FEF1A /* ProfileViewController+UI.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "ProfileViewController+UI.swift"; sourceTree = ""; }; 7B4C917A24B4B0C80095C041 /* TXLaunchMoviePlayProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TXLaunchMoviePlayProtocol.h; sourceTree = ""; }; 7B5A2D8D25B0355400B4B469 /* V2QRGenerateViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = V2QRGenerateViewController.xib; sourceTree = ""; }; 7B5A2D8E25B0355400B4B469 /* V2MainItemCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = V2MainItemCell.m; sourceTree = ""; }; @@ -2197,6 +2263,20 @@ 7B5A2DB825B0355400B4B469 /* V2MainViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = V2MainViewController.m; sourceTree = ""; }; 7B5A2DBA25B0355400B4B469 /* v2live.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = v2live.xcassets; sourceTree = ""; }; 7B5A2DBB25B0355400B4B469 /* V2LiveUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = V2LiveUtils.m; sourceTree = ""; }; + 88ABB5EF266DCB0D0050C38A /* TRTCWebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TRTCWebViewController.swift; sourceTree = ""; }; + 88ABB61C266DD0E80050C38A /* PrivacyPolicy.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = PrivacyPolicy.html; sourceTree = ""; }; + 88ABB62F266DD0FA0050C38A /* UserAgreement.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = UserAgreement.html; sourceTree = ""; }; + 88ABB643266DFE220050C38A /* MineRootView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MineRootView.swift; sourceTree = ""; }; + 88ABB644266DFE220050C38A /* MineViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MineViewModel.swift; sourceTree = ""; }; + 88ABB645266DFE220050C38A /* MineAboutResignViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MineAboutResignViewController.swift; sourceTree = ""; }; + 88ABB646266DFE220050C38A /* MineAboutViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MineAboutViewController.swift; sourceTree = ""; }; + 88ABB647266DFE220050C38A /* MineViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MineViewController.swift; sourceTree = ""; }; + 88ABB649266DFE220050C38A /* TRTCAlerts.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TRTCAlerts.swift; sourceTree = ""; }; + 88ABB64A266DFE220050C38A /* MineAlertContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MineAlertContentView.swift; sourceTree = ""; }; + 88ABB64B266DFE220050C38A /* TRTCAlertControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TRTCAlertControl.swift; sourceTree = ""; }; + 88ABB688266E01870050C38A /* LayoutDefine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LayoutDefine.swift; sourceTree = ""; }; + 88ABB6C7266F17900050C38A /* PrivacyPopView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyPopView.swift; sourceTree = ""; }; + 8F2F0E547215BFF033785B58 /* AppUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AppUtils.swift; sourceTree = ""; }; 910E179D2080A27500178D86 /* TXMoviePlayerNetApi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TXMoviePlayerNetApi.h; sourceTree = ""; }; 910E179E2080A27500178D86 /* TXMoviePlayerNetApi.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TXMoviePlayerNetApi.m; sourceTree = ""; }; 910E17A52080A2EB00178D86 /* TXMoviePlayerNetDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TXMoviePlayerNetDelegate.h; sourceTree = ""; }; @@ -2217,6 +2297,7 @@ 91EEB3492060AF6C00BD01DB /* DownloadViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DownloadViewController.h; sourceTree = ""; }; 91EEB34A2060AF6C00BD01DB /* DownloadViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DownloadViewController.m; sourceTree = ""; }; 91F87A7E1FF4A0FC001644B1 /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; + 9329C41FC3B5C3962B59AB62 /* LoginViewController+UI_Mock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "LoginViewController+UI_Mock.swift"; sourceTree = ""; }; 989986B80E1E50232B675AE9 /* Pods-TXReplaykitUpload_Smart.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TXReplaykitUpload_Smart.debug.xcconfig"; path = "Target Support Files/Pods-TXReplaykitUpload_Smart/Pods-TXReplaykitUpload_Smart.debug.xcconfig"; sourceTree = ""; }; A035040620D20A01007E61C6 /* QRCode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = QRCode.h; sourceTree = ""; }; A035040720D20A01007E61C6 /* QRCode.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = QRCode.m; sourceTree = ""; }; @@ -2255,7 +2336,7 @@ A0B8FC0A207E24F2008D7982 /* TVCUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TVCUtils.h; sourceTree = ""; }; A0FFAD92213791B70087FF45 /* TVCHttpMessageURLProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TVCHttpMessageURLProtocol.h; sourceTree = ""; }; A0FFAD93213791B70087FF45 /* TVCHttpMessageURLProtocol.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TVCHttpMessageURLProtocol.m; sourceTree = ""; }; - B89E7003C4E62D204C48C933 /* ProfileViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ProfileViewController.swift; sourceTree = ""; }; + A5EF67E246DB262D2537B3B1 /* CommonUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CommonUtils.swift; sourceTree = ""; }; C600497725ECE75C00EAEB17 /* TRTCChatSalonHandsUpTipsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TRTCChatSalonHandsUpTipsView.swift; sourceTree = ""; }; C603F8A726034EA0009E3AB2 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = "zh-Hans"; path = "zh-Hans.lproj/UserProtocol.html"; sourceTree = ""; }; C603F939260372A7009E3AB2 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/InfoPlist.strings"; sourceTree = ""; }; @@ -2330,7 +2411,7 @@ D6E5D1C020B7B61F00812B2F /* ReplayKit2Define.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReplayKit2Define.h; sourceTree = ""; }; D6E5D1C120B7B62000812B2F /* ScreenPushViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScreenPushViewController.h; sourceTree = ""; }; D6E5D1C220B7B62000812B2F /* ScreenPushViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScreenPushViewController.m; sourceTree = ""; }; - FC44C91D289F545A82864FAF /* AppUtils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AppUtils.swift; sourceTree = ""; }; + D6FFA8D04E7B76CCECCBA101 /* ProfileViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ProfileViewController.swift; sourceTree = ""; }; FDD4BF2824A1F8AD0015388B /* VideoEditor.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = VideoEditor.xcassets; sourceTree = ""; }; /* End PBXFileReference section */ @@ -2366,6 +2447,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4038CEDF2669CE3200813912 /* Accelerate.framework in Frameworks */, 4071CF6E2444423D000B7707 /* TXLiteAVSDK_Smart.framework in Frameworks */, D6D9E36D20D283E700B6D607 /* libresolv.tbd in Frameworks */, D6D9E36E20D283E700B6D607 /* libc++.tbd in Frameworks */, @@ -3020,7 +3102,7 @@ D50292D02272BA4A00C052B7 /* LiveLinkMicDemoOld */, D50292CF2272BA3F00C052B7 /* LivePlayerDemo */, D50292CD2272BA2A00C052B7 /* LivePusherDemo */, - 62A5B8B92A3AC9C471DA8498 /* Login */, + 4E45AD6C60CCE7C5E7CC560E /* Login */, ); path = TXLiteAVDemo; sourceTree = ""; @@ -3081,6 +3163,8 @@ 40F854FF1EE8FD2F00EE47D7 /* Frameworks */ = { isa = PBXGroup; children = ( + 4717324D26705C4A005F772E /* FFmpeg.xcframework */, + 4717324E26705C4A005F772E /* SoundTouch.xcframework */, 2840D91B24B8562200723FBC /* AudioToolbox.framework */, 40802A272484BBBE008151C1 /* AudioEffectSettingKit.framework */, 40AA539724459DF900303EF7 /* UGCKit.framework */, @@ -3256,16 +3340,16 @@ path = TRTCInfoPlist; sourceTree = ""; }; - 62A5B8B92A3AC9C471DA8498 /* Login */ = { + 4E45AD6C60CCE7C5E7CC560E /* Login */ = { isa = PBXGroup; children = ( - 7A7082A6FE37581C713AEEF7 /* LoginViewController_Mock.swift */, - 709679551E529BDAC156BCCC /* ProfileManager_Mock.swift */, - 25A428C96A8362146DE5EFCA /* LoginViewController+UI_Mock.swift */, - FC44C91D289F545A82864FAF /* AppUtils.swift */, - 3F48FB1CA32567C5E158CC95 /* CommonUtils.swift */, - B89E7003C4E62D204C48C933 /* ProfileViewController.swift */, - 164D8969678FDC96A4C42134 /* ProfileViewController+UI.swift */, + 41CFA7ADD5BA0F62C3C2C91C /* LoginViewController_Mock.swift */, + 1CEA59D6445EAA33AD428471 /* ProfileManager_Mock.swift */, + 9329C41FC3B5C3962B59AB62 /* LoginViewController+UI_Mock.swift */, + 8F2F0E547215BFF033785B58 /* AppUtils.swift */, + A5EF67E246DB262D2537B3B1 /* CommonUtils.swift */, + D6FFA8D04E7B76CCECCBA101 /* ProfileViewController.swift */, + 738F5C1FA9D95751B40FEF1A /* ProfileViewController+UI.swift */, ); name = Login; path = TXLiteAVDemo/Login; @@ -3346,6 +3430,16 @@ path = CommonWidgets; sourceTree = ""; }; + 88ABB648266DFE220050C38A /* subview */ = { + isa = PBXGroup; + children = ( + 88ABB649266DFE220050C38A /* TRTCAlerts.swift */, + 88ABB64A266DFE220050C38A /* MineAlertContentView.swift */, + 88ABB64B266DFE220050C38A /* TRTCAlertControl.swift */, + ); + path = subview; + sourceTree = ""; + }; 912A62052160D78A00C16E41 /* CFDanmaku */ = { isa = PBXGroup; children = ( @@ -3910,13 +4004,13 @@ 40A1DEBB2638412D0011E532 /* NSData+Common.m in Sources */, D6E5D1C520B7B62000812B2F /* ScreenPushViewController.m in Sources */, 402A010324506F740037A219 /* main.m in Sources */, - 35A72DD4F6E9172DB7265D6B /* LoginViewController_Mock.swift in Sources */, - 9312D80AC5AAD71A96A96A15 /* ProfileManager_Mock.swift in Sources */, - 6C441406009C189AB24AACA6 /* LoginViewController+UI_Mock.swift in Sources */, - 5C6CBD7BCA68426F9BF024C6 /* AppUtils.swift in Sources */, - F1457AC447AE6B7E772CAC62 /* CommonUtils.swift in Sources */, - ED26FADBF5206DFDBB033B6A /* ProfileViewController.swift in Sources */, - 43EA7D35C20FEDFD6C8DBFD9 /* ProfileViewController+UI.swift in Sources */, + 2E26BD32BCDAB0F776195556 /* LoginViewController_Mock.swift in Sources */, + FC225971E54AD1F629BA9097 /* ProfileManager_Mock.swift in Sources */, + ED1BBFA5DF561082831CB60A /* LoginViewController+UI_Mock.swift in Sources */, + 15ECE7E8EE1B83957612D299 /* AppUtils.swift in Sources */, + 8BCBBCAC26AF7CD10BC9C818 /* CommonUtils.swift in Sources */, + 4D245521777E1C91BCCE0F58 /* ProfileViewController.swift in Sources */, + 85A60FC0CD0D139C8509767B /* ProfileViewController+UI.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4108,7 +4202,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; DEBUG_INFORMATION_FORMAT = dwarf; - DEVELOPMENT_TEAM = 5GHU44CJHG; + DEVELOPMENT_TEAM = F8A3GH6Q4W; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -4146,7 +4240,10 @@ INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_GENERATE_MAP_FILE = NO; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/TXLiteAVDemo/Resource/Beauty/pitu", @@ -4162,7 +4259,7 @@ OTHER_SWIFT_FLAGS = "$(inherited) -D COCOAPODS -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Material/Material.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Motion/Motion.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/NVActivityIndicatorView/NVActivityIndicatorView.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa/RxCocoa.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay/RxRelay.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift/RxSwift.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift/Toast_Swift.modulemap\""; PRODUCT_BUNDLE_IDENTIFIER = com.tencent.fx.rtmpdemo2; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "Wildcard Dev"; + PROVISIONING_PROFILE_SPECIFIER = abyWildcardDev; STRIP_INSTALLED_PRODUCT = NO; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/TXLiteAVDemo/App/TXLiteAVDemo-Bridging-Header.h"; @@ -4224,7 +4321,10 @@ INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_GENERATE_MAP_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/TXLiteAVDemo/Resource/Beauty/pitu", @@ -4257,7 +4357,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = 5GHU44CJHG; + DEVELOPMENT_TEAM = F8A3GH6Q4W; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -4289,7 +4389,10 @@ ); INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/TXLiteAVDemo/VideoUpload/COSSDK", @@ -4303,7 +4406,7 @@ OTHER_SWIFT_FLAGS = "$(inherited) -D COCOAPODS -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Material/Material.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Motion/Motion.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/NVActivityIndicatorView/NVActivityIndicatorView.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa/RxCocoa.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay/RxRelay.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift/RxSwift.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift/Toast_Swift.modulemap\""; PRODUCT_BUNDLE_IDENTIFIER = com.tencent.fx.rtmpdemo2; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "Wildcard Dev"; + PROVISIONING_PROFILE_SPECIFIER = abyWildcardDev; STRIP_INSTALLED_PRODUCT = NO; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/TXLiteAVDemo/App/TXLiteAVDemo-Bridging-Header.h"; @@ -4357,7 +4460,10 @@ INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_GENERATE_MAP_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/TXLiteAVDemo/VideoUpload/COSSDK", @@ -4415,7 +4521,10 @@ ); INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MARKETING_VERSION = 7.2.1; OTHER_LDFLAGS = ( "$(inherited)", @@ -4471,7 +4580,10 @@ INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_GENERATE_MAP_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MARKETING_VERSION = 7.2.1; OTHER_LDFLAGS = ( "$(inherited)", @@ -4524,7 +4636,10 @@ ); INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LOCALIZED_STRING_SWIFTUI_SUPPORT = YES; MARKETING_VERSION = 7.2.1; OTHER_LDFLAGS = ( @@ -4584,7 +4699,10 @@ INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_GENERATE_MAP_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LOCALIZED_STRING_SWIFTUI_SUPPORT = YES; MARKETING_VERSION = 7.2.1; OTHER_LDFLAGS = ( @@ -4617,7 +4735,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = 5GHU44CJHG; + DEVELOPMENT_TEAM = F8A3GH6Q4W; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -4639,10 +4757,14 @@ ); INFOPLIST_FILE = ReplaykitUpload/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.tencent.fx.rtmpdemo2.Upload; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "Wildcard Dev"; + PROVISIONING_PROFILE_SPECIFIER = abyWildcardDev; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 1; }; @@ -4684,7 +4806,11 @@ ); INFOPLIST_FILE = ReplaykitUpload/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.tencent.fx.rtmpdemo2.Upload; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = com.tencent.fx.rtmpdemo2.Upload_Production_SignProvision; @@ -4733,7 +4859,10 @@ ); INFOPLIST_FILE = "TXLiteAVDemo/App/TRTC-Appstore-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MARKETING_VERSION = 7.4.269; OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = com.tencent.trtcScenesDemo; @@ -4791,7 +4920,10 @@ INFOPLIST_FILE = "TXLiteAVDemo/App/TRTC-Appstore-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_GENERATE_MAP_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MARKETING_VERSION = 7.4.269; OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = com.tencent.mrtc; @@ -4844,7 +4976,10 @@ ); INFOPLIST_FILE = "TXLiteAVDemo/App/TRTC-Appstore-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MARKETING_VERSION = 7.4.278; OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = com.tencent.trtcScenesDemo; @@ -4901,7 +5036,10 @@ INFOPLIST_FILE = "TXLiteAVDemo/App/TRTC-Appstore-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_GENERATE_MAP_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MARKETING_VERSION = 7.4.278; OTHER_LDFLAGS = "$(inherited)"; PRODUCT_BUNDLE_IDENTIFIER = com.tencent.mrtc; @@ -5049,7 +5187,11 @@ ); INFOPLIST_FILE = ReplaykitUpload/TRTCInfo.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); MARKETING_VERSION = 7.4.269; PRODUCT_BUNDLE_IDENTIFIER = com.tencent.trtcScenesDemo.Upload; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -5098,7 +5240,11 @@ ); INFOPLIST_FILE = ReplaykitUpload/TRTCInfo.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); MARKETING_VERSION = 7.4.269; PRODUCT_BUNDLE_IDENTIFIER = com.tencent.mrtc.Upload; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -5146,7 +5292,11 @@ ); INFOPLIST_FILE = ReplaykitUpload/TRTCInfo.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); MARKETING_VERSION = 7.4.269; PRODUCT_BUNDLE_IDENTIFIER = com.tencent.trtcScenesDemo.Upload; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -5194,7 +5344,11 @@ ); INFOPLIST_FILE = ReplaykitUpload/TRTCInfo.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); MARKETING_VERSION = 7.4.269; PRODUCT_BUNDLE_IDENTIFIER = com.tencent.mrtc.Upload; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -5218,7 +5372,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = 5GHU44CJHG; + DEVELOPMENT_TEAM = F8A3GH6Q4W; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -5240,10 +5394,14 @@ ); INFOPLIST_FILE = ReplaykitUpload/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.tencent.fx.rtmpdemo2.Upload; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "Wildcard Dev"; + PROVISIONING_PROFILE_SPECIFIER = abyWildcardDev; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = 1; }; @@ -5285,7 +5443,11 @@ ); INFOPLIST_FILE = ReplaykitUpload/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.tencent.fx.rtmpdemo2.Upload; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = com.tencent.fx.rtmpdemo2.Upload_Production_SignProvision; @@ -5302,7 +5464,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = 5GHU44CJHG; + DEVELOPMENT_TEAM = F8A3GH6Q4W; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", @@ -5329,7 +5491,10 @@ ); INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/TXLiteAVDemo/VideoUpload/COSSDK", @@ -5343,7 +5508,7 @@ OTHER_SWIFT_FLAGS = "$(inherited) -D COCOAPODS -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Material/Material.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Motion/Motion.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/NVActivityIndicatorView/NVActivityIndicatorView.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/RxCocoa/RxCocoa.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/RxRelay/RxRelay.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/RxSwift/RxSwift.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.modulemap\" -Xcc -fmodule-map-file=\"${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift/Toast_Swift.modulemap\""; PRODUCT_BUNDLE_IDENTIFIER = com.tencent.fx.rtmpdemo2; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "Wildcard Dev"; + PROVISIONING_PROFILE_SPECIFIER = abyWildcardDev; STRIP_INSTALLED_PRODUCT = NO; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG ENABLE_INTERNATIONAL"; SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/TXLiteAVDemo/App/TXLiteAVDemo-Bridging-Header.h"; @@ -5392,7 +5557,10 @@ INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_GENERATE_MAP_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/TXLiteAVDemo/VideoUpload/COSSDK", @@ -5455,7 +5623,10 @@ INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_GENERATE_MAP_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/TXLiteAVDemo/VideoUpload/COSSDK", @@ -5521,7 +5692,10 @@ INFOPLIST_FILE = TXLiteAVDemo/App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_GENERATE_MAP_FILE = YES; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/TXLiteAVDemo/VideoUpload/COSSDK", @@ -5578,7 +5752,11 @@ ); INFOPLIST_FILE = ReplaykitUpload/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.tencent.fx.rtmpdemo2.ReplaykitUpload; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "Wildcard Dev"; @@ -5620,7 +5798,11 @@ ); INFOPLIST_FILE = ReplaykitUpload/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.tencent.fx.rtmpdemo2.Upload; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = com.tencent.fx.rtmpdemo2.Upload_Production_SignProvision; diff --git a/iOS/Demo/TXLiteAVDemo/App/Info.plist b/iOS/Demo/TXLiteAVDemo/App/Info.plist index 62aeb081..ec384b1b 100644 --- a/iOS/Demo/TXLiteAVDemo/App/Info.plist +++ b/iOS/Demo/TXLiteAVDemo/App/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 8.7.1003 + 8.8.1075 CFBundleSignature ???? CFBundleURLTypes @@ -36,7 +36,7 @@ CFBundleVersion - 1003 + 1075 IMSDKCrashReporterEnable LSRequiresIPhoneOS diff --git a/iOS/Demo/TXLiteAVDemo/App/Main/MainViewController.m b/iOS/Demo/TXLiteAVDemo/App/Main/MainViewController.m index 92352319..52ed78f4 100644 --- a/iOS/Demo/TXLiteAVDemo/App/Main/MainViewController.m +++ b/iOS/Demo/TXLiteAVDemo/App/Main/MainViewController.m @@ -131,24 +131,10 @@ -(void)viewDidAppear:(BOOL)animated { #endif } -- (IBAction)logout:(id)sender { +- (IBAction)userInfoButtonClick:(id)sender { #if !defined(UGC) && !defined(PLAYER) - UIAlertController *alert = [UIAlertController alertControllerWithTitle:V2Localize(@"V2.Live.LinkMicNew.suretologout") message:nil preferredStyle:UIAlertControllerStyleAlert]; - UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:V2Localize(@"V2.Live.LinkMicNew.cancel") style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { - - }]; - UIAlertAction *okAction = [UIAlertAction actionWithTitle:V2Localize(@"V2.Live.LinkMicNew.confirm") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { - [[ProfileManager shared] removeLoginCache]; - [[AppUtils shared] showLoginController]; - [[V2TIMManager sharedInstance] logout:^{ - - } fail:^(int code, NSString *msg) { - - }]; - }]; - [alert addAction:cancelAction]; - [alert addAction:okAction]; - [self presentViewController:alert animated:YES completion:nil]; + MineViewController *mineVC = [[MineViewController alloc] init]; + [self.navigationController pushViewController:mineVC animated:YES]; #endif } @@ -406,17 +392,17 @@ - (void)initUI pressGesture.numberOfTouchesRequired = 1; [self.view addGestureRecognizer:pressGesture]; - // 退出登录按钮 - UIButton* logoutButton = [UIButton buttonWithType:UIButtonTypeCustom]; - logoutButton.frame = CGRectMake(20, 0, 32, 32); - CGPoint center = logoutButton.center; + // 用户个人信息按钮 + UIButton* userInfoButton = [UIButton buttonWithType:UIButtonTypeCustom]; + userInfoButton.frame = CGRectMake(20, 0, 32, 32); + CGPoint center = userInfoButton.center; center.y = lbHeadLine.center.y; - logoutButton.center = center; - [logoutButton setImage:[UIImage imageNamed:@"ic_logout"] forState:UIControlStateNormal]; - [logoutButton addTarget:self action:@selector(logout:) forControlEvents:UIControlEventTouchUpInside]; + userInfoButton.center = center; + [userInfoButton setImage:[UIImage imageNamed:@"ic_logout"] forState:UIControlStateNormal]; + [userInfoButton addTarget:self action:@selector(userInfoButtonClick:) forControlEvents:UIControlEventTouchUpInside]; #if !defined(UGC) && !defined(PLAYER) - [self.view addSubview:logoutButton]; + [self.view addSubview:userInfoButton]; #endif diff --git a/iOS/Demo/TXLiteAVDemo/App/ReplayKit2Define.h b/iOS/Demo/TXLiteAVDemo/App/ReplayKit2Define.h index f86b2c7f..7988f0c9 100644 --- a/iOS/Demo/TXLiteAVDemo/App/ReplayKit2Define.h +++ b/iOS/Demo/TXLiteAVDemo/App/ReplayKit2Define.h @@ -10,7 +10,11 @@ #define Replaykit2Define_h #define kReplayKitUseAppGroup 0 +#if DEBUG +#define kReplayKit2AppGroupId @"group.com.tencent.liteav.RPLiveStreamShare" +#else #define kReplayKit2AppGroupId @"group.com.tencent.liteav.RPLiveStreamRelease" +#endif #define kReplayKit2PasteboardName @"group.com.tencent.replaykit2.pasteboard" #define kReplayKitIPCPort 31753 diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/back.imageset/Contents.json b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/back.imageset/Contents.json new file mode 100644 index 00000000..694bc882 --- /dev/null +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/back.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "bgm_back.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "bgm_back@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "bgm_back@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/back.imageset/bgm_back.png b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/back.imageset/bgm_back.png new file mode 100644 index 0000000000000000000000000000000000000000..4d4b18a97d595c7957bc97dec18ebf0a9da97292 GIT binary patch literal 290 zcmV+-0p0$IP)Px#+(|@1R7efoRLc#*FboZ!71)An=O}mP;Q$jbLq}qTwtz%ZiC)Zeq*N8j!Hz(s zSW4}>@A;QB#=J{yiP*Q~$HJI9>l_Jz25w{NHoT+^FfJ*7+SfQLqc16^?*zzwgbog{ zs$l2o2hm2v|4)0@?kEP)Px$;7LS5RA>e5SxZjCFc7s72&u3D@maHC1BYP4$+!V4t^j+sZ~?mH5VQ>-)JRlF z3^O4krTKO2OsI)mDRMsZdGFO3e`1W}H=P4i?BqAuwbn!Qkc~XsX$nt`uB{Iny}Tc^ zicpLyG2AFR(76{G%H-u(&c4QL4;7m%( zN)0J6+8&er(XJKytu*uv%)lEHbPe2?00U1*1u}4vf&-S@N|8L=F(+))Yu)2_6&dwg zV27EA|D)IrPywoHmj?%W@o+S{Qq52bejS5n3Pf3IJHqP%&a?Xe+ZAiL%<^hjvM}UFgzQFClwteR7;My9+c@nNa^U-7sHAC= zFGVK2THqE}$YH;nAD?iFU@O3r6mB#H>KdzYuapAQ9$k`}d;F4iv6RS~@z%&(?pgb` zbbk#OtppfP$V5a0LMGxwAVeZw1VSRxi9iTMR0xDXgfXbJRJDrRGKIlUcY9a`ZA%a) oLSI?&Tz&1)k~%($3P=_B0gs>WJVcPx&lSxEDRCodHo4<3@Fcin7(jQ#IQOKn`6RgnxfICJ8MvlGAF!ERM2T+cc|9}D5 zS)e;JbZL?T*Mt)8D)d60qd1l=S-)cEd66YOJ$?0wV#)S1W5JHob0JEdI~i=0x-P1$ z><$|l8)5^u^oI~P^BxvP2L^vfY?wF7@?cOZ`lk@xQUi2lWCX_k4N-#klvjCF`R-ri zT6=AUsRIdQi!d8cMZ*YEQ(_Xc85~K=2r*Lt1 zxdzn|6ha6N$VyO1Ay$H72r&{AQ%I>GxCfey*Z_?nb)BrLud?%OrB;phI3I3ou;*&o zV9dU$`DEv~2*FOk+it+eXh@hXMIu&*7~NLdQX_jJ&}ahkj`z*V4B&JmK2H~4nYxN9 z+Ma86ck&Ok)W8O zj0MFKWhE$vC~HBXMb#1%QdDh0p+q?e3L(l_kSa>XtxS3yz5`{+54o$nNG^f|5CI}U z1c(3;AOdp&@Jc>=>?5D-LVjMG=FH1h$W{6@R$=BF%0sa3Dpt$kzo(wlFt_ok8WCkIa!Wn~O=InKEmmRu9MWHK~G%BDbfkCKI z02zWgk~8LM>KTJzFbxW*$zXy4Y6F-cfZ7DcE1))l@dBvLV4MI=gJZ|+eZ@XzC08XJ zxM^y&ip{`$lwj^^JK(GpU~qg!fP@g+{W1F_!Q8`!1?gKEV*O;*_Av!It%{7|spOz1 z`yGCe5An|R^cX_Ee_e>%x$;J5jb>1Ogb=5EdC6Yp%P}usaGY#kVfSOb*vEcDq_qH{ zkaYm%1ZW*Vc>&aBP+kGG5mXRBZ2}b(P#Zu+0n}trQ2{j(R1!c<0+key2`C6VlJ`T8 zx*h%w?bkL{Ked!!6aAr&2sKmT?6@uS`qjMz0Qg`khyET00000NkvXX Hu0mjf9w4;k literal 0 HcmV?d00001 diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_nor.imageset/Contents.json b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_nor.imageset/Contents.json new file mode 100644 index 00000000..411c85d6 --- /dev/null +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_nor.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "checkbox_nor.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "checkbox_nor@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "checkbox_nor@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_nor.imageset/checkbox_nor.png b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_nor.imageset/checkbox_nor.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce769472ad7503f20b1c241493f1f439ee9d483 GIT binary patch literal 709 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfl1%f#WBQ# zck8tCUebXg$IkDZ9N6-VQ7VSRQ9|5R%jvZ-$J%#yzp!%Y>AYKFy|UXW{($fID8=&$ z+)0AsvH}acA8iT{$(fzfcfb5h@5BY$PChx1(l)cW{{G+Me=bkue%F*3X}W$4IwDqh z)pvLcd|rA z&N%z6N;Qx3jr_Cqp-=bDWIdCmzBc6Av-v*B+V8eCKb~B*`Rc7hS<^$e8ce?0y7P^* z%tg@$XSPm|tvhh~Yr6mDwJ*Ntf7g%yY`P|8^1d1OiefssOTO7W-^Oy){6BZU@B)r$ zANp>$8lS9CYm{Hle`VF3X^sz{{D?5H2uy!8*GOdT-G6<}I$D{j&lcLMzp#5ebIYu? z`5X-kJdH%H3g;O_wY3J{kW8qoP;TGg>Z2s5r3T=S)9xJV*KTE5&8? zK8uW8l)7{J7a1+s+oSUH=GpZP%V&Ri|5fVI&+G5M7`9LD72Tk9C?NVz+%f;@OP7me zSj=x-t@2svg-$NZwc?H~k)ktI4rf^~>!dfy?ulG5Z}XF?P??}co=pV|w^OP`Hbz$1 zx}QuvC>3(}c+*AAGU+Ef8p@SSxYs||*xB4sz>~JmlTF(HP2Sy#rMEn!`B*cQb7x)` kQc}+S71;9K=-;*&#(QCE{*HSBE`ySgr>mdKI;Vst0RC7n?f?J) literal 0 HcmV?d00001 diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_nor.imageset/checkbox_nor@2x.png b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_nor.imageset/checkbox_nor@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d72f19390b2e8e18433455e1dd4cf5269fb3ee5f GIT binary patch literal 1513 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 literal 0 HcmV?d00001 diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_sel.imageset/Contents.json b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_sel.imageset/Contents.json new file mode 100644 index 00000000..6e6f73a5 --- /dev/null +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_sel.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "checkbox_sel.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "checkbox_sel@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "checkbox_sel@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_sel.imageset/checkbox_sel.png b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_sel.imageset/checkbox_sel.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa79af24a9ac90fcfbca9acc47d815535589302 GIT binary patch literal 690 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uv49!D1}S`GTDq2jfl0>G#WBQ# zcWaohw~V7et+Ae3N23Bu;@xJ2mWnBVS|&_B^5EuPjjGU=4N8tpGn$`Fi-{F*HaPBj z(7Vp*NcIP%3W5G64M*nPkE??(|28z<{myFH!t!0KSKVLzZr!>l{<%?_8V}^}DIZYz zE#dol;!jJPIUD2`$XEY(G(US`>KAQEvx&?;(bu*`P6v_S(Erem3pjllG&f_JP_^qdRZ)= z&6Nzxw`EBzR-dC~>`#0)iIcr9yyw!~8QXVVh&yk?d*ftFs^cMtV2yhZrtJE?=%}uL zO*>md_kPa8sS{0KwHMA~ta-}&Azf5L-cR5Q=k4bgebho?xmfm{Tu^7o;Uf|xCK%0< zthp+{#PE_Iv&9Fg*)ydFRA#s{W@dHv4_UVg3VWUW*l4bT+^L<9EwtQqAod z`}aLP8n8P!NA)G6&65)!!+$1*4d>Jxa#aRp2aU#%@*Xiq;;`KO^7+Z zY^%eD-loMfZ`JG0RJ!07qSIiso9kDtui4WA-!*dCiAC&Z3;I87f6C`%x007(%Z(|Z O^y2C2=d#Wzp$PzO0U)3N literal 0 HcmV?d00001 diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_sel.imageset/checkbox_sel@2x.png b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/checkbox_sel.imageset/checkbox_sel@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..099c72b45d3768365b33967bee427340a8e9fe3a GIT binary patch literal 1215 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 P00000NkvXXu0mjfk5h(> literal 0 HcmV?d00001 diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/exit.imageset/exitRoom@3x.png b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/exit.imageset/exitRoom@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..ea03892ad9bd6fe70baf4eec882a22dfe78f32d7 GIT binary patch literal 3012 zcmV;#3p@0QP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91V4wp41ONa40RR91U;qFB0I4%yP5=N4E=fc|RCodHoolQeRTam*ZEbI% z)k3kh3iZ(2L_}glKlp%8_(}{C2r-a=@g~NkQ4$Rye(*^&>L(L5#26D3;v+FJMxvsq z316rveo!I2G=Qh1NUfBXw$MwZt^eO)&vDMVd(Ct2J#!x``FG~5y=SfeUTgMa_MF}` z^NOCznKNhBirTEh26tSq;~If7z&UbSIOV|kNnt^F(H$3NW@aewoy_!wkqh`{@yW0; zFt-!3cPv9+64Ge`T+q)^P__!2gp_hz&JGEOyG%y%1SshEe3d}Zw+P8O$Y);8=))0# zWE@p8_?%3VHQoiDyM2ei*xpBB-gsJ|S0qV9^aQxTbGL67m`s;~FnJ#k4#iGH)C4H_ zjO#mv&=aamCJ`p?CzS-|izpH$0Sf#&u{~el&R-6~{IFk%cqw#af+s-1XJQ=)tkaj1 z@EkEz5}2@qNw5UCv7WnrTQGM0G;~n3=nX+8=^zPE@R?k931{^)X2Ds#Ad62Z2~5_l zq;&!m{IkVix4^i+l7#u-F(u*oHjQqT00o~1syQLslWD_cDPGII)8k6Q(Wc}ZCqThJ zS55~)V;fCL_v||60w(8YoA7EBJQw^6n>bv?*Zi|d5^4_}ZrB+t<3KiT+Q7x8*7da# zAO}pijQNdvPAz6juQD;2b1|ySzH$O&n58DGoyyl#X0d!K5}VyFR+U;+DVQ=yc6SLY zZK+u)h*On_(JmLWsiMUnD@O_IAV?uqu?0!zT zKp+rT3HXLXD%mmJ3nmgE76f575t~oR&$k5MT}W_3i_a#$;Q*HuLTrigSf&%;ohZh& z!Q{;GAuTn8JhKH-rzCIAJabEq9g}gcID# z9!^WllooGsu^v?%CqSPV7mMzaQp*)8Fa}>

=84d|QZ-fM3fl!wo(xfg2oS3Na?u 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 literal 0 HcmV?d00001 diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_detail.imageset/Contents.json b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_detail.imageset/Contents.json new file mode 100644 index 00000000..131cd427 --- /dev/null +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_detail.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "详情.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "详情@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "详情@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_detail.imageset/\350\257\246\346\203\205.png" "b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_detail.imageset/\350\257\246\346\203\205.png" new file mode 100644 index 0000000000000000000000000000000000000000..a0c90c231c748b4be539512b7179174b132817e5 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K$eCVIL!hFAzD zCrC_raOCG})#K;yzfd_==o2AoXyj?|=YM?Jr#roTYd#&}m}gPH`2UZcum3l$%T#u= z4KsCcR%_s~to-N39maZuL(aauSm=hTc%F&iV!72)3(S`RCF}lGG4En})7Y`DOUTYO zZh?k?X4kRF&)0o#THN2!a->PO=AW^VO?pDY8zb{8D-NjH?>NE`m>hYMAv~=N6gA}f5OZv>fz@*~o;usRa z`8Leg|BiuxZ2Ld4vhPQhO+WijSjDBgYl0R_QxId*HwN7mE7oenuL@ygRXi21xHIQa z=MsCh!^P7IEg3cnix%FHF_Jqz@B6cx^JZjx;1MYZQ0UqG^7Os0`wmaJv@q^v$8E;I zN&8eEG4C**zBlK5S=>#FY^F*-2}R_HGv;G&P-(@%SUK zf7RZzC-QcMDeO7Lr}^A-W+TrwYyIf=N6WWf<9czxOOww{D!A)PKI5rQu?0uWKgO<| z%p@e^RT22<`wYwZ6YMtpzV&tX>0{e-EHo7i7rNZb z*J@>n6|DD}_wUr$*IgRL#2fdg?|s8#nf&Cl+Kt(ZuCa8TnfyiEaOQ3Xqx*~%Pj@#6 zGsbw-CmotHZ;5=vd#7*Zwd;S~-X&Be7t1IzJI?-|-GS%7->TRA@6Y}zd`aHHHkdV! YVeY>DM~`}4j|8O~Pgg&ebxsLQ0M#%i{Qv*} literal 0 HcmV?d00001 diff --git "a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_detail.imageset/\350\257\246\346\203\205@3x.png" "b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_detail.imageset/\350\257\246\346\203\205@3x.png" new file mode 100644 index 0000000000000000000000000000000000000000..a6b56da714116f4701cd83e8422ae1156c54f599 GIT binary patch literal 1084 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 literal 0 HcmV?d00001 diff --git "a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_disclaimer.imageset/\345\205\215\350\264\243\347\224\263\346\230\216@3x.png" "b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_disclaimer.imageset/\345\205\215\350\264\243\347\224\263\346\230\216@3x.png" new file mode 100644 index 0000000000000000000000000000000000000000..eb8ee9aaad5e73877a2647ba057f1cb818e36b03 GIT binary patch literal 2844 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 literal 0 HcmV?d00001 diff --git "a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_edit.imageset/\347\274\226\350\276\221@3x.png" "b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_edit.imageset/\347\274\226\350\276\221@3x.png" new file mode 100644 index 0000000000000000000000000000000000000000..e2df4a8594a28b63e3a84a82fa589b079c83ffd1 GIT binary patch literal 571 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~ySip>6gB0F2&*1?oTk7fJ7?Q#I zc7~xhv!O`C=TnZdx_rCjN&+?n$gr537Yf$5Kd}F(|AYMxJ8SvDrlXz$g%kPmWUa3p z>n>{FX!`74_4GZ>DV`pm-tE(GJiS|Es#g@_B`yX{DM6dMnw#-D;@1~kUB_0sdGpP^ zXFk{TRa^=82x$C$@^isT`@F3|(W(X-61m@ZJ&)*2V0!()Ql*Jw$AgtZz1%+z1gl7i zu3+w;n&HF1+&}Tf6vsKHtoI5smipgI|Ew*qR>r7R!@Bn2nk;LnHB31l?jI0lFE^bM zs+-g-EXNRM&Y)K_A%bPcL+i*g8<{W5?UvC9v7WEH9U%vSA~(2vUGw%P=bAEJypC6eM&^FkHaY-T&?RERas_>j_g9v%(ruS=Y?oxx0P2lI*0&KE7`{*Ct)^ odUooZ*;P-4Z+S~)JN7cqf9$5Y`{u^I9iWKwboFyt=akR{04FugJ^%m! literal 0 HcmV?d00001 diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_privacy.imageset/Contents.json b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_privacy.imageset/Contents.json new file mode 100644 index 00000000..1d7fa2a8 --- /dev/null +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_privacy.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "隐私条款.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "隐私条款@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "隐私条款@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git "a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_privacy.imageset/\351\232\220\347\247\201\346\235\241\346\254\276.png" "b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_privacy.imageset/\351\232\220\347\247\201\346\235\241\346\254\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..d5aa2c626f355f80ed76dd8989637912c3d44570 GIT binary patch literal 1053 zcmV+&1mgRNP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91A)o^Q1ONa40RR91AOHXW04pG=umAu9he3Iw5DJ6B~y(891lF{#K!1k%sSRYi+HFxo_*i=e`#g{}Y=DprHZ{EE3(7K@aymQab_s%)@-t$I~hasg5B~ojr#D;8NX!VLaTyRpQLSWH2%)<%&pO4&vXoU~HQgmQ=mNVdE3N?v5f=e^CQF02 zb_y})q~i#J-&{*3^_wKbHKwCZh6=55G!i7`{YWHqo9UFDTtN`(?N`!+?7YcN(JPMu ze30Q_t6fxVL8MZt!)xpGT1tv}b><{51br{rL1#5h8?(ygfyhKaAKhvIhEo8M;ZUPB zA^~F&GipGn6l`q-a(z%N<3nl&zr-LgqX>EHxvGIga+L<(yr=QcQ_4icfm&)kbDW}) zQmaW@8g-@$o~R1~W;(Kk_{GgG7@PP?9d`$4Zs8Zz)>JA-Q`7TQwY!}9I@{<_-Co6W z`iEV^g}NVUF+n6&^ha_-UUE{z8X|E1@*UDbLF&8SMs@pYl*+{9G4bmk)2a ziiik^$I)=8UDX7?eJFDf6@x%31&DwZ0JH!GJggy2ZU%h9w*rBq*zHM(8bAt+2w0tg zhc%;4tZVkPEQ4N2-lln04&t@mZD?Lx>-RLJL zk-W7NjR&c}`(hqHhatpB_MDLFCd^sf^xzc$)ZOXG>P$Ma*YPI5t{$6?*3+>g^{!;? zgwP7)99DKhPP~@WP1JLhZ+9Nu51!J{+mBA-wrhMiN)?GrLt-oA$c$C)GS_2!DoolN zA!oBSA-F5@KAyiCp@pAI>JPNPA!bxMc#Dj4Sem^W`5jNt^p8cQ2HMYnZv_H9A+5`H zKSp}{U-(fob>LfpKvSAXrsHl;P16Dsliy~oj~;0ehwsc5<*pb_sgng9JYL7iB0BKN zx2dj9Oc?iam3swaCvUyVv%7;xwOia3+bL`dk9`>}o*4-^;%ik)uB1nJcGX?^1&7W% z5)L-=tUdwENWdVNXv@)z`gKrDFVpD4$KP*|91t*o5OG_6ZaaX$CR%gCY+I}X_xboottVQX^)3||E!VF+MWQTbmV#8x1n(Ufk-PXm7d X15tng7`qNc00000NkvXXu0mjf%`3kV literal 0 HcmV?d00001 diff --git "a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_privacy.imageset/\351\232\220\347\247\201\346\235\241\346\254\276@2x.png" "b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/main_mine_privacy.imageset/\351\232\220\347\247\201\346\235\241\346\254\276@2x.png" new file mode 100644 index 0000000000000000000000000000000000000000..b57fdc69bb0b19635df0d93139eb266fb7271e4f GIT binary patch literal 1972 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 O0000!M?M@U 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 T&tx8j00000NkvXXu0mjfq79V^ literal 0 HcmV?d00001 diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/userAgreement.imageset/Contents.json b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/userAgreement.imageset/Contents.json new file mode 100644 index 00000000..9e615c64 --- /dev/null +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/userAgreement.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "userAgreement.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "userAgreement@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "userAgreement@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/userAgreement.imageset/userAgreement.png b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/userAgreement.imageset/userAgreement.png new file mode 100644 index 0000000000000000000000000000000000000000..6aabdf4f8e448bf5d01f0a63511cb16f62a6e52c GIT binary patch literal 900 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 X>XMarV;TRu00000NkvXXu0mjfVkrlZ literal 0 HcmV?d00001 diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/userAgreement.imageset/userAgreement@3x.png b/iOS/Demo/TXLiteAVDemo/App/Resource/Assets.xcassets/userAgreement.imageset/userAgreement@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8228b3c21ad2e1b6bac7e42b07bd96012e4dfa GIT binary patch literal 2702 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 IM6N<$f)rTuy8r+H literal 0 HcmV?d00001 diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/AppPortalLocalized/en.lproj/AppPortalLocalized.strings b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/AppPortalLocalized/en.lproj/AppPortalLocalized.strings index 2cbdbed7..da5d34d3 100644 --- a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/AppPortalLocalized/en.lproj/AppPortalLocalized.strings +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/AppPortalLocalized/en.lproj/AppPortalLocalized.strings @@ -29,3 +29,34 @@ "AppCommon.TCUtil.sendhttprequest" = "Unable to convert parameter value to JSON string due to sendHttpRequest failure"; "AppCommon.TCUtil.parametererror" = "Parameter error"; "AppCommon.TCUtil.serverrequesterror" = "Server request error"; + + +"Demo.TRTC.Portal.Home.logout" = "Log out"; +"Demo.TRTC.Portal.Mine.personalcenter" = "Personal Center"; +"Demo.TRTC.Portal.Mine.about" = "About"; +"Demo.TRTC.Portal.Main.home" = "Home"; +"Demo.TRTC.Portal.Main.mine" = "Me"; +"Demo.TRTC.Portal.confirm" = "Done"; +"Demo.TRTC.Portal.enterusername" = "Please enter a nickname"; +"Demo.TRTC.Portal.privacy" = "Privacy"; +"Demo.TRTC.Portal.disclaimer" = "Disclaimer"; +"Demo.TRTC.Portal.sdkversion" = "SDK Version"; +"Demo.TRTC.Portal.appversion" = "Application Version"; +"Demo.TRTC.Portal.limit20count" = "Chinese characters, letters, numbers and underscores, 2 - 20 words"; +"Demo.TRTC.Portal.changenickname" = "Change Your Nickname"; +"Demo.TRTC.Portal.disclaimerdesc" = "this app is a tryout app, whose copyright is owned by Tencent Cloud. This app is for tryout only and must not be used commercially.\nIn accordance with relevant regulations, this app forbids pornographic, abusive, terrorism, and politically sensitive content. All audio/video interactions are recorded and archived."; + +"Demo.TRTC.Portal.resignaccount" = "Delete Account"; +"Demo.TRTC.Portal.resignsuccess" = "Account deleted"; +"Demo.TRTC.Portal.resigntips" = "You can no longer use this account after deletion. Its data will also be deleted and cannot be retrieved."; +"Demo.TRTC.Portal.currentaccount" = "Account:xxx"; +"Demo.TRTC.Portal.confirmresign" = "Delete"; +"Demo.TRTC.Portal.alerttoresign" = "Are you sure you want to delete this account?"; +"Demo.TRTC.Portal.privateandagreement" = "I have read and agree to the Privacy Policy and Terms of Use, and I authorize Tencent Cloud to manage the data (nickname, profile photo, phone number) of this account ."; +"Demo.TRTC.Portal.agreeprivatefirst" = "You must agree to the Privacy Policy and Terms of Use first."; +"Demo.TRTC.Portal.agree" = "agree"; +"Demo.TRTC.Portal.disagree" = "disagree"; +"Demo.TRTC.Portal.popTitle" = "Welcome to Tencent Cloud Video Toolkit"; +"Demo.TRTC.Portal.popMessage" = + "Welcome to Tencent Cloud Video Toolkit. We will help you understand our collection, use, and storage of personal information through the \"Privacy Regulations\" and \"User Agreement\". +In addition, you can also learn about your related rights and implementation methods. If you agree, please click the button below to start accepting our services;"; diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/AppPortalLocalized/zh-Hans.lproj/AppPortalLocalized.strings b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/AppPortalLocalized/zh-Hans.lproj/AppPortalLocalized.strings index a27d727a..21eee357 100644 --- a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/AppPortalLocalized/zh-Hans.lproj/AppPortalLocalized.strings +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/AppPortalLocalized/zh-Hans.lproj/AppPortalLocalized.strings @@ -29,3 +29,34 @@ "AppCommon.TCUtil.sendhttprequest" = "sendHttpRequest failed,参数转成json格式失败"; "AppCommon.TCUtil.parametererror" = "参数错误"; "AppCommon.TCUtil.serverrequesterror" = "服务请求失败"; + +"Demo.TRTC.Portal.Home.logout" = "退出登录"; +"Demo.TRTC.Portal.Mine.personalcenter" = "个人中心"; +"Demo.TRTC.Portal.Mine.about" = "关于"; +"Demo.TRTC.Portal.Main.home" = "主页"; +"Demo.TRTC.Portal.Main.mine" = "我的"; +"Demo.TRTC.Portal.confirm" = "确认"; +"Demo.TRTC.Portal.enterusername" = "请输入用户昵称"; +"Demo.TRTC.Portal.privacy" = "隐私条例"; +"Demo.TRTC.Portal.disclaimer" = "免责声明"; +"Demo.TRTC.Portal.sdkversion" = "SDK 版本"; +"Demo.TRTC.Portal.appversion" = "商店版本"; +"Demo.TRTC.Portal.limit20count" = "仅限中文、字母、数字和下划线,2-20个字"; +"Demo.TRTC.Portal.changenickname" = "修改用户昵称"; +"Demo.TRTC.Portal.disclaimerdesc" = "视频云工具包(\"本产品\")是由腾讯云提供的一款测试产品,腾讯云享有本产品的著作权和所有权。本产品仅用于功能体验,不得用于任何商业用途。\n为配合相关部门监管要求,本产品音视频互动全程均有录音录像存档,严禁在使用中有任何但不限于色情、辱骂、暴恐、涉政等违规内容的传播。"; + +"Demo.TRTC.Portal.resignaccount" = "注销账户"; +"Demo.TRTC.Portal.resignsuccess" = "注销成功"; +"Demo.TRTC.Portal.resigntips" = "注销后,您将无法使用当前账号,相关数据也将删除无法找回"; +"Demo.TRTC.Portal.currentaccount" = "当前账号 xxx"; +"Demo.TRTC.Portal.confirmresign" = "确认注销"; +"Demo.TRTC.Portal.alerttoresign" = "确定要注销账户吗?"; +"Demo.TRTC.Portal.privateandagreement" = "我已阅读并同意《隐私条例》和《用户协议》,并授权腾讯云使用该账号(昵称、头像、电话号码)进行统一管理"; +"Demo.TRTC.Portal.agreeprivatefirst" = "请先同意隐私条款条款和用户协议。"; +"Demo.TRTC.Portal.agree" = "同意"; +"Demo.TRTC.Portal.disagree" = "不同意"; +"Demo.TRTC.Portal.popTitle" = "欢迎使用腾讯云视频工具包"; +"Demo.TRTC.Portal.popMessage" = + "欢迎使用腾讯云视频工具包,我们将通过xxx和yyy帮助您了解我们收集,使用,存储个人信息的情况, + 此外,您还可以了解到您所享有的相关权利和实现途径,如您同意请点击下方按钮开始接受我们的服务;"; + diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/TRTCLocalized/en.lproj/TRTCDemoLocalized.strings b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/TRTCLocalized/en.lproj/TRTCDemoLocalized.strings index 8820b82f..b95cd9b8 100644 --- a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/TRTCLocalized/en.lproj/TRTCDemoLocalized.strings +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/TRTCLocalized/en.lproj/TRTCDemoLocalized.strings @@ -324,3 +324,6 @@ "Demo.TRTC.Streaming.call" = "Call"; "Demo.TRTC.Home.loginimsuccess" = "Logged in to IM"; "Demo.TRTC.Home.loginimfailed" = "Failed to log in to IM"; + +"Demo.TRTC.Login.setavatar" = "Change Profile Picture"; +"Demo.TRTC.Login.done" = "Done"; diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/TRTCLocalized/zh-Hans.lproj/TRTCDemoLocalized.strings b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/TRTCLocalized/zh-Hans.lproj/TRTCDemoLocalized.strings index c681e4b3..37a5b7eb 100644 --- a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/TRTCLocalized/zh-Hans.lproj/TRTCDemoLocalized.strings +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/TRTCLocalized/zh-Hans.lproj/TRTCDemoLocalized.strings @@ -365,3 +365,6 @@ "Demo.TRTC." = "用户接受"; "Demo.TRTC." = "用户拒绝"; "Demo.TRTC." = "录音文件路径已复制"; + +"Demo.TRTC.Login.setavatar" = "设置头像"; +"Demo.TRTC.Login.done" = "确认"; diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/V2Localized/en.lproj/V2LiveLocalized.strings b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/V2Localized/en.lproj/V2LiveLocalized.strings index 223f18fa..753791d1 100644 --- a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/V2Localized/en.lproj/V2LiveLocalized.strings +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/V2Localized/en.lproj/V2LiveLocalized.strings @@ -173,3 +173,10 @@ "MLVB.lebLauncher.inputLebUrl" = "Enter a playback address started with webrtc://"; "MLVB.lebLauncher.enterplayeraddress" = "Enter a valid playback address"; + +"Demo.TRTC.Portal.privateandagreement" = "I have read and agree to the xxx and yyy, and I authorize Tencent Cloud to manage the data (nickname, profile photo, phone number) of this account ."; +"Demo.TRTC.Portal.agreeprivatefirst" = "You must agree to the Privacy Policy and Terms of Use first."; +"Demo.TRTC.Portal." = "Privacy Policy"; +"Demo.TRTC.Portal." = "Terms of Use"; +"Demo.TRTC.Portal.private" = "Privacy Policy"; +"Demo.TRTC.Portal.agreement" = "Terms of Use"; diff --git a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/V2Localized/zh-Hans.lproj/V2LiveLocalized.strings b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/V2Localized/zh-Hans.lproj/V2LiveLocalized.strings index 4f070f4f..1892a962 100644 --- a/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/V2Localized/zh-Hans.lproj/V2LiveLocalized.strings +++ b/iOS/Demo/TXLiteAVDemo/App/Resource/Localized/V2Localized/zh-Hans.lproj/V2LiveLocalized.strings @@ -171,3 +171,11 @@ "MLVB.lebLauncher.inputUrl" = "请输入播放地址"; "MLVB.lebLauncher.inputLebUrl" = "请输入以 webtrc:// 开头的播放地址"; "MLVB.lebLauncher.enterplayeraddress" = "请输入正确的播放地址"; + + +"Demo.TRTC.Portal.privateandagreement" = "我已阅读并同意xxx和yyy,并授权腾讯云使用该账号(昵称、头像、电话号码)进行统一管理"; +"Demo.TRTC.Portal.agreeprivatefirst" = "请先同意隐私条款条款和用户协议。"; +"Demo.TRTC.Portal." = "《隐私条例》"; +"Demo.TRTC.Portal." = "《用户协议》"; +"Demo.TRTC.Portal.private" = "隐私条例"; +"Demo.TRTC.Portal.agreement" = "用户协议"; diff --git a/iOS/Demo/TXLiteAVDemo/App/TRTC-Appstore-Info.plist b/iOS/Demo/TXLiteAVDemo/App/TRTC-Appstore-Info.plist index 4afd70bc..d3cf5234 100644 --- a/iOS/Demo/TXLiteAVDemo/App/TRTC-Appstore-Info.plist +++ b/iOS/Demo/TXLiteAVDemo/App/TRTC-Appstore-Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 8.7.1003 + $(MARKETING_VERSION) CFBundleSignature BNDL CFBundleURLTypes @@ -36,7 +36,7 @@ CFBundleVersion - 1003 + $(CURRENT_PROJECT_VERSION) IMSDKCrashReporterEnable LSRequiresIPhoneOS diff --git a/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioEffectSettingKit.xcodeproj/project.pbxproj b/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioEffectSettingKit.xcodeproj/project.pbxproj index df9dcd39..1086ea36 100644 --- a/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioEffectSettingKit.xcodeproj/project.pbxproj +++ b/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioEffectSettingKit.xcodeproj/project.pbxproj @@ -62,7 +62,7 @@ 40E25FB6248029F8005EB543 /* ASNSLayoutConstraint+MASDebugAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 40E25F9D248029F8005EB543 /* ASNSLayoutConstraint+MASDebugAdditions.m */; }; 40E25FB924803F68005EB543 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 401A9A47247FB78F00C0763B /* libc++.tbd */; }; 40E25FBE24804490005EB543 /* BuildFile in Frameworks */ = {isa = PBXBuildFile; }; - 90CF263022ED8D9C229582A3 /* TXLiteAVSDK_Smart.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C7E47057FC2E4901BA6D2DB6 /* TXLiteAVSDK_Smart.framework */; }; + CFCBB7A3C85B738FE32D05D1 /* TXLiteAVSDK_Smart.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A85976E1B2E43C77ABD079B /* TXLiteAVSDK_Smart.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -130,7 +130,7 @@ 40E25F9B248029F8005EB543 /* ASMASLayoutConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASMASLayoutConstraint.h; sourceTree = ""; }; 40E25F9C248029F8005EB543 /* ASViewController+MASAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ASViewController+MASAdditions.h"; sourceTree = ""; }; 40E25F9D248029F8005EB543 /* ASNSLayoutConstraint+MASDebugAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ASNSLayoutConstraint+MASDebugAdditions.m"; sourceTree = ""; }; - C7E47057FC2E4901BA6D2DB6 /* TXLiteAVSDK_Smart.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TXLiteAVSDK_Smart.framework; path = ../../../SDK/TXLiteAVSDK_Smart.framework; sourceTree = ""; }; + 4A85976E1B2E43C77ABD079B /* TXLiteAVSDK_Smart.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = TXLiteAVSDK_Smart.framework; path = ../../../SDK/TXLiteAVSDK_Smart.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -142,7 +142,7 @@ 40E25FBE24804490005EB543 /* BuildFile in Frameworks */, 40E25FB924803F68005EB543 /* libc++.tbd in Frameworks */, 40D08707249C9D460055F9A6 /* AssetsLibrary.framework in Frameworks */, - 90CF263022ED8D9C229582A3 /* TXLiteAVSDK_Smart.framework in Frameworks */, + CFCBB7A3C85B738FE32D05D1 /* TXLiteAVSDK_Smart.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -199,7 +199,7 @@ 40D08706249C9D460055F9A6 /* AssetsLibrary.framework */, 40D08703249C9C130055F9A6 /* Accelerate.framework */, 401A9A47247FB78F00C0763B /* libc++.tbd */, - C7E47057FC2E4901BA6D2DB6 /* TXLiteAVSDK_Smart.framework */, + 4A85976E1B2E43C77ABD079B /* TXLiteAVSDK_Smart.framework */, ); name = Frameworks; sourceTree = ""; diff --git a/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioSettingKit/View/AudioEffectSettingView.h b/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioSettingKit/View/AudioEffectSettingView.h index ac75d1e3..c29939f2 100644 --- a/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioSettingKit/View/AudioEffectSettingView.h +++ b/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioSettingKit/View/AudioEffectSettingView.h @@ -36,6 +36,7 @@ typedef NS_ENUM(NSUInteger, AudioEffectSettingViewType) { - (void)show; - (void)hide; +- (BOOL)isShow; /// 停止播放音乐 - (void)stopPlay; diff --git a/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioSettingKit/View/AudioEffectSettingView.m b/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioSettingKit/View/AudioEffectSettingView.m index 684b5fdb..791f2aef 100644 --- a/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioSettingKit/View/AudioEffectSettingView.m +++ b/iOS/Demo/TXLiteAVDemo/AudioSettingKit/AudioSettingKit/View/AudioEffectSettingView.m @@ -530,4 +530,8 @@ - (NSString *)switchSecondToTimeStr:(NSInteger)secondNum { NSString *secondString = sec > 9 ? [NSString stringWithFormat:@"%ld", sec] : [NSString stringWithFormat:@"0%ld", (long)sec]; return [NSString stringWithFormat:@"%@:%@", minString, secondString]; } + +- (BOOL)isShow { + return _isShow; +} @end diff --git a/iOS/Demo/TXLiteAVDemo/BeautySettingKit/TCBeautyPanel/TCBeautyPanelView.m b/iOS/Demo/TXLiteAVDemo/BeautySettingKit/TCBeautyPanel/TCBeautyPanelView.m index cce1c16f..6c3531f3 100644 --- a/iOS/Demo/TXLiteAVDemo/BeautySettingKit/TCBeautyPanel/TCBeautyPanelView.m +++ b/iOS/Demo/TXLiteAVDemo/BeautySettingKit/TCBeautyPanel/TCBeautyPanelView.m @@ -122,7 +122,7 @@ @interface TCBeautyPanel() @property (nonatomic, strong) UISlider *slider; ///< 数值调节滑杆 @property (nonatomic, strong) NSURLSessionDownloadTask *operation; ///< 资源下载 @property (nonatomic, assign) TCBeautyStyle beautyStyle; - +@property (nonatomic, assign) NSString *pituName; @end @implementation TCBeautyPanel @@ -626,8 +626,9 @@ - (void)onSetMotionWithIndex:(NSInteger)index if (index == 0){ [self.actionPerformer setMotionTmpl:nil inDir:localPackageDir]; } else{ - TCBeautyPanelItem *item = _optionsContainer[_menu.menuIndex][_menu.optionIndex]; + TCBeautyPanelItem *item = _optionsContainer[_menu.menuIndex][_menu.optionIndex]; TCPituMotion *motion = item.userInfo; + self.pituName = motion.identifier; NSString *pituPath = [NSString stringWithFormat:@"%@/%@", localPackageDir, motion.identifier]; if ([[NSFileManager defaultManager] fileExistsAtPath:pituPath]) { [self.actionPerformer setMotionTmpl:motion.identifier inDir:localPackageDir]; @@ -710,6 +711,10 @@ - (void)URLSession:(NSURLSession *)session } if (unzipSuccess) { [self.pituDelegate onLoadPituFinished]; + if (![self.pituName isEqualToString:pituName]) { + return; + } + if ([self.actionPerformer respondsToSelector:@selector(setMotionTmpl:inDir:)]) { [self.actionPerformer setMotionTmpl:pituName inDir:pituDir]; } diff --git a/iOS/Demo/TXLiteAVDemo/LiveLinkMicDemoOld/LiveRoom/MLVBLiveRoom.m b/iOS/Demo/TXLiteAVDemo/LiveLinkMicDemoOld/LiveRoom/MLVBLiveRoom.m index 42c47869..2561877c 100644 --- a/iOS/Demo/TXLiteAVDemo/LiveLinkMicDemoOld/LiveRoom/MLVBLiveRoom.m +++ b/iOS/Demo/TXLiteAVDemo/LiveLinkMicDemoOld/LiveRoom/MLVBLiveRoom.m @@ -65,6 +65,7 @@ @interface MLVBLiveRoom() *_roomList; // 保存最近一次拉回的房间列表,这里仅仅使用里面的房间混流地址和创建者信息 NSMutableArray *_audienceList; // 保存最近一次拉回的房间观众列表 AFHTTPSessionManager *_httpSession; + AFNetworkReachabilityManager *_reachabilityManager; NSString *_serverDomain; // 保存业务服务器域名 NSMutableDictionary *_apiAddr; // 保存业务服务器相关的rest api @@ -137,13 +138,14 @@ - (instancetype)initInternal { _roomInfo = [[MLVBRoomInfo alloc] init]; _audienceList = [[NSMutableArray alloc] init]; _httpSession = [AFHTTPSessionManager manager]; + _reachabilityManager = [AFNetworkReachabilityManager sharedManager]; + [_reachabilityManager startMonitoring]; [_httpSession setRequestSerializer:[AFJSONRequestSerializer serializer]]; [_httpSession setResponseSerializer:[AFJSONResponseSerializer serializer]]; [_httpSession.requestSerializer willChangeValueForKey:@"timeoutInterval"]; _httpSession.requestSerializer.timeoutInterval = 5.0; [_httpSession.requestSerializer didChangeValueForKey:@"timeoutInterval"]; _httpSession.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html", @"text/xml", @"text/plain", nil]; - _queue = dispatch_queue_create("LiveRoomQueue", DISPATCH_QUEUE_SERIAL); [_httpSession setCompletionQueue:_queue]; @@ -1315,7 +1317,6 @@ - (void)startPlayAcc:(MLVBAnchorInfo *)anchor inView:(UIView *)view playBegin:(I - (void)handleUpdatedAnchorList:(NSArray *)updatedAnchorList { NSArray* oldAnchorList = _roomInfo.anchorInfoArray; - NSMutableSet *leftAnchorSet = [[NSMutableSet alloc] initWithArray:oldAnchorList]; NSSet *updatedAnchorSet = [NSSet setWithArray:updatedAnchorList]; if ([updatedAnchorSet isEqualToSet:leftAnchorSet]) { @@ -1608,7 +1609,14 @@ - (void)getUrlAndPushing:(void(^)(int errCode, NSString *errMsg))completion { */ - (void)_updateAnchorList:(void (^)(int errCode, NSString *errMsg, NSArray *anchorList))completion { [self asyncRun:^(MLVBLiveRoom *self) { - NSDictionary *params = @{@"roomID": self.roomInfo.roomID}; + NSDictionary *params; + if (self.roomInfo == nil || self.roomInfo.roomID == nil) { + if (completion) { + completion(-1, @"roomID is nil", nil); + } + } else { + params = @{@"roomID": self.roomInfo.roomID}; + } [self requestWithName:kHttpServerAddr_GetAnchors params:params completion:^(MLVBLiveRoom *self, int errCode, NSString *errMsg, NSDictionary *responseObject) { if (errCode == 0) { NSArray * anchorList = [self parseAnchorsFromJsonArray:responseObject[@"pushers"]]; @@ -2008,8 +2016,47 @@ - (void)onRecvPKFinishRequest:(NSString *)roomID userID:(NSString *)userID { } - (void)updateAnchorList { - [self _updateAnchorList:^(int errCode, NSString *errMsg, NSArray *updatedAnchorList) { - [self handleUpdatedAnchorList:updatedAnchorList]; + if ([_reachabilityManager networkReachabilityStatus] == AFNetworkReachabilityStatusNotReachable) { + //无网状态时需要情况之前的小主播列表,待有网时重新请求当前房间的小主播列表,否则不会更新小主播UI窗口 + _roomInfo.anchorInfoArray = @[]; + __weak __typeof(self)weakSelf = self; + [self startNetworkReachability:^(BOOL hasNetwork) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + if (hasNetwork) { + [strongSelf _updateAnchorList:^(int errCode, NSString *errMsg, NSArray *updatedAnchorList) { + [strongSelf handleUpdatedAnchorList:updatedAnchorList]; + }]; + } else { + [strongSelf updateAnchorList]; + } + }]; + } else { + __weak __typeof(self)weakSelf = self; + [self _updateAnchorList:^(int errCode, NSString *errMsg, NSArray *updatedAnchorList) { + __strong __typeof(weakSelf)strongSelf = weakSelf; + [strongSelf handleUpdatedAnchorList:updatedAnchorList]; + }]; + } +} + +- (void)startNetworkReachability:(void (^)(BOOL hasNetwork)) block { + [_reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + switch (status) { + case AFNetworkReachabilityStatusUnknown: + block(false); + break; + case AFNetworkReachabilityStatusNotReachable: + block(false); + break; + case AFNetworkReachabilityStatusReachableViaWWAN: + block(true); + break; + case AFNetworkReachabilityStatusReachableViaWiFi: + block(true); + break; + default: + break; + } }]; } diff --git a/iOS/Demo/TXLiteAVDemo/LivePlayerDemo/PlayViewController.m b/iOS/Demo/TXLiteAVDemo/LivePlayerDemo/PlayViewController.m index be6b4471..dedcb728 100644 --- a/iOS/Demo/TXLiteAVDemo/LivePlayerDemo/PlayViewController.m +++ b/iOS/Demo/TXLiteAVDemo/LivePlayerDemo/PlayViewController.m @@ -5,6 +5,7 @@ */ #import "PlayViewController.h" +#import "V2TXLivePlayer.h" #import "TXLivePlayer.h" #import "AppDelegate.h" #import "ScanQRController.h" @@ -17,6 +18,8 @@ #import "NSString+Common.h" #define PLAY_URL @"LivePlayerDemo.PlayViewController.pleaseenterorscantheqrcode" +#define V2Log(_format_, ...) \ + NSLog(@"[%@ %p %s %d] %@", NSStringFromClass(self.class), self, __func__, __LINE__, [NSString stringWithFormat:_format_, ##__VA_ARGS__]); #define CACHE_TIME_FAST 1.0f #define CACHE_TIME_SMOOTH 5.0f @@ -32,7 +35,7 @@ @interface ToastTextView : UITextView @end @interface PlayViewController() < - TXLivePlayListener, + V2TXLivePlayerObserver, AddressBarControllerDelegate, ScanQRDelegate, UITextFieldDelegate @@ -43,15 +46,9 @@ @interface PlayViewController() < UIImageView *_loadingImageView; // 菊花 UIView *_videoView; // 视频画面 TX_Enum_PlayType _playType; // 播放类型 - - UIView *_cacheStrategyView; // 延时调整选项面板 - UIButton *_radioBtnFast; // 急速 - UIButton *_radioBtnSmooth; // 流畅 - UIButton *_radioBtnAuto; // 自动 - + UIButton *_btnPlay; // 开始/停止播放 UIButton *_btnLog; // 显示日志 - UIButton *_btnHW; // 开启硬件加速 UIButton *_btnPortrait; // 横屏/竖屏 UIButton *_btnRenderMode; // 渲染模式:(a) 图像铺满屏幕,不留黑边 (b) 图像适应屏幕,保持画面完整 UIButton *_btnStrategy; // 播放缓存策略(延时调整) @@ -60,7 +57,7 @@ @interface PlayViewController() < NSString *_addressBeforeSwith; // 切换低延时前的地址 } -@property (nonatomic, strong) TXLivePlayer *player; +@property (nonatomic, strong) V2TXLivePlayer *player; @property (nonatomic, strong) NSString *playUrl; @end @@ -75,15 +72,8 @@ - (void)viewDidLoad { [super viewDidLoad]; // 创建播放器 - _player = [[TXLivePlayer alloc] init]; - - TXLivePlayConfig* config = _player.config; - // 开启 flvSessionKey 数据回调 - //config.flvSessionKey = @"X-Tlive-SpanId"; - // 允许接收消息 - config.enableMessage = YES; - [_player setConfig:config]; - + _player = [[V2TXLivePlayer alloc] init]; + // 界面布局 [self initUI]; if (@available(iOS 13.0, *)) { @@ -105,16 +95,18 @@ - (void)initUI { self.title = LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.livestreamingplayer"); [self.view setBackgroundImage:[UIImage imageNamed:@"background"]]; - int buttonCount = 7; // 底部一排按钮的数量 + int buttonCount = 4; // 底部一排按钮的数量 CGSize size = [[UIScreen mainScreen] bounds].size; - int ICON_SIZE = size.width / (buttonCount + 1); + int ICON_WITH = size.width / (buttonCount + 1); + ICON_WITH = MIN(ICON_WITH, 40); /// 最大40*40 + int ICON_HEIGHT = ICON_WITH; // 设置推流地址输入、二维码扫描工具栏 _addressBarController = [[AddressBarController alloc] initWithButtonOption:AddressBarButtonOptionQRScan]; _addressBarController.qrPresentView = self.view; CGFloat topOffset = [UIApplication sharedApplication].statusBarFrame.size.height; topOffset += (self.navigationController.navigationBar.height + 5); - _addressBarController.view.frame = CGRectMake(10, topOffset, self.view.width-20, ICON_SIZE); + _addressBarController.view.frame = CGRectMake(10, topOffset, self.view.width-20, ICON_HEIGHT); NSDictionary *dic = @{NSForegroundColorAttributeName:[UIColor blackColor], NSFontAttributeName:[UIFont systemFontOfSize:[NSString isCurrentLanguageEnglish] ? 13 : 15]}; _addressBarController.view.textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:LivePlayerLocalize(PLAY_URL) attributes:dic]; _addressBarController.delegate = self; @@ -125,26 +117,22 @@ - (void)initUI { // 创建底部的功能按钮 float startSpace = 12; - float centerInterVal = (size.width - 2 * startSpace - ICON_SIZE) / (buttonCount - 1); - float iconY = size.height - ICON_SIZE / 2 - 10; + float centerInterVal = (size.width - 2 * startSpace - ICON_WITH) / (buttonCount - 1); + float iconY = size.height - ICON_HEIGHT / 2 - 10; if (@available(iOS 11, *)) { iconY -= [UIApplication sharedApplication].keyWindow.safeAreaInsets.bottom; } + int index = 0; + CGSize iconSize = CGSizeMake(ICON_WITH, ICON_HEIGHT); _btnPlay = [self createButton:@"start" action:@selector(clickPlay:) - center:CGPointMake(startSpace + ICON_SIZE / 2, iconY) size:ICON_SIZE]; + center:CGPointMake(startSpace + ICON_WITH / 2 + centerInterVal*index++, iconY) size:iconSize]; _btnLog = [self createButton:@"log" action:@selector(clickLog:) - center:CGPointMake(startSpace + ICON_SIZE / 2 + centerInterVal, iconY) size:ICON_SIZE]; - _btnHW = [self createButton:@"quick2" action:@selector(clickHW:) - center:CGPointMake(startSpace + ICON_SIZE / 2 + centerInterVal * 2, iconY) size:ICON_SIZE]; + center:CGPointMake(startSpace + ICON_WITH / 2 + centerInterVal*index++, iconY) size:iconSize]; _btnPortrait = [self createButton:@"portrait" action:@selector(clickPortrait:) - center:CGPointMake(startSpace + ICON_SIZE / 2 + centerInterVal * 3, iconY) size:ICON_SIZE]; + center:CGPointMake(startSpace + ICON_WITH / 2 + centerInterVal*index++, iconY) size:iconSize]; _btnRenderMode = [self createButton:@"fill" action:@selector(clickRenderMode:) - center:CGPointMake(startSpace + ICON_SIZE / 2 + centerInterVal * 4, iconY) size:ICON_SIZE]; - _btnStrategy = [self createButton:@"cache_time" action:@selector(clickStrategy:) - center:CGPointMake(startSpace + ICON_SIZE / 2 + centerInterVal * 5, iconY) size:ICON_SIZE]; - _btnRealtime = [self createButton:@"jisu_off" action:@selector(clickRealtime:) - center:CGPointMake(startSpace + ICON_SIZE / 2 + centerInterVal * 6, iconY) size:ICON_SIZE]; + center:CGPointMake(startSpace + ICON_WITH / 2 + centerInterVal*index++, iconY) size:iconSize]; // 菊花 float width = 34; @@ -157,10 +145,6 @@ - (void)initUI { _loadingImageView.animationDuration = 1; _loadingImageView.hidden = YES; - // 延时调整选项面板 - [self addCacheStrategyView]; - [self setCacheStrategy:CACHE_STRATEGY_AUTO]; // 默认自动 - // 视频画面显示 CGRect videoFrame = self.view.bounds; _videoView = [[UIView alloc] initWithFrame:CGRectMake(videoFrame.size.width, 0, videoFrame.size.width, videoFrame.size.height)]; @@ -170,10 +154,10 @@ - (void)initUI { _addressBarController.text = @"http://liteavapp.qcloud.com/live/liteavdemoplayerstreamid.flv"; } -- (UIButton *)createButton:(NSString*)icon action:(SEL)action center:(CGPoint)center size:(int)size { +- (UIButton *)createButton:(NSString*)icon action:(SEL)action center:(CGPoint)center size:(CGSize)size { UIButton * btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.center = center; - btn.bounds = CGRectMake(0, 0, size, size); + btn.bounds = CGRectMake(0, 0, size.width, size.height); btn.tag = 0; // 用这个来记录按钮的状态,默认0 [btn setImage:[UIImage imageNamed:icon] forState:UIControlStateNormal]; [btn addTarget:self action:action forControlEvents:UIControlEventTouchUpInside]; @@ -181,47 +165,6 @@ - (UIButton *)createButton:(NSString*)icon action:(SEL)action center:(CGPoint)ce return btn; } -- (void)addCacheStrategyView { - CGSize size = [[UIScreen mainScreen] bounds].size; - UIView *sView = [[UIView alloc]init]; - - sView.frame = CGRectMake(0, size.height - 120, size.width, 120); - [sView setBackgroundColor:[UIColor whiteColor]]; - - UILabel *title= [[UILabel alloc]init]; - title.frame = CGRectMake(0, 0, size.width, 50); - [title setText:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.delayadjustment")]; - title.textAlignment = NSTextAlignmentCenter; - [title setFont:[UIFont fontWithName:@"" size:14]]; - - [sView addSubview:title]; - - int gap = 30; - int width2 = (size.width - gap*2 - 20) / 3; - _radioBtnFast = [UIButton buttonWithType:UIButtonTypeCustom]; - _radioBtnFast.frame = CGRectMake(10, 60, width2, 40); - [_radioBtnFast setTitle:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.speed") forState:UIControlStateNormal]; - [_radioBtnFast addTarget:self action:@selector(onAdjustFast:) forControlEvents:UIControlEventTouchUpInside]; - - _radioBtnSmooth = [UIButton buttonWithType:UIButtonTypeCustom]; - _radioBtnSmooth.frame = CGRectMake(10 + gap + width2, 60, width2, 40); - [_radioBtnSmooth setTitle:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.smooth") forState:UIControlStateNormal]; - [_radioBtnSmooth addTarget:self action:@selector(onAdjustSmooth:) forControlEvents:UIControlEventTouchUpInside]; - - _radioBtnAuto = [UIButton buttonWithType:UIButtonTypeCustom]; - _radioBtnAuto.frame = CGRectMake(size.width - 10 - width2, 60, width2, 40); - [_radioBtnAuto setTitle:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.auto") forState:UIControlStateNormal]; - [_radioBtnAuto addTarget:self action:@selector(onAdjustAuto:) forControlEvents:UIControlEventTouchUpInside]; - - [sView addSubview:_radioBtnFast]; - [sView addSubview:_radioBtnSmooth]; - [sView addSubview:_radioBtnAuto]; - sView.hidden = YES; - - _cacheStrategyView = sView; - [self.view addSubview:_cacheStrategyView]; -} - #pragma mark - 控件响应函数 - (void)clickPlay:(UIButton *)btn { @@ -245,57 +188,29 @@ - (void)clickPlay:(UIButton *)btn { - (void)clickLog:(UIButton *)btn { if (_btnLog.tag == 0) { - [_player setLogViewMargin:UIEdgeInsetsMake(120, 10, 60, 10)]; - [_player showVideoDebugLog:YES]; + [_player showDebugView:YES]; [_btnLog setImage:[UIImage imageNamed:@"log2"] forState:UIControlStateNormal]; _btnLog.tag = 1; } else { - [_player setLogViewMargin:UIEdgeInsetsMake(120, 10, 60, 10)]; - [_player showVideoDebugLog:NO]; - + [_player showDebugView:NO]; + [_btnLog setImage:[UIImage imageNamed:@"log"] forState:UIControlStateNormal]; _btnLog.tag = 0; } } -- (void)clickHW:(UIButton *)btn { - if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0) { - [self toastTip:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.iosversionbelow")]; - return; - } - - if (_btnPlay.tag == 1) { - [_player stopPlay]; - } - - _player.enableHWAcceleration = !_player.enableHWAcceleration; - BOOL isHW = _player.enableHWAcceleration; - [_btnHW setImage:[UIImage imageNamed:(isHW ? @"quick" : @"quick2")] forState:UIControlStateNormal]; - - if (_btnPlay.tag == 1) { - if (isHW) { - [self toastTip:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.switchtoharddecoding")]; - } - else { - [self toastTip:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.switchtosoftdecoding")]; - } - - [self startPlay]; - } -} - - (void)clickPortrait:(UIButton *)btn { if (_btnPortrait.tag == 1) { - [_player setRenderRotation:HOME_ORIENTATION_DOWN]; + [_player setRenderRotation:V2TXLiveRotation0]; [_btnPortrait setImage:[UIImage imageNamed:@"portrait"] forState:UIControlStateNormal]; _btnPortrait.tag = 0; } else { - [_player setRenderRotation:HOME_ORIENTATION_RIGHT]; - + [_player setRenderRotation:V2TXLiveRotation90]; + [_btnPortrait setImage:[UIImage imageNamed:@"landscape"] forState:UIControlStateNormal]; _btnPortrait.tag = 1; } @@ -303,55 +218,19 @@ - (void)clickPortrait:(UIButton *)btn { - (void)clickRenderMode:(UIButton *)btn { if (_btnRenderMode.tag == 1) { - [_player setRenderMode:RENDER_MODE_FILL_EDGE]; + [_player setRenderFillMode:V2TXLiveFillModeFit]; [_btnRenderMode setImage:[UIImage imageNamed:@"fill"] forState:UIControlStateNormal]; _btnRenderMode.tag = 0; } else { - [_player setRenderMode:RENDER_MODE_FILL_SCREEN]; - + [_player setRenderFillMode:V2TXLiveFillModeFill]; + [_btnRenderMode setImage:[UIImage imageNamed:@"adjust"] forState:UIControlStateNormal]; _btnRenderMode.tag = 1; } } -- (void)clickStrategy:(UIButton *)btn { - _cacheStrategyView.hidden = NO; - NSInteger cacheStrategy = _btnStrategy.tag; - switch (cacheStrategy) { - case CACHE_STRATEGY_FAST: - [_radioBtnFast setBackgroundImage:[UIImage imageNamed:@"black"] forState:UIControlStateNormal]; - [_radioBtnFast setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - [_radioBtnSmooth setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal]; - [_radioBtnSmooth setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - [_radioBtnAuto setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal]; - [_radioBtnAuto setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - break; - - case CACHE_STRATEGY_SMOOTH: - [_radioBtnFast setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal]; - [_radioBtnFast setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - [_radioBtnSmooth setBackgroundImage:[UIImage imageNamed:@"black"] forState:UIControlStateNormal]; - [_radioBtnSmooth setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - [_radioBtnAuto setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal]; - [_radioBtnAuto setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - break; - - case CACHE_STRATEGY_AUTO: - [_radioBtnFast setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal]; - [_radioBtnFast setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - [_radioBtnSmooth setBackgroundImage:[UIImage imageNamed:@"white"] forState:UIControlStateNormal]; - [_radioBtnSmooth setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; - [_radioBtnAuto setBackgroundImage:[UIImage imageNamed:@"black"] forState:UIControlStateNormal]; - [_radioBtnAuto setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; - break; - - default: - break; - } -} - - (void)clickRealtime:(UIButton *)btn { if (_btnRealtime.tag == 0) { [_btnRealtime setImage:[UIImage imageNamed:@"jisu_on"] forState:UIControlStateNormal]; @@ -386,7 +265,7 @@ -(BOOL)checkPlayUrl:(NSString*)playUrl { _playType = PLAY_TYPE_LIVE_FLV; } else if (([playUrl hasPrefix:@"https:"] || [playUrl hasPrefix:@"http:"]) && [playUrl rangeOfString:@".m3u8"].length > 0) { _playType = PLAY_TYPE_VOD_HLS; - } else{ + } else { [self toastTip:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.playaddressisnotlegal")]; return NO; } @@ -396,50 +275,27 @@ -(BOOL)checkPlayUrl:(NSString*)playUrl { } - (BOOL)startPlay { - CGRect frame = CGRectMake(self.view.bounds.size.width, 0, self.view.bounds.size.width, self.view.bounds.size.height); - _videoView.frame = frame; [_loadingImageView removeFromSuperview]; - NSString *playUrl = _addressBarController.text; - if (![self checkPlayUrl:playUrl]) { return NO; } - [_player setDelegate:self]; - [_player setupVideoWidget:CGRectZero containView:_videoView insertIndex:0]; - - - int ret = [_player startPlay:playUrl type:_playType]; - - frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); - [UIView animateWithDuration:0.4 animations:^{ - _videoView.frame = frame; - } completion:^(BOOL finished) { - [self.view addSubview:_loadingImageView]; - }]; + _videoView.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); + [_player setObserver:self]; + [_player setRenderView:_videoView]; + [self.view addSubview:_loadingImageView]; - if (ret != 0) { - NSLog(LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.playerstartfailed")); + V2TXLiveCode ret = [_player startPlay:playUrl]; + if (ret != V2TXLIVE_OK) { + NSLog(@"%@", LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.playerstartfailed")); return NO; } // 播放参数初始化 - if (_btnLog.tag == 0) { - [_player showVideoDebugLog:NO]; - } else { - [_player showVideoDebugLog:YES]; - } - if (_btnPortrait.tag == 0) { - [_player setRenderRotation:HOME_ORIENTATION_DOWN]; - } else { - [_player setRenderRotation:HOME_ORIENTATION_RIGHT]; - } - if (_btnRenderMode.tag == 0) { - [_player setRenderMode:RENDER_MODE_FILL_EDGE]; - } else { - [_player setRenderMode:RENDER_MODE_FILL_SCREEN]; - } + [_player showDebugView:(_btnLog.tag == 1)]; + [_player setRenderRotation:(_btnPortrait.tag == 0)?V2TXLiveRotation0:V2TXLiveRotation90]; + [_player setRenderFillMode:(_btnRenderMode.tag == 0)?V2TXLiveFillModeFit:V2TXLiveFillModeFill]; [self startLoadingAnimation]; _playUrl = playUrl; @@ -450,47 +306,12 @@ - (BOOL)startPlay { - (void)stopPlay { [self stopLoadingAnimation]; if (_player) { - [_player setDelegate:nil]; - [_player removeVideoWidget]; + [_player setObserver:nil]; + [_player setRenderView:nil]; [_player stopPlay]; } } -// 设置缓冲策略 -- (void)setCacheStrategy:(NSInteger)cacheStrategy { - if (_btnStrategy.tag == cacheStrategy) { - return; - } - _btnStrategy.tag = cacheStrategy; - - TXLivePlayConfig *config = _player.config; - switch (cacheStrategy) { - case CACHE_STRATEGY_FAST: - config.bAutoAdjustCacheTime = YES; - config.minAutoAdjustCacheTime = CACHE_TIME_FAST; - config.maxAutoAdjustCacheTime = CACHE_TIME_FAST; - [_player setConfig:config]; - break; - - case CACHE_STRATEGY_SMOOTH: - config.bAutoAdjustCacheTime = NO; - config.minAutoAdjustCacheTime = CACHE_TIME_SMOOTH; - config.maxAutoAdjustCacheTime = CACHE_TIME_SMOOTH; - [_player setConfig:config]; - break; - - case CACHE_STRATEGY_AUTO: - config.bAutoAdjustCacheTime = YES; - config.minAutoAdjustCacheTime = CACHE_TIME_FAST; - config.maxAutoAdjustCacheTime = CACHE_TIME_SMOOTH; - [_player setConfig:config]; - break; - - default: - break; - } -} - - (void)startLoadingAnimation { if (_loadingImageView != nil) { _loadingImageView.hidden = NO; @@ -505,82 +326,90 @@ - (void)stopLoadingAnimation { } } -- (void)onAdjustFast:(UIButton *)btn { - _cacheStrategyView.hidden = YES; - [self setCacheStrategy:CACHE_STRATEGY_FAST]; +/// 检查网络 +- (void)checkNet { + BOOL isWifi = [AFNetworkReachabilityManager sharedManager].reachableViaWiFi; + if (!isWifi) { + __weak __typeof(self) weakSelf = self; + [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + if (weakSelf.playUrl.length == 0) { + return; + } + if (status == AFNetworkReachabilityStatusReachableViaWiFi) { + UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" + message:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.changewifitosee") + preferredStyle:UIAlertControllerStyleAlert]; + [alert addAction:[UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.yes") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { + [alert dismissViewControllerAnimated:YES completion:nil]; + + // 先停止,再重新播放 + [weakSelf stopPlay]; + [weakSelf startPlay]; + }]]; + [alert addAction:[UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.no") style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { + [alert dismissViewControllerAnimated:YES completion:nil]; + }]]; + [weakSelf presentViewController:alert animated:YES completion:nil]; + } + }]; + } } -- (void)onAdjustSmooth:(UIButton *)btn { - _cacheStrategyView.hidden = YES; - [self setCacheStrategy:CACHE_STRATEGY_SMOOTH]; -} +#pragma mark - V2TXLivePlayerObserver -- (void)onAdjustAuto:(UIButton *)btn { - _cacheStrategyView.hidden = YES; - [self setCacheStrategy:CACHE_STRATEGY_AUTO]; +- (void)onAudioPlayStatusUpdate:(id)player status:(V2TXLivePlayStatus)status reason:(V2TXLiveStatusChangeReason)reason extraInfo:(NSDictionary *)extraInfo { + switch (status) { + case V2TXLivePlayStatusPlaying: + //self.hasRecvFirstFrame = YES; + [self stopLoadingAnimation]; + break; + case V2TXLivePlayStatusLoading: + [self startLoadingAnimation]; + break; + case V2TXLivePlayStatusStopped: + [self clickPlay:_btnPlay]; + break; + default: + break; + } } -#pragma mark - TXLivePlayListener - -- (void)onPlayEvent:(int)EvtID withParam:(NSDictionary *)param { - NSDictionary *dict = param; - - dispatch_async(dispatch_get_main_queue(), ^{ - if (EvtID == PLAY_EVT_PLAY_BEGIN) { +- (void)onVideoPlayStatusUpdate:(id)player status:(V2TXLivePlayStatus)status reason:(V2TXLiveStatusChangeReason)reason extraInfo:(NSDictionary *)extraInfo { + switch (status) { + case V2TXLivePlayStatusPlaying: + //self.hasRecvFirstFrame = YES; [self stopLoadingAnimation]; - - } else if (EvtID == PLAY_ERR_NET_DISCONNECT || EvtID == PLAY_EVT_PLAY_END) { - // 断开连接时,模拟点击一次关闭播放 - [self clickPlay:_btnPlay]; - - if (EvtID == PLAY_ERR_NET_DISCONNECT) { - NSString *msg = (NSString*)[dict valueForKey:EVT_MSG]; - [self toastTip:msg]; + if (reason == V2TXLiveStatusChangeReasonBufferingEnd) { + [self checkNet]; } - - } else if (EvtID == PLAY_EVT_PLAY_LOADING){ + break; + case V2TXLivePlayStatusLoading: [self startLoadingAnimation]; - - } else if (EvtID == PLAY_EVT_CONNECT_SUCC) { - BOOL isWifi = [AFNetworkReachabilityManager sharedManager].reachableViaWiFi; - if (!isWifi) { - __weak __typeof(self) weakSelf = self; - [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { - if (weakSelf.playUrl.length == 0) { - return; - } - if (status == AFNetworkReachabilityStatusReachableViaWiFi) { - UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" - message:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.changewifitosee") - preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.yes") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { - [alert dismissViewControllerAnimated:YES completion:nil]; - - // 先停止,再重新播放 - [weakSelf stopPlay]; - [weakSelf startPlay]; - }]]; - [alert addAction:[UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.no") style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { - [alert dismissViewControllerAnimated:YES completion:nil]; - }]]; - [weakSelf presentViewController:alert animated:YES completion:nil]; - } - }]; - } - } - else if (EvtID == PLAY_EVT_GET_MESSAGE) { - NSData *msgData = param[@"EVT_GET_MSG"]; - NSString *msg = [[NSString alloc] initWithData:msgData encoding:NSUTF8StringEncoding]; - [self toastTip:msg]; - } - /* - 7.2 新增 - else if (EvtID == PLAY_EVT_GET_FLVSESSIONKEY) { - //NSString *Msg = (NSString*)[dict valueForKey:EVT_MSG]; - //[self toastTip:[NSString stringWithFormat:@"event PLAY_EVT_GET_FLVSESSIONKEY: %@", Msg]]; - } - */ - }); + break; + default: + break; + } +} + +- (void)onPlayoutVolumeUpdate:(id)player + volume:(NSInteger)volume { + V2Log(@"volume:%ld", volume); +} + +- (void)onError:(id)player + code:(V2TXLiveCode)code + message:(NSString *)msg + extraInfo:(NSDictionary *)extraInfo { + [self stopPlay]; + V2Log(@"code:%ld msg:%@ extraInfo:%@", (long)code, msg, extraInfo); +} + +- (void)onWarning:(id)player code:(V2TXLiveCode)code message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo { + V2Log(@"code:%ld msg:%@ extraInfo:%@", (long)code, msg, extraInfo); +} + +- (void)onSnapshotComplete:(id)player image:(TXImage *)image { + V2Log(@"image:%@", image); } - (void)onNetStatus:(NSDictionary *)param { @@ -607,7 +436,6 @@ - (void)onScanResult:(NSString *)result { - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; - _cacheStrategyView.hidden = YES; } #pragma mark - 辅助函数 diff --git a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/CameraPushViewController.m b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/CameraPushViewController.m index 79f4f5f4..45b40af1 100644 --- a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/CameraPushViewController.m +++ b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/CameraPushViewController.m @@ -7,7 +7,7 @@ #import "CameraPushViewController.h" #import "PushSettingViewController.h" #import "PushMoreSettingViewController.h" -#import "TXLivePush.h" +#import "V2TXLivePusher.h" #import "UIView+Additions.h" #import "AppDelegate.h" #import "ScanQRController.h" @@ -24,24 +24,15 @@ #import "AppLocalized.h" #import "NSString+Common.h" -#ifdef ENABLE_CUSTOM_MODE_AUDIO_CAPTURE -#import "CustomAudioFileReader.h" -#define CUSTOM_AUDIO_CAPTURE_SAMPLERATE 48000 -#define CUSTOM_AUDIO_CAPTURE_CHANNEL 1 -#endif - #define RTMP_PUBLISH_URL @"LivePusherDemo.CameraPush.pleaseinputthepushstream" @interface CameraPushViewController () < - TXLivePushListener, + V2TXLivePusherObserver, ScanQRDelegate, BeautyLoadPituDelegate, PushSettingDelegate, PushMoreSettingDelegate, AddressBarControllerDelegate, -#ifdef ENABLE_CUSTOM_MODE_AUDIO_CAPTURE - CustomAudioFileReaderDelegate, -#endif PushBgmControlDelegate, AudioEffectViewDelegate > @@ -67,7 +58,7 @@ @interface CameraPushViewController () < UIButton *_btnMoreSetting; // 更多设置 } -@property (nonatomic, strong) TXLivePush *pusher; +@property (nonatomic, strong) V2TXLivePusher *pusher; @property (nonatomic, strong) NSString *pushUrl; @property (nonatomic, strong) AudioEffectSettingView *audioEffectView; // 新BGM面板 @@ -101,7 +92,7 @@ - (void)viewDidLoad { // 创建推流器 _pusher = [self createPusher]; - + _isMute = [PushMoreSettingViewController isMuteAudio]; // 界面布局 [self initUI]; if (@available(iOS 13.0, *)) { @@ -135,34 +126,35 @@ - (void)viewDidDisappear:(BOOL)animated { - (void)onAppWillResignActive:(NSNotification *)notification { _appIsInActive = YES; - [_pusher pausePush]; + [_pusher startVirtualCamera:[UIImage imageNamed:@"background"]]; } - (void)onAppDidBecomeActive:(NSNotification *)notification { _appIsInActive = NO; if (!_appIsBackground && !_appIsInActive) { - if (![PushMoreSettingViewController isDisableVideo]) { - [_pusher resumePush]; - [_pusher setMute:_isMute]; - } + [_pusher stopVirtualCamera]; } } - (void)onAppDidEnterBackGround:(NSNotification *)notification { [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ - + [_pusher startVirtualCamera:[UIImage imageNamed:@"background"]]; }]; _appIsBackground = YES; - [_pusher pausePush]; } - (void)onAppWillEnterForeground:(NSNotification *)notification { _appIsBackground = NO; if (!_appIsBackground && !_appIsInActive) { - if (![PushMoreSettingViewController isDisableVideo]) { - [_pusher resumePush]; - [_pusher setMute:_isMute]; - } + [_pusher stopVirtualCamera]; + } +} + +- (void)pauseAudio:(BOOL)isMute { + if (isMute) { + [_pusher stopMicrophone]; + } else { + [_pusher startMicrophone]; } } @@ -273,72 +265,27 @@ - (UIButton *)createButton:(NSString*)icon action:(SEL)action center:(CGPoint)ce } // 创建推流器,并使用本地配置初始化它 -- (TXLivePush *)createPusher { - // config初始化 - TXLivePushConfig *config = [[TXLivePushConfig alloc] init]; - config.pauseFps = 10; - config.pauseTime = 300; - config.pauseImg = [UIImage imageNamed:@"pause_publish"]; - config.touchFocus = [PushMoreSettingViewController isEnableTouchFocus]; - config.enableZoom = [PushMoreSettingViewController isEnableVideoZoom]; - config.enablePureAudioPush = [PushMoreSettingViewController isEnablePureAudioPush]; - config.enableAudioPreview = [PushSettingViewController getEnableAudioPreview]; +- (V2TXLivePusher *)createPusher { + // 推流器初始化 + V2TXLivePusher *pusher = [[V2TXLivePusher alloc] initWithLiveMode:V2TXLiveMode_RTMP]; + [pusher.getDeviceManager enableCameraTorch:[PushMoreSettingViewController isOpenTorch]]; + [pusher setEncoderMirror:[PushMoreSettingViewController isMirrorVideo]]; + [self pauseAudio:[PushMoreSettingViewController isMuteAudio]]; + [pusher setVideoQuality:[PushSettingViewController getVideoQuality] + resolutionMode:V2TXLiveVideoResolutionModePortrait]; + [pusher setRenderRotation:V2TXLiveRotation0]; + [pusher setProperty:@"setDebugViewMargin" value:@{ + @"top":@(120), + @"left":@(10), + @"bottom":@(60), + @"right":@(10) + }]; + [pusher showDebugView:[PushMoreSettingViewController isShowDebugLog]]; NSInteger audioQuality = [PushSettingViewController getAudioQuality]; - switch (audioQuality) { - case 2: - // 音乐音质,采样率48000 - config.audioChannels = 2; - config.audioSampleRate = AUDIO_SAMPLE_RATE_48000; - break; - case 1: - // 标准音质,采样率48000 - config.audioChannels = 1; - config.audioSampleRate = AUDIO_SAMPLE_RATE_48000; - break; - case 0: - // 语音音质,采样率16000 - config.audioChannels = 1; - config.audioSampleRate = AUDIO_SAMPLE_RATE_16000; - break; - default: - break; - } - config.frontCamera = _btnCamera.tag == 0 ? YES : NO; + [pusher setAudioQuality:audioQuality]; if ([PushMoreSettingViewController isEnableWaterMark]) { - config.watermark = [UIImage imageNamed:@"watermark"]; - config.watermarkPos = CGPointMake(10, 10); + [pusher setWatermark:[UIImage imageNamed:@"watermark"] x:0.05 y:0.05 scale:1]; } - // 推流器初始化 - TXLivePush *pusher = [[TXLivePush alloc] initWithConfig:config]; - [pusher toggleTorch:[PushMoreSettingViewController isOpenTorch]]; - [pusher setMirror:[PushMoreSettingViewController isMirrorVideo]]; - [pusher setMute:[PushMoreSettingViewController isMuteAudio]]; - [pusher setVideoQuality:[PushSettingViewController getVideoQuality] adjustBitrate:[PushSettingViewController getBandWidthAdjust] adjustResolution:NO]; - -#ifdef ENABLE_CUSTOM_MODE_AUDIO_CAPTURE - config.enableAEC = NO; - config.customModeType = CUSTOM_MODE_AUDIO_CAPTURE; - config.audioSampleRate = CUSTOM_AUDIO_CAPTURE_SAMPLERATE; - config.audioChannels = CUSTOM_AUDIO_CAPTURE_CHANNEL; -#endif - - // 修改软硬编需要在setVideoQuality之后设置config.enableHWAcceleration - config.enableHWAcceleration = [PushSettingViewController getEnableHWAcceleration]; - - // 横屏推流需要先设置config.homeOrientation = HOME_ORIENTATION_RIGHT,然后再[pusher setRenderRotation:90] - config.homeOrientation = ([PushMoreSettingViewController isHorizontalPush] ? HOME_ORIENTATION_RIGHT : HOME_ORIENTATION_DOWN); - if ([PushMoreSettingViewController isHorizontalPush]) { - [pusher setRenderRotation:90]; - } else { - [pusher setRenderRotation:0]; - } - - [pusher setLogViewMargin:UIEdgeInsetsMake(120, 10, 60, 10)]; - [pusher showVideoDebugLog:[PushMoreSettingViewController isShowDebugLog]]; - [pusher setEnableClockOverlay:[PushMoreSettingViewController isEnableDelayCheck]]; - - [pusher setConfig:config]; - return pusher; } @@ -369,12 +316,12 @@ - (void)clickCamera:(UIButton *)btn { btn.enabled = YES; }); if (_btnCamera.tag == 0) { - [_pusher switchCamera]; + [_pusher.getDeviceManager switchCamera:NO]; _btnCamera.tag = 1; [_btnCamera setImage:[UIImage imageNamed:@"mlvb_camera_back"] forState:UIControlStateNormal]; } else { - [_pusher switchCamera]; + [_pusher.getDeviceManager switchCamera:YES]; _btnCamera.tag = 0; [_btnCamera setImage:[UIImage imageNamed:@"mlvb_camera_front"] forState:UIControlStateNormal]; } @@ -383,6 +330,13 @@ - (void)clickCamera:(UIButton *)btn { - (void)clickBeauty:(UIButton *)btn { _beautyPanel.hidden = NO; [self hideToolButtons:YES]; + if (_moreSettingVC) { + [_moreSettingVC willMoveToParentViewController:self]; + [_moreSettingVC.view removeFromSuperview]; + [_moreSettingVC removeFromParentViewController]; + _moreSettingVC.delegate = nil; + _moreSettingVC = nil; + } } - (void)clickBgm:(UIButton *)btn { @@ -410,7 +364,7 @@ - (void)clickSetting:(UIButton *)btn { - (void)clickMoreSetting:(UIButton *)btn { if (!_moreSettingVC) { _moreSettingVC = [[PushMoreSettingViewController alloc] init]; - [_moreSettingVC setDelegate:self]; + _moreSettingVC.delegate = self; [self addChildViewController:_moreSettingVC]; _moreSettingVC.view.frame = CGRectMake(0, self.view.height * 0.2, self.view.width, self.view.height * 0.7); @@ -422,8 +376,7 @@ - (void)clickMoreSetting:(UIButton *)btn { [_moreSettingVC willMoveToParentViewController:self]; [_moreSettingVC.view removeFromSuperview]; [_moreSettingVC removeFromParentViewController]; - - [_moreSettingVC setDelegate:nil]; + _moreSettingVC.delegate = nil; _moreSettingVC = nil; } } @@ -443,7 +396,15 @@ - (void)hideToolButtons:(BOOL)hide { - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.view endEditing:YES]; _beautyPanel.hidden = YES; - [self hideToolButtons:NO]; + UITouch *touch = [touches.allObjects lastObject]; + BOOL result = [touch.view isDescendantOfView:_audioEffectView]; + if (!result) { + [_audioEffectView hide]; + } + if (![_audioEffectView isShow]) { + [self hideToolButtons:NO]; + } + } #pragma mark - 推流逻辑 @@ -474,26 +435,23 @@ - (BOOL)startPush { return NO; } - // 还原设置 - [PushMoreSettingViewController setDisableVideo:NO]; - // 设置delegate - [_pusher setDelegate:self]; + [_pusher setObserver:self]; // 开启预览 - [_pusher startPreview:_localView]; - -#ifdef ENABLE_CUSTOM_MODE_AUDIO_CAPTURE - [CustomAudioFileReader sharedInstance].delegate = self; - [[CustomAudioFileReader sharedInstance] start:CUSTOM_AUDIO_CAPTURE_SAMPLERATE - channels:CUSTOM_AUDIO_CAPTURE_CHANNEL - framLenInSample:1024]; -#endif + [_pusher setRenderView:_localView]; + [_pusher startCamera:_btnCamera.tag == 0]; + + if (_isMute) { + [_pusher stopMicrophone]; + } else { + [_pusher startMicrophone]; + } // 开始推流 - int ret = [_pusher startPush:rtmpUrl]; - if (ret != 0) { - [self toastTip:[NSString stringWithFormat:@"%@: %d",LivePlayerLocalize(@"LivePusherDemo.CameraPush.thethrusterfailedtostart"), ret]]; + V2TXLiveCode ret = [_pusher startPush:rtmpUrl]; + if (ret != V2TXLIVE_OK) { + [self toastTip:[NSString stringWithFormat:@"%@: %ld",LivePlayerLocalize(@"LivePusherDemo.CameraPush.thethrusterfailedtostart"), (long)ret]]; NSLog(@"%@",LivePlayerLocalize(@"LivePusherDemo.CameraPush.thethrusterfailedtostart")); return NO; } @@ -506,14 +464,10 @@ - (BOOL)startPush { - (void)stopPush { if (_pusher) { - [_pusher setDelegate:nil]; - [_pusher stopPreview]; + [_pusher setObserver:nil]; + [_pusher setRenderView:nil]; [_pusher stopPush]; } -#ifdef ENABLE_CUSTOM_MODE_AUDIO_CAPTURE - [[CustomAudioFileReader sharedInstance] stop]; - [CustomAudioFileReader sharedInstance].delegate = nil; -#endif } #pragma mark - HUD @@ -525,6 +479,7 @@ - (void)showInProgressText:(NSString *)text } hud.mode = MBProgressHUDModeIndeterminate; hud.label.text = text; + hud.userInteractionEnabled = NO; [hud showAnimated:YES]; } @@ -537,8 +492,6 @@ - (void)showText:(NSString *)text withDetailText:(NSString *)detail { hud.mode = MBProgressHUDModeText; hud.label.text = text; hud.detailsLabel.text = detail; - [hud.button addTarget:self action:@selector(onCloseHUD:) forControlEvents:UIControlEventTouchUpInside]; - [hud.button setTitle:LivePlayerLocalize(@"LivePusherDemo.CameraPush.off") forState:UIControlStateNormal]; [hud showAnimated:YES]; [hud hideAnimated:YES afterDelay:2]; } @@ -547,6 +500,34 @@ - (void)onCloseHUD:(id)sender { [[MBProgressHUD HUDForView:self.view] hideAnimated:YES]; } +- (void)checkNet { + BOOL isWifi = [AFNetworkReachabilityManager sharedManager].reachableViaWiFi; + if (!isWifi) { + __weak __typeof(self) weakSelf = self; + [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { + if (weakSelf.pushUrl.length == 0) { + return; + } + if (status == AFNetworkReachabilityStatusReachableViaWiFi) { + UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" + message:LivePlayerLocalize(@"LivePusherDemo.CameraPush.changetowifipushstream") + preferredStyle:UIAlertControllerStyleAlert]; + [alert addAction:[UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.yes") style:UIAlertActionStyleDefault handler:^(UIAlertAction *_Nonnull action) { + [alert dismissViewControllerAnimated:YES completion:nil]; + + // 先暂停,再重新推流 + [self stopPush]; + [self startPush]; + }]]; + [alert addAction:[UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.no") style:UIAlertActionStyleCancel handler:^(UIAlertAction *_Nonnull action) { + [alert dismissViewControllerAnimated:YES completion:nil]; + }]]; + [weakSelf presentViewController:alert animated:YES completion:nil]; + } + }]; + } +} + #pragma mark - AddressBarControllerDelegate // 从业务后台获取推流地址 - (void)addressBarControllerTapCreateURL:(AddressBarController *)controller { @@ -601,73 +582,71 @@ - (void)onScanResult:(NSString *)result { _addressBarController.text = result; } -#pragma mark - TXLivePushListener +#pragma mark - V2TXLivePusherObserver -- (void)onPushEvent:(int)evtID withParam:(NSDictionary *)param { - dispatch_async(dispatch_get_main_queue(), ^{ - if (evtID == PUSH_ERR_NET_DISCONNECT || evtID == PUSH_ERR_INVALID_ADDRESS) { - // 断开连接时,模拟点击一次关闭推流 - [self clickPush:self->_btnPush]; - - } else if (evtID == PUSH_ERR_OPEN_CAMERA_FAIL) { - [self clickPush:self->_btnPush]; - [self toastTip:LivePlayerLocalize(@"LiveLinkMicDemoOld.MLVBLiveRoom.failedtogetcamerapermission")]; - - } else if (evtID == PUSH_EVT_OPEN_CAMERA_SUCC) { - [self.pusher toggleTorch:[PushMoreSettingViewController isOpenTorch]]; +- (void)onError:(V2TXLiveCode)code + message:(NSString *)msg + extraInfo:(NSDictionary *)extraInfo { + if (code == V2TXLIVE_ERROR_REQUEST_TIMEOUT) { + [self toastTip:LivePlayerLocalize(@"LiveLinkMicDemoOld.MLVBLiveRoom.networktimeout")]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self stopPush]; + }); + } +} - } else if (evtID == PUSH_ERR_OPEN_MIC_FAIL) { - [self clickPush:self->_btnPush]; - [self toastTip:LivePlayerLocalize(@"LiveLinkMicDemoOld.MLVBLiveRoom.failedtogetmicrophonepermission")]; - - } else if (evtID == PUSH_EVT_CONNECT_SUCC) { - [self.pusher setMute:[PushMoreSettingViewController isMuteAudio]]; - [self.pusher showVideoDebugLog:[PushMoreSettingViewController isShowDebugLog]]; - [self.pusher setMirror:[PushMoreSettingViewController isMirrorVideo]]; - BOOL isWifi = [AFNetworkReachabilityManager sharedManager].reachableViaWiFi; - if (!isWifi) { - __weak __typeof(self) weakSelf = self; - [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { - if (weakSelf.pushUrl.length == 0) { - return; - } - if (status == AFNetworkReachabilityStatusReachableViaWiFi) { - UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"" - message:LivePlayerLocalize(@"LivePusherDemo.CameraPush.changetowifipushstream") - preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.yes") style:UIAlertActionStyleDefault handler:^(UIAlertAction *_Nonnull action) { - [alert dismissViewControllerAnimated:YES completion:nil]; - - // 先暂停,再重新推流 - [weakSelf.pusher stopPush]; - [weakSelf.pusher startPush:weakSelf.pushUrl]; - }]]; - [alert addAction:[UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePlayerDemo.PlayViewController.no") style:UIAlertActionStyleCancel handler:^(UIAlertAction *_Nonnull action) { - [alert dismissViewControllerAnimated:YES completion:nil]; - }]]; - [weakSelf presentViewController:alert animated:YES completion:nil]; - } - }]; - } - } else if (evtID == PUSH_WARNING_NET_BUSY) { - [self->_notification displayNotificationWithMessage:LivePlayerLocalize(@"LivePusherDemo.CameraPush.currentnetworkenvironmentisnotgood") forDuration:5]; - } - - // log - [self->_logView setPushEvent:evtID withParam:param]; - }); +- (void)onWarning:(V2TXLiveCode)code + message:(NSString *)msg + extraInfo:(NSDictionary *)extraInfo { + NSLog(@"code:%ld, msg:%@, extraInfo:%@", (long)code, msg, extraInfo); } -- (void)onNetStatus:(NSDictionary *)param { +- (void)onCaptureFirstAudioFrame { + NSLog(@"onCaptureFirstAudioFrame"); +} + +- (void)onCaptureFirstVideoFrame { + NSLog(@"onCaptureFirstVideoFrame"); +} + +- (void)onMicrophoneVolumeUpdate:(NSInteger)volume { + NSLog(@"volume:%ld", (long)volume); +} + +- (void)onStatisticsUpdate:(V2TXLivePusherStatistics *)statistics { // 这里可以上报相关推流信息到业务服务器 // 比如:码率,分辨率,帧率,cpu使用,缓存等信息 // 字段请在TXLiveSDKTypeDef.h中定义 - + NSDictionary *param = @{ + @"CPU_USAGE" : @(statistics.systemCpu/100.0), + @"CPU_USAGE_DEVICE" : @(statistics.appCpu/100.0), + @"VIDEO_FPS" : @(statistics.fps), + @"VIDEO_WIDTH" : @(statistics.width), + @"VIDEO_HEIGHT" : @(statistics.height), + @"VIDEO_BITRATE" : @(statistics.videoBitrate), + @"AUDIO_BITRATE" : @(statistics.audioBitrate) + }; dispatch_async(dispatch_get_main_queue(), ^{ [self->_logView setNetStatus:param]; }); } +- (void)onPushStatusUpdate:(V2TXLivePushStatus)state message:(NSString *)msg extraInfo:(NSDictionary *)extraInfo { + if (state == V2TXLivePushStatusDisconnected) { + [self clickPush:self->_btnPush]; + } else if (state == V2TXLivePushStatusConnectSuccess) { + [self checkNet]; + } +} + +- (void)onSnapshotComplete:(TXImage *)img { + if (img != nil) { + NSArray *images = @[img]; + UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:images applicationActivities:nil]; + [self.navigationController presentViewController:vc animated:YES completion:nil]; + } +} + #pragma mark - AudioEffectViewDelegate -(void)onEffectViewHidden:(BOOL)isHidden { [self hideToolButtons:!isHidden]; @@ -700,156 +679,61 @@ - (void)onLoadPituFailed { } #pragma mark - PushSettingDelegate -// 是否开启带宽适应 -- (void)onPushSetting:(PushSettingViewController *)vc enableBandwidthAdjust:(BOOL)enableBandwidthAdjust { - [_pusher setVideoQuality:[PushSettingViewController getVideoQuality] adjustBitrate:[PushSettingViewController getBandWidthAdjust] adjustResolution:NO]; -} - -// 是否开启硬件加速 -- (void)onPushSetting:(PushSettingViewController *)vc enableHWAcceleration:(BOOL)enableHWAcceleration { - TXLivePushConfig *config = _pusher.config; - config.enableHWAcceleration = enableHWAcceleration; - [_pusher setConfig:config]; -} - // 是否开启耳返 - (void)onPushSetting:(PushSettingViewController *)vc enableAudioPreview:(BOOL)enableAudioPreview { - TXLivePushConfig *config = _pusher.config; - config.enableAudioPreview = enableAudioPreview; - [_pusher setConfig:config]; + [_pusher.getAudioEffectManager enableVoiceEarMonitor:enableAudioPreview]; } // 画质类型 -- (void)onPushSetting:(PushSettingViewController *)vc videoQuality:(TX_Enum_Type_VideoQuality)videoQuality { - [_pusher setVideoQuality:videoQuality adjustBitrate:[PushSettingViewController getBandWidthAdjust] adjustResolution:NO]; +- (void)onPushSetting:(PushSettingViewController *)vc videoQuality:(V2TXLiveVideoResolution)videoQuality { + [_pusher setVideoQuality:videoQuality + resolutionMode:V2TXLiveVideoResolutionModePortrait]; } - (void)onPushSetting:(PushSettingViewController *)vc audioQuality:(NSInteger)qulity { - TXLivePushConfig *config = _pusher.config; - switch (qulity) { - case 2: - // 音乐音质,采样率48000 - config.audioChannels = 2; - config.audioSampleRate = AUDIO_SAMPLE_RATE_48000; - break; - case 1: - // 标准音质,采样率48000 - config.audioChannels = 1; - config.audioSampleRate = AUDIO_SAMPLE_RATE_48000; - break; - case 0: - // 语音音质,采样率16000 - config.audioChannels = 1; - config.audioSampleRate = AUDIO_SAMPLE_RATE_16000; - break; - default: - break; - } - [_pusher setConfig:config]; + [_pusher setAudioQuality:qulity]; } #pragma mark - PushMoreSettingDelegate -// 是否开启隐私模式(关闭摄像头,并发送pauseImg图片) -- (void)onPushMoreSetting:(PushMoreSettingViewController *)vc disableVideo:(BOOL)disable { - if (_pusher.isPublishing) { - if (disable) { - [_pusher pausePush]; - } - else { - [_pusher resumePush]; - [_pusher setMute:_isMute]; - } - } -} - // 是否开启静音模式(发送静音数据,但是不关闭麦克风) - (void)onPushMoreSetting:(PushMoreSettingViewController *)vc muteAudio:(BOOL)mute { - [_pusher setMute:mute]; + [self pauseAudio:mute]; _isMute = mute; } // 是否开启观看端镜像 - (void)onPushMoreSetting:(PushMoreSettingViewController *)vc mirrorVideo:(BOOL)mirror { - [_pusher setMirror:mirror]; + [_pusher setEncoderMirror:mirror]; } // 是否开启后置闪光灯 - (void)onPushMoreSetting:(PushMoreSettingViewController *)vc openTorch:(BOOL)open { - [_pusher toggleTorch:open]; -} - -// 是否开启横屏推流 -- (void)onPushMoreSetting:(PushMoreSettingViewController *)vc horizontalPush:(BOOL)enable { - TXLivePushConfig *config = _pusher.config; - config.homeOrientation = (enable ? HOME_ORIENTATION_RIGHT : HOME_ORIENTATION_DOWN); - [_pusher setConfig:config]; - - if (enable) { - [_pusher setRenderRotation:90]; - } else { - [_pusher setRenderRotation:0]; - } + [_pusher.getDeviceManager enableCameraTorch:open]; } // 是否开启调试信息 - (void)onPushMoreSetting:(PushMoreSettingViewController *)vc debugLog:(BOOL)show { - [_pusher showVideoDebugLog:show]; + [_pusher showDebugView:show]; } // 是否添加图像水印 - (void)onPushMoreSetting:(PushMoreSettingViewController *)vc waterMark:(BOOL)enable { - TXLivePushConfig *config = _pusher.config; if (enable) { - config.watermark = [UIImage imageNamed:@"watermark"]; - config.watermarkPos = CGPointMake(10, 10); + [_pusher setWatermark:[UIImage imageNamed:@"watermark"] x:0.03 y:0.015 scale:1]; } else { - config.watermark = nil; - config.watermarkPos = CGPointZero; + [_pusher setWatermark:nil x:0.03 y:0.015 scale:1]; } - [_pusher setConfig:config]; -} - -// 延迟测定工具条 -- (void)onPushMoreSetting:(PushMoreSettingViewController *)vc delayCheck:(BOOL)enable { - [_pusher setEnableClockOverlay:enable]; } // 是否开启手动点击曝光对焦 - (void)onPushMoreSetting:(PushMoreSettingViewController *)vc touchFocus:(BOOL)enable { - TXLivePushConfig *config = _pusher.config; - config.touchFocus = enable; - [_pusher setConfig:config]; -} - -// 是否开启手势放大预览画面 -- (void)onPushMoreSetting:(PushMoreSettingViewController *)vc videoZoom:(BOOL)enable { - TXLivePushConfig *config = _pusher.config; - config.enableZoom = enable; - [_pusher setConfig:config]; -} - -// 是否开始纯音频推流(直播不支持动态切换) -- (void)onPushMoreSetting:(PushMoreSettingViewController *)vc pureAudioPush:(BOOL)enable -{ - TXLivePushConfig *config = _pusher.config; - config.enablePureAudioPush = enable; + [_pusher.getDeviceManager enableCameraAutoFocus:!enable]; } // 本地截图 - (void)onPushMoreSettingSnapShot:(PushMoreSettingViewController *)vc { - [_pusher snapshot:^(TXImage *img) { - if (img != nil) { - NSArray *images = @[img]; - UIActivityViewController *vc = [[UIActivityViewController alloc] initWithActivityItems:images applicationActivities:nil]; - [self.navigationController presentViewController:vc animated:YES completion:nil]; - } - }]; -} - -- (void)onPushMoreSettingSendMessage:(PushMoreSettingViewController *)vc message:(NSString *)message -{ - [_pusher sendMessageEx:[message dataUsingEncoding:NSUTF8StringEncoding]]; + [_pusher snapshot]; } #pragma mark - 辅助函数 @@ -892,10 +776,4 @@ - (void)toastTip:(NSString *)toastInfo { }); } -#ifdef ENABLE_CUSTOM_MODE_AUDIO_CAPTURE -- (void)onAudioCapturePcm:(NSData *)pcmData sampleRate:(int)sampleRate channels:(int)channels ts:(uint32_t)timestampMs { - [self.pusher sendCustomPCMData:pcmData.bytes len:(uint32_t)pcmData.length]; -} -#endif - @end diff --git a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushLogView.m b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushLogView.m index de3e6ae1..47b44e24 100644 --- a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushLogView.m +++ b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushLogView.m @@ -27,31 +27,10 @@ - (instancetype)initWithFrame:(CGRect)frame { int statusOffsetX = 40, statusOffsetY = 10, statusIntervalY = 40; [self addLabel:LivePlayerLocalize(@"LivePusherDemo.PushLogView.coderate") withFrame:CGRectMake(statusOffsetX, statusOffsetY, 100, height)]; - [self addLabel:LivePlayerLocalize(@"LivePusherDemo.PushLogView.uploadspeed") withFrame:CGRectMake(statusOffsetX, statusOffsetY + statusIntervalY, 100, height)]; [self addLabel:@"FPS:" withFrame:CGRectMake(statusOffsetX, statusOffsetY + statusIntervalY * 2, 50, height)]; - [self addLabel:@"GOP:" withFrame:CGRectMake(statusOffsetX + 100, statusOffsetY + statusIntervalY * 2, 60, height)]; _encBitrateLabel = [self addLabel:@"0kbps" withFrame:CGRectMake(statusOffsetX + 100, statusOffsetY, 100, height)]; - _upBitrateLabel = [self addLabel:@"0kbps" withFrame:CGRectMake(statusOffsetX + 100, statusOffsetY + statusIntervalY, 100, height)]; _fpsLabel = [self addLabel:@"0" withFrame:CGRectMake(statusOffsetX + 50, statusOffsetY + statusIntervalY * 2, 20, height)]; - _gopLabel = [self addLabel:@"0s" withFrame:CGRectMake(statusOffsetX + 160, statusOffsetY + statusIntervalY * 2, 30, height)]; - - - int stepOffsetX = 5, stepOffsetY = 150, stepIntervalY = 50; - int imgSize = 25; - _stepImgViews = [[NSMutableArray alloc] init]; - [_stepImgViews addObject:[self addImageView:@"ic_red" withFrame:CGRectMake(stepOffsetX, stepOffsetY, imgSize, imgSize)]]; - [_stepImgViews addObject:[self addImageView:@"ic_red" withFrame:CGRectMake(stepOffsetX, stepOffsetY + stepIntervalY, imgSize, imgSize)]]; - [_stepImgViews addObject:[self addImageView:@"ic_red" withFrame:CGRectMake(stepOffsetX, stepOffsetY + stepIntervalY * 2, imgSize, imgSize)]]; - [_stepImgViews addObject:[self addImageView:@"ic_red" withFrame:CGRectMake(stepOffsetX, stepOffsetY + stepIntervalY * 3, imgSize, imgSize)]]; - [_stepImgViews addObject:[self addImageView:@"ic_red" withFrame:CGRectMake(stepOffsetX, stepOffsetY + stepIntervalY * 4, imgSize, imgSize)]]; - - [self addLabel:LivePlayerLocalize(@"LivePusherDemo.PushLogView.stepcheckaddresslegitimacy") withFrame:CGRectMake(stepOffsetX+imgSize+10, stepOffsetY, 250, height)]; - [self addLabel:LivePlayerLocalize(@"LivePusherDemo.PushLogView.connecttothecloudserver") withFrame:CGRectMake(stepOffsetX+imgSize+10, stepOffsetY + stepIntervalY, 250, height)]; - [self addLabel:LivePlayerLocalize(@"LivePusherDemo.PushLogView.cameraissuccessfullyopened") withFrame:CGRectMake(stepOffsetX+imgSize+10, stepOffsetY + stepIntervalY * 2, 250, height)]; - [self addLabel:LivePlayerLocalize(@"LivePusherDemo.PushLogView.encoderstartsnormally") withFrame:CGRectMake(stepOffsetX+imgSize+10, stepOffsetY + stepIntervalY * 3, 250, height)]; - [self addLabel:LivePlayerLocalize(@"LivePusherDemo.PushLogView.begintopushflow") withFrame:CGRectMake(stepOffsetX+imgSize+10, stepOffsetY + stepIntervalY * 4, 250, height)]; - } return self; } diff --git a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushMoreSettingViewController.h b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushMoreSettingViewController.h index e28a52dc..ed238056 100644 --- a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushMoreSettingViewController.h +++ b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushMoreSettingViewController.h @@ -10,9 +10,6 @@ @protocol PushMoreSettingDelegate -// 是否开启隐私模式(关闭摄像头,并发送pauseImg图片) -- (void)onPushMoreSetting:(PushMoreSettingViewController *)vc disableVideo:(BOOL)disable; - // 是否开启静音模式(发送静音数据,但是不关闭麦克风) - (void)onPushMoreSetting:(PushMoreSettingViewController *)vc muteAudio:(BOOL)mute; @@ -22,52 +19,30 @@ // 是否开启后置闪光灯 - (void)onPushMoreSetting:(PushMoreSettingViewController *)vc openTorch:(BOOL)open; -// 是否开启横屏推流 -- (void)onPushMoreSetting:(PushMoreSettingViewController *)vc horizontalPush:(BOOL)enable; - // 是否开启调试信息 - (void)onPushMoreSetting:(PushMoreSettingViewController *)vc debugLog:(BOOL)show; // 是否添加图像水印 - (void)onPushMoreSetting:(PushMoreSettingViewController *)vc waterMark:(BOOL)enable; -// 延迟测定工具条 -- (void)onPushMoreSetting:(PushMoreSettingViewController *)vc delayCheck:(BOOL)enable; - // 是否开启手动点击曝光对焦 - (void)onPushMoreSetting:(PushMoreSettingViewController *)vc touchFocus:(BOOL)enable; -// 是否开启手势放大预览画面 -- (void)onPushMoreSetting:(PushMoreSettingViewController *)vc videoZoom:(BOOL)enable; - -// 是否开始纯音频 -- (void)onPushMoreSetting:(PushMoreSettingViewController *)vc pureAudioPush:(BOOL)enable; - // 本地截图 - (void)onPushMoreSettingSnapShot:(PushMoreSettingViewController *)vc; -// 发送消息 -- (void)onPushMoreSettingSendMessage:(PushMoreSettingViewController *)vc message:(NSString*)message; - @end @interface PushMoreSettingViewController : UITableViewController @property (nonatomic, weak) id delegate; /*** 从文件中读取配置 ***/ -+ (BOOL)isDisableVideo; + (BOOL)isMuteAudio; + (BOOL)isMirrorVideo; + (BOOL)isOpenTorch; -+ (BOOL)isHorizontalPush; + (BOOL)isShowDebugLog; + (BOOL)isEnableDelayCheck; + (BOOL)isEnableWaterMark; + (BOOL)isEnableTouchFocus; -+ (BOOL)isEnableVideoZoom; -+ (BOOL)isEnablePureAudioPush; - -/*** 写配置文件 ***/ -+ (void)setDisableVideo:(BOOL)disable; @end diff --git a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushMoreSettingViewController.m b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushMoreSettingViewController.m index 99ac6169..c12cb862 100644 --- a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushMoreSettingViewController.m +++ b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushMoreSettingViewController.m @@ -9,52 +9,35 @@ #import "AppLocalized.h" /* 列表项 */ -#define CELL_DISABLE_VIDEO 0 -#define CELL_MUTE_AUDIO 1 -#define CELL_HORIZONTAL_PUSH 2 -#define CELL_DEBUG_LOG 3 -#define CELL_WARTERMARK 4 -#define CELL_MIRROR 5 -#define CELL_TORCH 6 -#define CELL_DELAY_CHECK 7 -#define CELL_TOUCH_FOCUS 8 -#define CELL_ZOOM 9 -#define CELL_PURE_AUDIO 10 -#define CELL_SNAPSHOT 11 -#define CELL_SEND_MESSAGE 12 +#define CELL_MUTE_AUDIO 0 +#define CELL_DEBUG_LOG 1 +#define CELL_WARTERMARK 2 +#define CELL_MIRROR 3 +#define CELL_TORCH 4 +#define CELL_TOUCH_FOCUS 5 +#define CELL_SNAPSHOT 6 /* 编号,请不要修改,写配置文件依赖这个 */ #define TAG_DISABLE_VIDEO 1000 #define TAG_MUTE_AUDIO 1001 -#define TAG_HORIZONTAL_PUSH 1002 #define TAG_DEBUG_LOG 1003 #define TAG_WARTERMARK 1004 #define TAG_MIRROR 1005 #define TAG_TORCH 1006 -#define TAG_DELAY_CHECK 1007 #define TAG_TOUCH_FOCUS 1008 -#define TAG_ZOOM 1009 -#define TAG_PURE_AUDIO 1010 -#define TAG_SEND_MESSAGE 1011 @interface PushMoreSettingViewController () { - UISwitch *_disableVideoSwitch; UISwitch *_muteAudioSwitch; UISwitch *_mirrorSwitch; UISwitch *_torchSwitch; - UISwitch *_delayCheckSwitch; - UISwitch *_horizontalPushSwitch; UISwitch *_debugLogSwitch; UISwitch *_watermarkSwitch; UISwitch *_touchFocusSwitch; - UISwitch *_zoomSwitch; UISwitch *_pureAudioSwitch; UIButton *_snapShotButton; - UITextField* _messageField; - UIView* _messageView; UIColor *_tintColor; } @end @@ -69,20 +52,14 @@ - (void)viewDidLoad { _tintColor = [[UISegmentedControl alloc] init].tintColor; - _disableVideoSwitch = [self createUISwitch:TAG_DISABLE_VIDEO on:[PushMoreSettingViewController isDisableVideo]]; _muteAudioSwitch = [self createUISwitch:TAG_MUTE_AUDIO on:[PushMoreSettingViewController isMuteAudio]]; _mirrorSwitch = [self createUISwitch:TAG_MIRROR on:[PushMoreSettingViewController isMirrorVideo]]; _torchSwitch = [self createUISwitch:TAG_TORCH on:[PushMoreSettingViewController isOpenTorch]]; - _delayCheckSwitch = [self createUISwitch:TAG_DELAY_CHECK on:[PushMoreSettingViewController isEnableDelayCheck]]; - _horizontalPushSwitch = [self createUISwitch:TAG_HORIZONTAL_PUSH on:[PushMoreSettingViewController isHorizontalPush]]; _debugLogSwitch = [self createUISwitch:TAG_DEBUG_LOG on:[PushMoreSettingViewController isShowDebugLog]]; _watermarkSwitch = [self createUISwitch:TAG_WARTERMARK on:[PushMoreSettingViewController isEnableWaterMark]]; _touchFocusSwitch = [self createUISwitch:TAG_TOUCH_FOCUS on:[PushMoreSettingViewController isEnableTouchFocus]]; - _zoomSwitch = [self createUISwitch:TAG_ZOOM on:[PushMoreSettingViewController isEnableVideoZoom]]; - _pureAudioSwitch = [self createUISwitch:TAG_PURE_AUDIO on:[PushMoreSettingViewController isEnablePureAudioPush]]; _snapShotButton = [self createButtonWithTitle:LivePlayerLocalize(@"LivePusherDemo.MoreSetting.screenshots") action:@selector(onSnapShot:)]; - _messageView = [self createMessageView]; } - (UIButton*)createButtonWithTitle:(NSString*)title action:(SEL)action @@ -111,30 +88,10 @@ - (UISwitch *)createUISwitch:(NSInteger)tag on:(BOOL)on { return sw; } -- (UIView*)createMessageView -{ - UIView* panel = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 30)]; - _messageField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 140, 30)]; - _messageField.delegate = self; - _messageField.backgroundColor = [UIColor whiteColor]; - [panel addSubview:_messageField]; - UIButton* sendButton = [self createButtonWithTitle:LivePlayerLocalize(@"LiveLinkMicDemoOld.RoomPlayer.send") action:@selector(onSendMessage:)]; - sendButton.frame = CGRectMake(150, 0, 50, 30); - [panel addSubview:sendButton]; - - return panel; -} - - (void)onSwitchTap:(UISwitch *)switchBtn { [PushMoreSettingViewController saveSetting:switchBtn.tag value:switchBtn.on]; - if (switchBtn.tag == TAG_DISABLE_VIDEO) { - if (self.delegate && [self.delegate respondsToSelector:@selector(onPushMoreSetting:disableVideo:)]) { - [self.delegate onPushMoreSetting:self disableVideo:switchBtn.on]; - } - - } - else if (switchBtn.tag == TAG_MUTE_AUDIO) { + if (switchBtn.tag == TAG_MUTE_AUDIO) { if (self.delegate && [self.delegate respondsToSelector:@selector(onPushMoreSetting:muteAudio:)]) { [self.delegate onPushMoreSetting:self muteAudio:switchBtn.on]; } @@ -150,12 +107,6 @@ - (void)onSwitchTap:(UISwitch *)switchBtn { [self.delegate onPushMoreSetting:self openTorch:switchBtn.on]; } } - else if (switchBtn.tag == TAG_HORIZONTAL_PUSH) { - if (self.delegate && [self.delegate respondsToSelector:@selector(onPushMoreSetting:horizontalPush:)]) { - [self.delegate onPushMoreSetting:self horizontalPush:switchBtn.on]; - } - - } else if (switchBtn.tag == TAG_DEBUG_LOG) { if (self.delegate && [self.delegate respondsToSelector:@selector(onPushMoreSetting:debugLog:)]) { [self.delegate onPushMoreSetting:self debugLog:switchBtn.on]; @@ -166,28 +117,12 @@ - (void)onSwitchTap:(UISwitch *)switchBtn { [self.delegate onPushMoreSetting:self waterMark:switchBtn.on]; } - } - else if (switchBtn.tag == TAG_DELAY_CHECK) { - if (self.delegate && [self.delegate respondsToSelector:@selector(onPushMoreSetting:delayCheck:)]) { - [self.delegate onPushMoreSetting:self delayCheck:switchBtn.on]; - } - } else if (switchBtn.tag == TAG_TOUCH_FOCUS) { if (self.delegate && [self.delegate respondsToSelector:@selector(onPushMoreSetting:touchFocus:)]) { [self.delegate onPushMoreSetting:self touchFocus:switchBtn.on]; } } - else if (switchBtn.tag == TAG_ZOOM) { - if (self.delegate && [self.delegate respondsToSelector:@selector(onPushMoreSetting:videoZoom:)]) { - [self.delegate onPushMoreSetting:self videoZoom:switchBtn.on]; - } - } - else if (switchBtn.tag == TAG_PURE_AUDIO) { - if (self.delegate && [self.delegate respondsToSelector:@selector(onPushMoreSetting:videoZoom:)]) { - [self.delegate onPushMoreSetting:self pureAudioPush:switchBtn.on]; - } - } } - (void)onSnapShot:(UIButton *)btn { @@ -196,19 +131,6 @@ - (void)onSnapShot:(UIButton *)btn { } } -- (void)onSendMessage:(UIButton *)btn { - if (self.delegate && [self.delegate respondsToSelector:@selector(onPushMoreSettingSendMessage:message:)]) { - [self.delegate onPushMoreSettingSendMessage:self message:_messageField.text]; - } - _messageField.text = nil; -} - -- (BOOL)textFieldShouldReturn:(UITextField *)textField -{ - [textField resignFirstResponder]; - return YES; -} - - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 13; } @@ -225,12 +147,6 @@ - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NS cell.textLabel.font = [UIFont systemFontOfSize:16]; switch (indexPath.row) { - case CELL_DISABLE_VIDEO: { - cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.MoreSetting.enableprivacymode"); - cell.accessoryView = _disableVideoSwitch; - - break; - } case CELL_MUTE_AUDIO: { cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.MoreSetting.turnonmutemode"); @@ -252,14 +168,7 @@ - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NS break; } - - case CELL_HORIZONTAL_PUSH: { - cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.MoreSetting.turnonhorizontalpushflow"); - cell.accessoryView = _horizontalPushSwitch; - - break; - } - + case CELL_DEBUG_LOG: { cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.MoreSetting.openingdebuglog"); cell.accessoryView = _debugLogSwitch; @@ -273,44 +182,19 @@ - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NS break; } - - case CELL_DELAY_CHECK: { - cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.MoreSetting.delaymeasurementbar"); - cell.accessoryView = _delayCheckSwitch; - - break; - } - + case CELL_TOUCH_FOCUS: { cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.MoreSetting.manuallyclickexposureandfocus"); cell.accessoryView = _touchFocusSwitch; break; } - case CELL_ZOOM: { - cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.MoreSetting.gesturetozoominonthepreview"); - cell.accessoryView = _zoomSwitch; - - break; - } - case CELL_PURE_AUDIO: { - cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.MoreSetting.enableaudiopushstream"); - cell.accessoryView = _pureAudioSwitch; - - break; - } case CELL_SNAPSHOT: { cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.MoreSetting.localscreenshots"); cell.accessoryView = _snapShotButton; break; } - case CELL_SEND_MESSAGE: { - cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.MoreSetting.sendmessage"); - cell.accessoryView = _messageView; - - break; - } default: break; @@ -331,15 +215,6 @@ + (void)saveSetting:(NSInteger)tag value:(NSInteger)value { [[NSUserDefaults standardUserDefaults] synchronize]; } -+ (BOOL)isDisableVideo { - NSString *key = [PushMoreSettingViewController getKey:TAG_DISABLE_VIDEO]; - NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; - if (d != nil) { - return [d intValue]; - } - return NO; -} - + (BOOL)isMuteAudio { NSString *key = [PushMoreSettingViewController getKey:TAG_MUTE_AUDIO]; NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; @@ -367,15 +242,6 @@ + (BOOL)isOpenTorch { return NO; } -+ (BOOL)isHorizontalPush { - NSString *key = [PushMoreSettingViewController getKey:TAG_HORIZONTAL_PUSH]; - NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; - if (d != nil) { - return [d intValue]; - } - return NO; -} - + (BOOL)isShowDebugLog { NSString *key = [PushMoreSettingViewController getKey:TAG_DEBUG_LOG]; NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; @@ -394,15 +260,6 @@ + (BOOL)isEnableWaterMark { return NO; } -+ (BOOL)isEnableDelayCheck { - NSString *key = [PushMoreSettingViewController getKey:TAG_DELAY_CHECK]; - NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; - if (d != nil) { - return [d intValue]; - } - return NO; -} - + (BOOL)isEnableTouchFocus { NSString *key = [PushMoreSettingViewController getKey:TAG_TOUCH_FOCUS]; NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; @@ -412,26 +269,4 @@ + (BOOL)isEnableTouchFocus { return YES; } -+ (BOOL)isEnableVideoZoom { - NSString *key = [PushMoreSettingViewController getKey:TAG_ZOOM]; - NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; - if (d != nil) { - return [d intValue]; - } - return NO; -} - -+ (BOOL)isEnablePureAudioPush { - NSString *key = [PushMoreSettingViewController getKey:TAG_PURE_AUDIO]; - NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; - if (d != nil) { - return [d intValue]; - } - return NO; -} - -+ (void)setDisableVideo:(BOOL)disable { - [PushMoreSettingViewController saveSetting:TAG_DISABLE_VIDEO value:disable]; -} - @end diff --git a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushSettingViewController.h b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushSettingViewController.h index 568d878c..1b2ae205 100644 --- a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushSettingViewController.h +++ b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushSettingViewController.h @@ -5,26 +5,20 @@ */ #import -#import "TXLiveSDKTypeDef.h" +#import "V2TXLiveDef.h" @class PushSettingViewController; @protocol PushSettingDelegate -// 是否开启带宽适应 -- (void)onPushSetting:(PushSettingViewController *)vc enableBandwidthAdjust:(BOOL)enableBandwidthAdjust; - -// 是否开启硬件加速 -- (void)onPushSetting:(PushSettingViewController *)vc enableHWAcceleration:(BOOL)enableHWAcceleration; - // 是否开启耳返 - (void)onPushSetting:(PushSettingViewController *)vc enableAudioPreview:(BOOL)enableAudioPreview; // 画质类型 -- (void)onPushSetting:(PushSettingViewController *)vc videoQuality:(TX_Enum_Type_VideoQuality)videoQuality; +- (void)onPushSetting:(PushSettingViewController *)vc videoQuality:(V2TXLiveVideoResolution)videoQuality; // 音质类型 -- (void)onPushSetting:(PushSettingViewController *)vc audioQuality:(NSInteger)qulity; +- (void)onPushSetting:(PushSettingViewController *)vc audioQuality:(V2TXLiveAudioQuality)qulity; @end @@ -37,7 +31,7 @@ + (BOOL)getEnableHWAcceleration; + (BOOL)getEnableAudioPreview; + (NSInteger)getAudioQuality; -+ (TX_Enum_Type_VideoQuality)getVideoQuality; ++ (V2TXLiveVideoResolution)getVideoQuality; @end diff --git a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushSettingViewController.m b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushSettingViewController.m index 636bc893..c6f8113e 100644 --- a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushSettingViewController.m +++ b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/CameraPushDemo/PushSettingViewController.m @@ -8,32 +8,28 @@ #import "UIView+Additions.h" #import "ColorMacro.h" #import "AppLocalized.h" +#import "V2TXLiveDef.h" /* 列表项 */ #define SECTION_QUALITY 0 #define SECTION_AUDIO_QUALITY 1 -#define SECTION_BANDWIDTH_ADJUST 2 -#define SECTION_HW 3 -#define SECTION_AUDIO_PREVIEW 4 +#define SECTION_AUDIO_PREVIEW 2 /* 编号,请不要修改,写配置文件依赖这个 */ #define TAG_QUALITY 1000 -#define TAG_BANDWIDTH_ADJUST 1003 #define TAG_HW 1004 #define TAG_AUDIO_PREVIEW 1005 #define TAG_AUDIO_QUALITY 1006 @interface PushSettingQuality : NSObject @property (copy, nonatomic) NSString *title; -@property (assign, nonatomic) TX_Enum_Type_VideoQuality value; +@property (assign, nonatomic) V2TXLiveVideoResolution value; @end @implementation PushSettingQuality @end @interface PushSettingViewController () { - UISwitch *_bandwidthSwitch; - UISwitch *_hwSwitch; UISwitch *_audioPreviewSwitch; NSArray *_qualities; @@ -53,17 +49,14 @@ - (void)viewDidLoad { LivePlayerLocalize(@"LivePusherDemo.PushSetting.superclear"), LivePlayerLocalize(@"LivePusherDemo.PushSetting.hd"), LivePlayerLocalize(@"LivePusherDemo.PushSetting.standarddefinition"), - LivePlayerLocalize(@"LivePusherDemo.PushSetting.lianmaibighost"), LivePlayerLocalize(@"LivePusherDemo.PushSetting.lianmaismallhost"), - LivePlayerLocalize(@"LivePusherDemo.PushSetting.realtimeaudioandvideo")]; - TX_Enum_Type_VideoQuality qualityArray[] = { - VIDEO_QUALITY_ULTRA_DEFINITION, - VIDEO_QUALITY_SUPER_DEFINITION, - VIDEO_QUALITY_HIGH_DEFINITION, - VIDEO_QUALITY_STANDARD_DEFINITION, - VIDEO_QUALITY_LINKMIC_MAIN_PUBLISHER, - VIDEO_QUALITY_LINKMIC_SUB_PUBLISHER, - VIDEO_QUALITY_REALTIME_VIDEOCHAT + ]; + V2TXLiveVideoResolution qualityArray[] = { + V2TXLiveVideoResolution1920x1080, + V2TXLiveVideoResolution1280x720, + V2TXLiveVideoResolution960x540, + V2TXLiveVideoResolution640x360, + V2TXLiveVideoResolution480x270, }; NSMutableArray *qualities = [[NSMutableArray alloc] initWithCapacity:titleArray.count]; for (int i = 0; i < titleArray.count; ++i) { @@ -77,8 +70,6 @@ - (void)viewDidLoad { self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:LivePlayerLocalize(@"LivePusherDemo.PushSetting.back") style:UIBarButtonItemStylePlain target:self action:@selector(onClickedCancel:)]; //self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"完成" style:UIBarButtonItemStylePlain target:self action:@selector(onClickedOK:)]; - _bandwidthSwitch = [self createUISwitch:TAG_BANDWIDTH_ADJUST on:[PushSettingViewController getBandWidthAdjust]]; - _hwSwitch = [self createUISwitch:TAG_HW on:[PushSettingViewController getEnableHWAcceleration]]; _audioPreviewSwitch = [self createUISwitch:TAG_AUDIO_PREVIEW on:[PushSettingViewController getEnableAudioPreview]]; _mainTableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStyleGrouped]; @@ -120,17 +111,7 @@ - (UISwitch *)createUISwitch:(NSInteger)tag on:(BOOL)on { - (void)onSwitchTap:(UISwitch *)switchBtn { [PushSettingViewController saveSetting:switchBtn.tag value:switchBtn.on]; - if (switchBtn.tag == TAG_BANDWIDTH_ADJUST) { - if (self.delegate && [self.delegate respondsToSelector:@selector(onPushSetting:enableBandwidthAdjust:)]) { - [self.delegate onPushSetting:self enableBandwidthAdjust:switchBtn.on]; - } - - } else if (switchBtn.tag == TAG_HW) { - if (self.delegate && [self.delegate respondsToSelector:@selector(onPushSetting:enableHWAcceleration:)]) { - [self.delegate onPushSetting:self enableHWAcceleration:switchBtn.on]; - } - - } else if (switchBtn.tag == TAG_AUDIO_PREVIEW) { + if (switchBtn.tag == TAG_AUDIO_PREVIEW) { if (self.delegate && [self.delegate respondsToSelector:@selector(onPushSetting:enableAudioPreview:)]) { [self.delegate onPushSetting:self enableAudioPreview:switchBtn.on]; } @@ -139,7 +120,7 @@ - (void)onSwitchTap:(UISwitch *)switchBtn { } - (NSString *)getQualityStr { - TX_Enum_Type_VideoQuality quality = [PushSettingViewController getVideoQuality]; + V2TXLiveAudioQuality quality = [PushSettingViewController getVideoQuality]; for (PushSettingQuality *q in _qualities) { if (q.value == quality) { return q.title; @@ -212,7 +193,7 @@ - (void)_showAudioQualityActionSheet { #pragma mark - UITableView delegate - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 5; + return 3; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { @@ -228,12 +209,6 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N } else if (indexPath.section == SECTION_AUDIO_QUALITY) { cell.textLabel.text = [self getAudioQualityStr]; cell.accessoryView = [PushSettingViewController buildAccessoryView]; - } else if (indexPath.section == SECTION_BANDWIDTH_ADJUST) { - cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.PushSetting.openbandwidthadaptation"); - cell.accessoryView = _bandwidthSwitch; - } else if (indexPath.section == SECTION_HW) { - cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.PushSetting.enablehardwareacceleration"); - cell.accessoryView = _hwSwitch; } else if (indexPath.section == SECTION_AUDIO_PREVIEW) { cell.textLabel.text = LivePlayerLocalize(@"LivePusherDemo.PushSetting.opentheearsback"); cell.accessoryView = _audioPreviewSwitch; @@ -273,24 +248,6 @@ + (void)saveSetting:(NSInteger)tag value:(NSInteger)value { [[NSUserDefaults standardUserDefaults] synchronize]; } -+ (BOOL)getBandWidthAdjust { - NSString *key = [PushSettingViewController getKey:TAG_BANDWIDTH_ADJUST]; - NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; - if (d != nil) { - return [d intValue]; - } - return NO; -} - -+ (BOOL)getEnableHWAcceleration { - NSString *key = [PushSettingViewController getKey:TAG_HW]; - NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; - if (d != nil) { - return [d intValue]; - } - return YES; -} - + (BOOL)getEnableAudioPreview { NSString *key = [PushSettingViewController getKey:TAG_AUDIO_PREVIEW]; NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; @@ -300,13 +257,13 @@ + (BOOL)getEnableAudioPreview { return NO; } -+ (TX_Enum_Type_VideoQuality)getVideoQuality { ++ (V2TXLiveVideoResolution)getVideoQuality { NSString *key = [PushSettingViewController getKey:TAG_QUALITY]; NSNumber *d = [[NSUserDefaults standardUserDefaults] objectForKey:key]; if (d != nil) { return [d intValue]; } - return VIDEO_QUALITY_SUPER_DEFINITION; + return V2TXLiveVideoResolution1280x720; } + (NSInteger)getAudioQuality { diff --git a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/ScreenPushDemo/ScreenPushViewController.m b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/ScreenPushDemo/ScreenPushViewController.m index 1e093275..d64d1d32 100644 --- a/iOS/Demo/TXLiteAVDemo/LivePusherDemo/ScreenPushDemo/ScreenPushViewController.m +++ b/iOS/Demo/TXLiteAVDemo/LivePusherDemo/ScreenPushDemo/ScreenPushViewController.m @@ -15,41 +15,20 @@ #ifndef DISABLE_VOD #import "TXVodPlayer.h" #endif -#import "TXLivePush.h" +#import "V2TXLivePusher.h" #import "AddressBarController.h" #import "AppDelegate.h" -#import "SimpleIPC.h" #import "AppLocalized.h" #import "NSString+Common.h" +#import -//#import "CWStatusBarNotification.h" - -/** - *InAppReplayKit2Pusher类只供录制本界面使用,示例SDK的自定义发送接口的使用方法。屏幕录制的示例代码在扩展中的SampleHandler里 - */ -//@interface InAppReplayKit2Pusher : NSObject -//@property (nonatomic, assign) BOOL isPushing; -//@property (nonatomic, assign) BOOL isStarting; -// -//+ (InAppReplayKit2Pusher *)sharedInstance; -// -//- (void)startPushWithUrl:(NSString *)pushUrl rotation:(NSString *)rotation resolution:(NSString *)resolution; -//- (void)stopPush; -//- (void)pausePush; -//- (void)resumePush; -//- (void)setCustomRotationAndResolution:(NSString*)rotation resolution:(NSString*)resolution; -//- (void)showRecodingStatus:(BOOL)isShow; -// -//@end - -@interface ScreenPushViewController () { - SimpleIPC *_ipc; -} +@interface ScreenPushViewController () @property (nonatomic, retain) UISegmentedControl* rotateSelector; @property (nonatomic, retain) UISegmentedControl* resolutionSelector; @property (nonatomic, retain) UIButton* btnReplaykit; @property (nonatomic, copy) NSString *playFlvUrl; @property (nonatomic, retain) UIView* playerView; +@property (nonatomic, strong) V2TXLivePusher *livePusher; #ifndef DISABLE_VOD @property (nonatomic, retain) TXVodPlayer* vodPlayer; #endif @@ -63,22 +42,16 @@ @implementation ScreenPushViewController - (void)viewDidLoad { [super viewDidLoad]; - // Do any additional setup after loading the view. - _ipc = [[SimpleIPC alloc] initWithPort:kReplayKitIPCPort]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onReplayKit2RecordStop:) name:kCocoaNotificationNameReplayKit2Stop object:nil]; - [self initUI]; } - (void)dealloc { + [self.livePusher stopPush]; #ifndef DISABLE_VOD [_vodPlayer stopPlay]; #endif - [self _sendMessageToExtension:kDarvinNotificaiotnNamePushStop object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self]; - -// [[InAppReplayKit2Pusher sharedInstance] stopPush]; } - (void)viewWillAppear:(BOOL)animated @@ -257,7 +230,6 @@ - (void)addressBarControllerTapCreateURL:(AddressBarController *)controller if (result != 0) { dispatch_async(dispatch_get_main_queue(), ^{ -// _hub = [MBProgressHUD HUDForView:weakSelf.view]; hub.mode = MBProgressHUDModeText; hub.label.text = LivePlayerLocalize(@"LivePusherDemo.ScreenPush.failedtogetpushstreamaddress"); [hub showAnimated:YES]; @@ -293,13 +265,11 @@ - (void)addressBarControllerTapCreateURL:(AddressBarController *)controller pasteboard.string = playUrls; weakSelf.playFlvUrl = flvPlayUrl; dispatch_async(dispatch_get_main_queue(), ^{ -// _hub = [MBProgressHUD HUDForView:weakSelf.view]; hub.mode = MBProgressHUDModeText; hub.label.text = LivePlayerLocalize(@"LivePusherDemo.CameraPush.getaddresssuccess"); hub.detailsLabel.text = LivePlayerLocalize(@"LivePusherDemo.CameraPush.playbackaddresshasbeencopiedtotheclipboard"); [hub showAnimated:YES]; [hub hideAnimated:YES afterDelay:2]; -// controller.qrString = accPlayUrl; }); } }]; @@ -328,15 +298,6 @@ - (void)clickStartReplaykit:(UIButton*)btn BOOL isStart = [btntitle isEqualToString:LivePlayerLocalize(@"LivePusherDemo.ScreenPush.startpushstream")]; if (isStart) { - NSString* resolution = kResolutionFHD; - if (self.resolutionSelector.selectedSegmentIndex == 1) { - resolution = kResolutionHD; - } - else if (self.resolutionSelector.selectedSegmentIndex == 2) { - resolution = kResolutionSD; - } - - NSString* rotation = self.rotateSelector.selectedSegmentIndex == 0?kReplayKit2Portrait:kReplayKit2Lanscape; BOOL isCaptured = NO; if (@available(iOS 11, *)) { isCaptured = [UIScreen mainScreen].isCaptured; @@ -346,8 +307,6 @@ - (void)clickStartReplaykit:(UIButton*)btn UIAlertController* alert = [UIAlertController alertControllerWithTitle:LivePlayerLocalize(@"LivePusherDemo.ScreenPush.tencentcloudpushstream") message:message preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* action1 = [UIAlertAction actionWithTitle:LivePlayerLocalize(@"LiveLinkMicDemoOld.RoomList.determine") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { -// [[InAppReplayKit2Pusher sharedInstance] startPushWithUrl:self.addressBarController.text rotation:rotation resolution:resolution]; -// [btn setTitle:@"结束推流" forState:UIControlStateNormal]; }]; UIAlertAction* action2 = [UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePusherDemo.PushSetting.cancel") style:UIAlertActionStyleDefault handler:nil]; [alert addAction:action1]; @@ -358,23 +317,22 @@ - (void)clickStartReplaykit:(UIButton*)btn else { UIAlertController* alert = [UIAlertController alertControllerWithTitle:LivePlayerLocalize(@"LivePusherDemo.ScreenPush.tencentcloudpushstream") message:LivePlayerLocalize(@"LivePusherDemo.ScreenPush.turnonscreenrecordingpushstreams") preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* action1 = [UIAlertAction actionWithTitle:LivePlayerLocalize(@"LiveLinkMicDemoOld.RoomList.determine") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { -// 正式应用不建议合用剪贴板传值。建议配置appgroup,使用NSUserDefault的方式传值 -// NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kReplayKit2AppGroupId]; -// [defaults setObject:_rtcRoom.roomID forKey:kReplayKit2UserDefaultRoomidKey]; -// [defaults synchronize]; - NSMutableDictionary* dict = [NSMutableDictionary new]; - [dict setObject:self.addressBarController.text forKey:kReplayKit2PushUrlKey]; - [dict setObject:rotation forKey:kReplayKit2RotateKey]; - if (self.playFlvUrl) - [dict setObject:self.playFlvUrl forKey:LivePlayerLocalize(@"LivePusherDemo.ScreenPush.flvplayaddress")]; - - [dict setObject:resolution forKey:kReplayKit2ResolutionKey]; - - [self _sendMessageToExtension:kDarvinNotificationNamePushStart object:dict]; - + V2TXLiveMode mode = V2TXLiveMode_RTMP; + if ([self.addressBarController.text.lowercaseString hasPrefix:@"trtc://"]) { + mode = V2TXLiveMode_RTC; + } + self.livePusher = [[V2TXLivePusher alloc] initWithLiveMode:mode]; + [self.livePusher setObserver:self]; + if (@available(iOS 11.0, *)) { + [self.livePusher startScreenCapture:kReplayKit2AppGroupId]; + } + [self refreshResolutionAndRotation]; + [[self.livePusher getDeviceManager] setSystemVolumeType:TXSystemVolumeTypeMedia]; + [self.livePusher startMicrophone]; + [self.livePusher startPush:self.addressBarController.text]; [btn setTitle:LivePlayerLocalize(@"LivePusherDemo.ScreenPush.pushoverflow") forState:UIControlStateNormal]; }]; - UIAlertAction* action2 = [UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePusherDemo.PushSetting.cancel") style:UIAlertActionStyleDefault handler:nil]; + UIAlertAction *action2 = [UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePusherDemo.PushSetting.cancel") style:UIAlertActionStyleDefault handler:nil]; [alert addAction:action1]; [alert addAction:action2]; @@ -384,23 +342,14 @@ - (void)clickStartReplaykit:(UIButton*)btn else { UIAlertController* alert = [UIAlertController alertControllerWithTitle:LivePlayerLocalize(@"LivePusherDemo.ScreenPush.tencentcloudpushstream") message:LivePlayerLocalize(@"LivePusherDemo.ScreenPush.closescreenpushstream") preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* action1 = [UIAlertAction actionWithTitle:LivePlayerLocalize(@"LiveLinkMicDemoOld.RoomList.determine") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { -// NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kReplayKit2AppGroupId]; -// [defaults setObject:_rtcRoom.roomID forKey:kReplayKit2UserDefaultRoomidKey]; -// [defaults synchronize]; + [self.livePusher stopPush]; [btn setTitle:LivePlayerLocalize(@"LivePusherDemo.ScreenPush.startpushstream") forState:UIControlStateNormal]; - -// if ([InAppReplayKit2Pusher sharedInstance].isPushing) { -// [[InAppReplayKit2Pusher sharedInstance] stopPush]; -// return; -// } - [self _sendMessageToExtension:kDarvinNotificaiotnNamePushStop object:@{}]; }]; - UIAlertAction* action2 = [UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePusherDemo.PushSetting.cancel") style:UIAlertActionStyleDefault handler:nil]; + UIAlertAction *action2 = [UIAlertAction actionWithTitle:LivePlayerLocalize(@"LivePusherDemo.PushSetting.cancel") style:UIAlertActionStyleDefault handler:nil]; [alert addAction:action1]; [alert addAction:action2]; [self presentViewController:alert animated:YES completion:nil]; - } } @@ -412,64 +361,29 @@ - (void)onReplayKit2RecordStop:(NSNotification*)noti - (void)onSwitchRotation:(UISegmentedControl*)segment { - //建议使用正式的appgroup的NSUserDefaults方式传值 - // NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kReplayKit2AppGroupId]; - // [defaults setObject:self.rotateSelector.selectedSegmentIndex == 0?kReplayKit2Portrait:kReplayKit2Lanscape forKey:kReplayKit2RotateKey]; - // [defaults synchronize]; - NSString* rotation = self.rotateSelector.selectedSegmentIndex == 0?kReplayKit2Portrait:kReplayKit2Lanscape; -// if ([InAppReplayKit2Pusher sharedInstance].isPushing) { -// NSString* resolution = kResolutionFHD; -// if (self.resolutionSelector.selectedSegmentIndex == 1) { -// resolution = kResolutionHD; -// } -// else if (self.resolutionSelector.selectedSegmentIndex == 2) { -// resolution = kResolutionSD; -// } -// [[InAppReplayKit2Pusher sharedInstance] setCustomRotationAndResolution:rotation resolution:resolution]; -// return; -// } - [self _sendMessageToExtension:kDarvinNotificaiotnNameRotationChange - object:@{kReplayKit2RotateKey: rotation}]; + [self refreshResolutionAndRotation]; } - (void)onSwitchresolution:(UISegmentedControl*)segment { - - NSString* resolution = kResolutionFHD; - if (self.resolutionSelector.selectedSegmentIndex == 1) { - resolution = kResolutionHD; - } - else if (self.resolutionSelector.selectedSegmentIndex == 2) { - resolution = kResolutionSD; - } -// if ([InAppReplayKit2Pusher sharedInstance].isPushing) { -// NSString* rotation = self.rotateSelector.selectedSegmentIndex == 0?kReplayKit2Portrait:kReplayKit2Lanscape; -// [[InAppReplayKit2Pusher sharedInstance] setCustomRotationAndResolution:rotation resolution:resolution]; -// return; -// } - NSMutableDictionary* dict = [NSMutableDictionary new]; - [dict setObject:resolution forKey:kReplayKit2ResolutionKey]; - - [self _sendMessageToExtension:kDarvinNotificaiotnNameResolutionChange - object:dict]; + [self refreshResolutionAndRotation]; } -- (void)_sendMessageToExtension:(CFStringRef)message object:(NSDictionary *)object { - if (object) { -#if kReplayKitUseAppGroup - NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:kReplayKit2AppGroupId]; - [defaults setValuesForKeysWithDictionary:object]; - [defaults synchronize]; - CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), message, NULL, nil, YES); -#else -// UIPasteboard *pasteboard = [UIPasteboard pasteboardWithName:@"TXLiteAV" create:YES]; -// NSString* transString = [self dictionary2JsonString:object]; -// if (!transString) -// return; -// pasteboard.string = transString; - [_ipc sendCmd:(__bridge NSString *)message info:object]; -#endif +- (void)refreshResolutionAndRotation +{ + V2TXLiveVideoResolution resolution = V2TXLiveVideoResolution960x540; + if (2 == self.resolutionSelector.selectedSegmentIndex) { + resolution = V2TXLiveVideoResolution640x360; + } else if (1 == self.resolutionSelector.selectedSegmentIndex) { + resolution = V2TXLiveVideoResolution960x540; + } else { + resolution = V2TXLiveVideoResolution1280x720; + } + V2TXLiveVideoResolutionMode resMode = V2TXLiveVideoResolutionModePortrait; + if (self.rotateSelector.selectedSegmentIndex) { + resMode = V2TXLiveVideoResolutionModeLandscape; } + [self.livePusher setVideoQuality:resolution resolutionMode:resMode]; } #ifndef DISABLE_VOD @@ -489,6 +403,17 @@ -(void) onNetStatus:(TXVodPlayer *)player withParam:(NSDictionary*)param { } #endif +#pragma mark -- V2TXLivePusherObserver +- (void)onError:(V2TXLiveCode)code + message:(NSString *)msg + extraInfo:(NSDictionary *)extraInfo { + if (code == V2TXLIVE_ERROR_REQUEST_TIMEOUT) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self onScreenCaptureStoped:0]; + }); + } +} + #pragma mark - ScanQRDelegate - (void)onScanResult:(NSString *)result { self.addressBarController.text = result; @@ -516,257 +441,51 @@ - (NSString *)dictionary2JsonString:(NSDictionary *)dict return nil; } -@end +#pragma mark - TXLivePushListener +- (void)onPushEvent:(int)EvtID withParam:(NSDictionary *)param { + NSLog(@"onPushEvent %d", EvtID); +} +- (void)onNetStatus:(NSDictionary *)param { +} +- (void)onScreenCaptureStarted { +} +- (void)onScreenCapturePaused:(int)reason { +} +- (void)onScreenCaptureResumed:(int)reason { +} -//@interface InAppReplayKit2Pusher() -//@property (nonatomic) TXLivePush* livePusher; -//@end -// -//@implementation InAppReplayKit2Pusher { -// CWStatusBarNotification *_notification; -//} -// -// -//+ (InAppReplayKit2Pusher *)sharedInstance -//{ -// static InAppReplayKit2Pusher * s_instance = nil; -// static dispatch_once_t onceToken ; -// dispatch_once(&onceToken, ^{ -// s_instance = [[InAppReplayKit2Pusher alloc] init] ; -// }); -// -// return s_instance ; -//} -// -//- (id)init -//{ -// if (self = [super init]) { -// _notification = [CWStatusBarNotification new]; -// _notification.notificationLabelBackgroundColor = [UIColor redColor]; -// _notification.notificationLabelTextColor = [UIColor whiteColor]; -// -// -// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil]; -// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppDidBecomeActive:) name:UIApplicationDidBecomeActiveNotification object:nil]; -// } -// return self; -//} -// -//- (void)onAppWillResignActive:(NSNotification *)notification -//{ -// if(@available(iOS 11.0, *)) { -// [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; -// if (_isPushing) { -// [self pausePush]; -// } -// } -//} -// -//- (void)onAppDidBecomeActive:(NSNotification *)notification -//{ -// if(@available(iOS 11.0, *)) { -// if (_isPushing) { -// [self resumePush]; -// } -// } -//} -// -//- (void)startPushWithUrl:(NSString *)pushUrl rotation:(NSString *)rotation resolution:(NSString *)resolution; -//{ -// if (_livePusher) -// [_livePusher stopPush]; -// -// //使用自定义音视频发送接口时的初始化 -// TXLivePushConfig* pushConfigs = [[TXLivePushConfig alloc] init]; -// pushConfigs.customModeType |= CUSTOM_MODE_VIDEO_CAPTURE; //自定义视频 -// pushConfigs.enableAutoBitrate = YES; -// pushConfigs.autoSampleBufferSize = NO; -// pushConfigs.enableHWAcceleration = YES; -// -// pushConfigs.customModeType |= CUSTOM_MODE_AUDIO_CAPTURE; //自定义音频 -// pushConfigs.audioSampleRate = AUDIO_SAMPLE_RATE_44100; -// pushConfigs.audioChannels = 1; -// pushConfigs.pauseImg = [UIImage imageNamed:@"pause_publish.jpg"]; -// _livePusher = [[TXLivePush alloc] initWithConfig:pushConfigs]; -// _livePusher.delegate = self; -// [self setCustomRotationAndResolution:rotation resolution:resolution]; -// [_livePusher startPush:pushUrl]; -// _isStarting = NO; -// [self startInAppScreenCapture]; -// _isPushing = YES; -// -//} -// -//- (void)startInAppScreenCapture -//{ -// if(@available(iOS 11.0, *)) { -// if (_isStarting) -// return; -// _isStarting = YES; -// __weak __typeof(self) weakSelf = self; -// [[RPScreenRecorder sharedRecorder] setMicrophoneEnabled:YES]; -// //仅竖屏 -// [[RPScreenRecorder sharedRecorder] startCaptureWithHandler:^(CMSampleBufferRef _Nonnull sampleBuffer, RPSampleBufferType bufferType, NSError * _Nullable error) { -// if (error == nil) { -// switch (bufferType) { -// case RPSampleBufferTypeVideo: -// if(CMSampleBufferIsValid(sampleBuffer)){ -// [weakSelf.livePusher sendVideoSampleBuffer:sampleBuffer]; -// } -// else { -// NSLog(@"video samplebuffer is invalid"); -// } -// break; -// -// case RPSampleBufferTypeAudioApp: -// if(CMSampleBufferDataIsReady(sampleBuffer)){ -// [weakSelf.livePusher sendAudioSampleBuffer:sampleBuffer withType:RPSampleBufferTypeAudioApp]; -// } -// break; -// -// case RPSampleBufferTypeAudioMic: -// if(CMSampleBufferDataIsReady(sampleBuffer)){ -// [weakSelf.livePusher sendAudioSampleBuffer:sampleBuffer withType:RPSampleBufferTypeAudioMic]; -// } -// break; -// -// default: -// break; -// } -// } -// else{ -// NSLog(@"push buffer error : %@", error); -// } -// } completionHandler:^(NSError * _Nullable error) { -// if (error) { -// NSLog(@"push buffer fail : %@", error); -//// [self stopInAppScreenCapture]; -// } -// else { -// NSLog(@"startCapture completion"); -// // [_notification displayNotificationWithMessage:@"界面采集已启动。注:只采集本界面" forDuration:5]; -// // 触发一次UI变化,否则replaykit可能无数据采集 -// _isStarting = NO; -// -// dispatch_async(dispatch_get_main_queue(), ^{ -// [_notification displayNotificationWithMessage:@"界面采集已启动。注:只采集本界面" forDuration:1]; -// }); -// } -// }]; -// // [[RPScreenRecorder sharedRecorder] setMicrophoneEnabled:YES]; -// -// } -//} -// -//- (void)stopPush -//{ -// [self stopInAppScreenCapture]; -// [_livePusher stopPush]; -// _livePusher.delegate = nil; -// _livePusher = nil; -// _isPushing = NO; -// [_notification dismissNotification]; -// -//} -// -//- (void)stopInAppScreenCapture -//{ -// if(@available(iOS 11.0, *)) { -// [[RPScreenRecorder sharedRecorder] stopCaptureWithHandler:^(NSError * _Nullable error) { -// if (error) { -// NSLog(@"stop screen push error %@", error); -// } -// else{ -// NSLog(@"stop screen push"); -// } -// }]; -// } -//} -// -//- (void)pausePush -//{ -// [_livePusher pausePush]; -// [self stopInAppScreenCapture]; -//} -// -//- (void)resumePush -//{ -// [self startInAppScreenCapture]; -// [_livePusher resumePush]; -//} -// -//- (void)setCustomRotationAndResolution:(NSString *)rotation resolution:(NSString *)resolution -//{ -// TXLivePushConfig* config = _livePusher.config; -// CGSize screenSize = [[UIScreen mainScreen] currentMode].size; -// config.homeOrientation = HOME_ORIENTATION_DOWN; -// -// if ([resolution isEqualToString:kResolutionSD]) { -// config.sampleBufferSize = CGSizeMake(368, (uint)(360 * screenSize.height / screenSize.width)); -// config.videoBitrateMin = 400; -// config.videoBitratePIN = 800; -// config.videoBitrateMax = 1200; -// config.videoFPS = 20; -// } -// else if ([resolution isEqualToString:kResolutionFHD]) { -// config.sampleBufferSize = CGSizeMake(720, (uint)(720 * screenSize.height / screenSize.width)); //建议不超过720P -// config.videoBitrateMin = 1200; -// config.videoBitratePIN = 1800; -// config.videoBitrateMax = 2400; -// config.videoFPS = 30; -// -// } -// else { -// config.sampleBufferSize = CGSizeMake(544, (uint)(540 * screenSize.height / screenSize.width)); -// config.videoBitrateMin = 800; -// config.videoBitratePIN = 1400; -// config.videoBitrateMax = 1800; -// config.videoFPS = 24; -// } -// -// if ([rotation isEqualToString:kReplayKit2Lanscape]) { -// config.sampleBufferSize = CGSizeMake(config.sampleBufferSize.height, config.sampleBufferSize.width); -// config.homeOrientation = HOME_ORIENTATION_RIGHT; -// } -// [_livePusher setConfig:config]; -//} -// -//- (void)showRecodingStatus:(BOOL)isShow -//{ -// if (isShow) { -// if (!_notification.notificationIsShowing) -// [_notification displayNotificationWithMessage:@"App录屏推流中" completion:nil]; -// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ -// [self showRecodingStatus:_isPushing]; -// }); -// } -// else { -// [_notification dismissNotification]; -// } -//} -// -// -//- (void)onPushEvent:(int)EvtID withParam:(NSDictionary *)param; { -// if (EvtID == PUSH_ERR_NET_DISCONNECT) { -// [self stopPush]; -// [_notification displayNotificationWithMessage:@"推流失败,请换个姿势再试一次" completion:nil]; -// } -// else if (EvtID == PUSH_EVT_PUSH_BEGIN) { -// // [_notification dismissNotification]; -// [_notification displayNotificationWithMessage:@"连接服务器成功,开始推流" forDuration:3]; -// [self showRecodingStatus:YES]; -// } else if (EvtID == PUSH_WARNING_NET_BUSY) { -// [_notification displayNotificationWithMessage:@"您当前的网络环境不佳,请尽快更换网络保证正常直播" forDuration:5]; -// } -//} -// -//- (void)onNetStatus:(NSDictionary *)param -//{ -// -//} +- (void)onScreenCaptureStoped:(int)reason { + [self.livePusher stopPush]; + [_btnReplaykit setTitle:LivePlayerLocalize(@"LivePusherDemo.ScreenPush.startpushstream") forState:UIControlStateNormal]; +} -//@end +#pragma mark - localNotification +- (void)sendLocalNotificationToHostAppWithTitle:(NSString*)title msg:(NSString*)msg userInfo:(NSDictionary*)userInfo +{ + UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; + + UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init]; + content.title = [NSString localizedUserNotificationStringForKey:title arguments:nil]; + content.body = [NSString localizedUserNotificationStringForKey:msg arguments:nil]; + content.sound = [UNNotificationSound defaultSound]; + content.userInfo = userInfo; + + // 在 设定时间 后推送本地推送 + UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger + triggerWithTimeInterval:0.1f repeats:NO]; + + UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"ReplayKit2Demo" + content:content trigger:trigger]; + + //添加推送成功后的处理! + [center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { + + }]; +} + + +@end