Skip to content

Commit 045dba5

Browse files
committed
feat: release TcrSdk 3.10.0 and TcrProxy SDK 1.0.0
1 parent 4cc6ac7 commit 045dba5

File tree

22 files changed

+507
-2
lines changed

22 files changed

+507
-2
lines changed

Demo/TCRDemo/TCGDemo/TCGDemoGamePlayVC.m

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#import "TCGDemoAudioCapturor.h"
1818
#import <CoreMotion/CoreMotion.h>
1919
#import "video_capture/TCGCameraVideoCapturer.h"
20+
#import <TCRPROXYSDK/Proxy.h>
2021

2122
@interface TCGDemoGamePlayVC () <TcrSessionObserver, TCGDemoTextFieldDelegate, CustomDataChannelObserver, TCGDemoSettingViewDelegate, TCRLogDelegate,
2223
VideoSink, AudioSink, TcrRenderViewObserver, TCGDemoMultiSettingViewDelegate, UIGestureRecognizerDelegate>
@@ -371,6 +372,16 @@ - (void)keyboardWillHide:(NSNotification *)notificationP {
371372
}
372373

373374
#pragma mark--- TCGDemoSettingViewDelegate ---
375+
- (void)onStartProxy{
376+
[[Proxy sharedInstance] startProxy];
377+
NSLog(@"onStartProxy");
378+
}
379+
380+
- (void)onStopProxy{
381+
[[Proxy sharedInstance] stopProxy];
382+
NSLog(@"onStopProxy");
383+
}
384+
374385
- (void)settingBtnClick:(id)sender {
375386
self.settingView.hidden = !self.settingView.isHidden;
376387
}
@@ -675,6 +686,12 @@ - (void)onEvent:(TcrEvent)event eventData:(id)eventData {
675686
[self onEnableLocalAudio:[info[@"status"] isEqualToString:@"open"]];
676687
break;
677688
}
689+
case PROXY_RELAY_AVAILABLE: {
690+
NSLog(@"ApiTest 收到代理初始化消息:%@", (NSString *)eventData);
691+
BOOL ok = [[Proxy sharedInstance] initWithRelayInfoString: (NSString *)eventData];
692+
NSLog(@"ProxyManager 初始化Proxy %@", ok ? @"成功" : @"失败");
693+
break;
694+
}
678695

679696
default:
680697
break;

Demo/TCRDemo/TCGDemo/TCGDemoSettingView.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ typedef NS_ENUM(NSInteger, TcrKeyboardCode) {
4747
- (void)enableCoreMotion:(BOOL)enable;
4848

4949
- (void)onKeyboard:(int)keycode;
50+
- (void)onStartProxy;
51+
- (void)onStopProxy;
5052

5153
@end
5254

Demo/TCRDemo/TCGDemo/TCGDemoSettingView.m

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ @interface TCGDemoSettingView ()
4242
@property (nonatomic, strong) UIButton *sendMenuKeyBtn;
4343
@property (nonatomic, strong) UIButton *sendVolumeUpKeyBtn;
4444
@property (nonatomic, strong) UIButton *sendVolumeDownKeyBtn;
45+
@property (nonatomic, strong) UIButton *startProxyBtn;
46+
@property (nonatomic, strong) UIButton *stopProxyBtn;
4547
@property (nonatomic, strong) UILabel *allInfo;
4648
@property (nonatomic, assign) BOOL isFrontCamera;
4749

@@ -128,7 +130,8 @@ - (void)initSubViews {
128130
self.sendMenuKeyBtn = [self createBtnFrame:CGRectMake(left + 170, 340, 70, 25) title:@"菜单键"];
129131
self.sendVolumeUpKeyBtn = [self createBtnFrame:CGRectMake(left + 250, 340, 70, 25) title:@"音量加"];
130132
self.sendVolumeDownKeyBtn = [self createBtnFrame:CGRectMake(left + 250, 380, 70, 25) title:@"音量减"];
131-
133+
self.startProxyBtn = [self createBtnFrame:CGRectMake(left + 10, 380, 70, 25) title:@"开始代理"];
134+
self.stopProxyBtn = [self createBtnFrame:CGRectMake(left + 90, 380, 70, 25) title:@"停止代理"];
132135

133136
self.capsLockBtn = [self createBtnFrame:CGRectMake(left + 90, 220, 70, 25) title:@"查询大写"];
134137
self.touchViewBtn = [self createBtnFrame:CGRectMake(left + 90, 260, 70, 25) title:@"禁用触屏"];
@@ -185,6 +188,8 @@ - (void)initSubViews {
185188
[self addSubview:self.sendMenuKeyBtn];
186189
[self addSubview:self.sendVolumeUpKeyBtn];
187190
[self addSubview:self.sendVolumeDownKeyBtn];
191+
[self addSubview:self.startProxyBtn];
192+
[self addSubview:self.stopProxyBtn];
188193
}
189194

190195
- (void)controlBtnClick:(id)sender {
@@ -327,6 +332,10 @@ - (void)controlBtnClick:(id)sender {
327332
[self.delegate onKeyboard:KEYCODE_VOLUME_UP];
328333
} else if (sender == self.sendVolumeDownKeyBtn) {
329334
[self.delegate onKeyboard:KEYCODE_VOLUME_DOWN];
335+
} else if (sender == self.startProxyBtn) {
336+
[self.delegate onStartProxy];
337+
} else if (sender == self.stopProxyBtn) {
338+
[self.delegate onStopProxy];
330339
}
331340
}
332341

Doc/Release_Notes_EN-US.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
[中文文档](历史版本.md)
22

3+
### Version 3.10.0 (2025-8.30)
4+
Features
5+
- Pass proxy relay information through the PROXY_RELAY_AVAILABLE event.
6+
37
### Version 3.9.1 (2025-8.2)
48
Bug Fixes
59
- Fix and optimize some known issues

Doc/代理SDK接入指南.md

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
# TcrProxy iOS SDK 接入说明
2+
3+
本文档介绍如何通过 TcrProxy iOS SDK,将本地 iOS 设备变成云端实例的网络代理,实现访问客户端网络的能力。适用于访问局域网 NAS 等设备场景。
4+
5+
## 接入声明
6+
7+
> **重要提示:**
8+
> 当代理功能开启后,云端实例的所有网络访问流量将会经由本地客户端设备转发,即“云端应用请求 → 互联网 → 真机客户端 → 互联网 → 真机客户端 → 互联网 → 云端应用响应”。
9+
> 由于链路较长,并且受限于客户端设备的上行带宽,极有可能导致云端实例访问网页时出现卡顿、延迟甚至无法联网等问题。请务必根据实际网络环境评估代理能力,避免因带宽瓶颈影响业务体验。
10+
11+
## 目录
12+
13+
- [功能简介](#功能简介)
14+
- [集成准备](#集成准备)
15+
- [权限与配置](#权限与配置)
16+
- [代理服务接入流程](#代理服务接入流程)
17+
- [代码示例](#代码示例)
18+
- [Proxy接口说明](#proxy接口说明)
19+
20+
---
21+
22+
## 功能简介
23+
24+
- **本地代理**:将本地设备变为云端实例的网络出口,所有云端流量通过本地设备转发。
25+
26+
---
27+
28+
## 集成准备
29+
30+
1. **添加依赖**
31+
32+
使用 [CocoaPods](https://cocoapods.org/):
33+
34+
```ruby
35+
pod 'TCRPROXYSDK', :git => 'https://github.com/tencentyun/cloudgame-ios-sdk.git', :tag => 'TCRPROXYSDK/1.0.0'
36+
```
37+
38+
安装依赖:
39+
40+
```
41+
pod install
42+
```
43+
44+
2. 导入头文件
45+
46+
```objc
47+
#import <TCRPROXYSDK/Proxy.h>
48+
```
49+
50+
---
51+
52+
## 权限与配置
53+
54+
iOS 无需特殊权限,亦无需在 Info.plist 中声明特殊内容,但请确保应用具备网络访问能力,已配置必要的权限(如本地网络、蜂窝数据、Wi-Fi)。
55+
56+
---
57+
58+
## 代理服务接入流程
59+
60+
### 1. 监听代理中继信息下发
61+
62+
在接入 TCR SDK 时,需要监听 `TcrSessionObserver` 回调的 `PROXY_RELAY_AVAILABLE` 事件。当收到此事件时可获取到云端下发的代理中继信息 (`relayInfoString`)。
63+
64+
**示例:**
65+
66+
```objc
67+
#pragma mark --- TcrSessionObserver ---
68+
- (void)onEvent:(TcrEvent)event eventData:(id)eventData {
69+
switch (event) {
70+
case PROXY_RELAY_AVAILABLE: {
71+
NSString *relayInfo = (NSString *)eventData;
72+
BOOL ok = [[Proxy sharedInstance] initWithRelayInfoString:relayInfo];
73+
NSLog(@"Proxy 初始化%@", ok ? @"成功" : @"失败");
74+
break;
75+
}
76+
default:
77+
break;
78+
}
79+
}
80+
```
81+
82+
> **备注:**
83+
> 必须收到并成功初始化后,才能启动代理服务。
84+
85+
### 2. 启动代理
86+
87+
初始化成功后,可调用如下接口启动代理:
88+
89+
```objc
90+
[[Proxy sharedInstance] startProxy];
91+
```
92+
93+
### 3. 停止代理
94+
95+
不再需要代理或生命周期结束时,请及时调用:
96+
97+
```objc
98+
[[Proxy sharedInstance] stopProxy];
99+
```
100+
101+
> **建议调用顺序:**
102+
> 1. 初始化(收到 PROXY_RELAY_AVAILABLE 并调用 `initWithRelayInfoString:`
103+
> 2. 启动代理(`startProxy`
104+
> 3. 停止代理(`stopProxy`
105+
106+
---
107+
108+
## 代码示例
109+
110+
```objc
111+
// 1. 监听代理中继信息回调(以 TcrSessionObserver 示例)
112+
- (void)onEvent:(TcrEvent)event eventData:(id)eventData {
113+
if (event == PROXY_RELAY_AVAILABLE) {
114+
NSString *relayInfoString = (NSString *)eventData;
115+
// 初始化代理(带宽参数可选)
116+
BOOL ok = [[Proxy sharedInstance] initWithRelayInfoString:relayInfoString];
117+
if (ok) {
118+
// 2. 启动代理
119+
[[Proxy sharedInstance] startProxy];
120+
}
121+
}
122+
}
123+
124+
// 3. 不再需要代理时
125+
[[Proxy sharedInstance] stopProxy];
126+
```
127+
128+
---
129+
130+
## Proxy接口说明
131+
132+
| 方法名 | 说明 | 参数说明 | 返回值 | 备注 |
133+
| ------------------------------------------------------------------------------------------------------ | ------------ | --------------------------------------------------------- | ------ | ------------------ |
134+
| `+ (instancetype)sharedInstance` | 获取单例,日志默认级别4 || Proxy* | 单例模式 |
135+
| `+ (instancetype)sharedInstanceWithLogLevel:(NSInteger)logLevel` | 获取单例,指定日志级别 | logLevel: 2-VERBOSE, 3-DEBUG, 4-INFO, 5-WARNING, 6-ERROR | Proxy* | 仅本地调试时用到 |
136+
| `- (BOOL)initWithRelayInfoString:(NSString *)relayInfoString` | 初始化代理服务 | relayInfoString: 云端下发的代理中继信息 | BOOL | 必须在 startProxy 前调用 |
137+
| `- (BOOL)initWithBandwidth:(nullable NSString *)bandwidth relayInfoString:(NSString *)relayInfoString` | 初始化代理服务并限制带宽 | bandwidth: @"1MB"/@"500KB"(最大 4MB)<br>relayInfoString: 同上 | BOOL | 必须在 startProxy 前调用 |
138+
| `- (void)startProxy` | 启动代理服务 ||| 必须已成功调用初始化方法 |
139+
| `- (void)stopProxy` | 停止代理服务 ||| |
140+
141+
---
142+
143+
### 其他说明
144+
145+
- iOS SDK 采用全局单例模式设计,建议在应用合适生命周期同步初始化、关闭代理,避免后台无故长时间占用资源。

Doc/历史版本.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
[English document](Release_Notes_EN-US.md)
22

3+
### Version 3.10.0 (2025-8.30)
4+
Features
5+
- 通过 PROXY_RELAY_AVAILABLE 事件传递代理中继信息
6+
37
### Version 3.9.1 (2025-8.22)
48
Bug Fixes
59
- 修复和优化一些已知问题
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>AvailableLibraries</key>
6+
<array>
7+
<dict>
8+
<key>BinaryPath</key>
9+
<string>TCRPROXYSDK.framework/TCRPROXYSDK</string>
10+
<key>LibraryIdentifier</key>
11+
<string>ios-arm64_x86_64-simulator</string>
12+
<key>LibraryPath</key>
13+
<string>TCRPROXYSDK.framework</string>
14+
<key>SupportedArchitectures</key>
15+
<array>
16+
<string>arm64</string>
17+
<string>x86_64</string>
18+
</array>
19+
<key>SupportedPlatform</key>
20+
<string>ios</string>
21+
<key>SupportedPlatformVariant</key>
22+
<string>simulator</string>
23+
</dict>
24+
<dict>
25+
<key>BinaryPath</key>
26+
<string>TCRPROXYSDK.framework/TCRPROXYSDK</string>
27+
<key>LibraryIdentifier</key>
28+
<string>ios-arm64</string>
29+
<key>LibraryPath</key>
30+
<string>TCRPROXYSDK.framework</string>
31+
<key>SupportedArchitectures</key>
32+
<array>
33+
<string>arm64</string>
34+
</array>
35+
<key>SupportedPlatform</key>
36+
<string>ios</string>
37+
</dict>
38+
</array>
39+
<key>CFBundlePackageType</key>
40+
<string>XFWK</string>
41+
<key>XCFrameworkFormatVersion</key>
42+
<string>1.0</string>
43+
</dict>
44+
</plist>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//
2+
// Proxy.h
3+
// PROXY
4+
//
5+
// Created by cyy on 2025/8/28.
6+
//
7+
8+
#import <Foundation/Foundation.h>
9+
10+
NS_ASSUME_NONNULL_BEGIN
11+
12+
/// 代理服务核心入口
13+
@interface Proxy : NSObject
14+
15+
/// 单例获取(默认日志级别4 Info)
16+
+ (instancetype)sharedInstance;
17+
18+
/// 单例获取(可指定日志级别,2-VERBOSE,3-DEBUG,4-INFO,5-WARNING,6-ERROR)
19+
+ (instancetype)sharedInstanceWithLogLevel:(NSInteger)logLevel;
20+
21+
/// 初始化代理服务(必须先于 startProxy 调用)
22+
/// @param relayInfoString 云端下发的代理中继信息
23+
/// @return 初始化是否成功
24+
- (BOOL)initWithRelayInfoString:(NSString *)relayInfoString;
25+
26+
/// 初始化代理服务(宽带参数版,必须先于 startProxy 调用)
27+
/// @param bandwidth 设备带宽(如 @"1MB" 或 @"500KB"),最大 4MB
28+
/// @param relayInfoString 云端下发的代理中继信息
29+
/// @return 初始化是否成功
30+
- (BOOL)initWithBandwidth:(nullable NSString *)bandwidth relayInfoString:(NSString *)relayInfoString;
31+
32+
/// 启动代理服务。须先 init 成功
33+
- (void)startProxy;
34+
35+
/// 停止代理服务
36+
- (void)stopProxy;
37+
38+
@end
39+
40+
NS_ASSUME_NONNULL_END
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//
2+
// TCRPROXYSDK.h
3+
// TCRPROXYSDK
4+
//
5+
// Created by cyy on 2025/8/28.
6+
//
7+
8+
#import <Foundation/Foundation.h>
9+
10+
//! Project version number for TCRPROXYSDK.
11+
FOUNDATION_EXPORT double TCRPROXYSDKVersionNumber;
12+
13+
//! Project version string for TCRPROXYSDK.
14+
FOUNDATION_EXPORT const unsigned char TCRPROXYSDKVersionString[];
15+
16+
#import <TCRPROXYSDK/Proxy.h>
Binary file not shown.

0 commit comments

Comments
 (0)