快速接入

最近更新时间:2025-11-28 15:39:01

我的收藏

一、配置说明

1. VPN接入配置

1.1 开发者证书配置

需要增加 Network Extensions 和 AppGroup 配置:
App ID 配置增加 Network Extensions



新建 AppGroup(AppGroup 用于 Extension 进程与主进程通信,若项目中已有也可以复用)。




1.2 Xcode 配置

新建 NetworkExtension target。



主 targetNetworkExtension target 中分别增加 Capability,选择 Network Extension。



然后,勾选 Packet Tunnel




1.3 framework 引用配置

手动导入 xcframework:
MpAccSDK.framework :在主 target 和 Extension target 接入,主 target 选择 "Embed & Sign"。
NetworkExtension.framework:系统 framework,在主 target 和 Extension target 接入。
主 target 的配置如下:



Extension target 的配置如下:



通过 pod 集成 xcframework:
Podfile 文件:
target 'XXX' do
pod 'MpAccSDK', :podspec => 'https://mpspeedr-online-1258344699.cos.ap-guangzhou.myqcloud.com/go/ios/2.9.2.0/MpAccSDK.podspec'
end
主 target 的配置如下:



Extension target 的配置如下:




2. SOCKS5接入配置

2.1 导入xcframework

手动导入 xcframework:在 App target 中接入如下两个 Framework,配置如下:



通过 pod 集成 xcframework:
target 'XXX' do
pod 'MpAccSDK', :podspec => 'https://mpspeedr-online-1258344699.cos.ap-guangzhou.myqcloud.com/go/ios/2.9.2.0/MpAccSDK.podspec'
end
在 App target 中仅接入 Network.framework,配置如下:




2.2 添加 Privacy - Local Network Usage Description

对于 SOCKS5 代理,App 要对本地端口进行数据读写,会导致部分系统型号弹出本地网络询问弹框,所以需要配置该权限。

2.3 在 App 的 Scheme 中添加如下环境变量

Name: GODEBUG
Value: asyncpreemptoff=1
注意:
该变量只在 DEBUG 时生效。网络库的运行机制跟 Xcode DEBUG 信号(SIGURG)有冲突,导致 Xcode 调试时响应性能变差,可以用上面环境变量关闭对这个信号的响应。对于 Archive 包不受影响。




二、示例代码

1. VPN加速示例

1.1 App侧启动代码

Swift Code

class VPNViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 如果是单vpn模式SDK,则不需要配置该参数
MpAccClient.shared.accType = .vpn
//设置鉴权参数
MpAccClient.shared.setupDatakey(datakey: "xxxxx",
deviceId: "xxxxx")
//注册回调
MpAccClient.shared.registerAccCallback(self)
// 尝试恢复VPN
MpAccClient.shared.resumeVpn()
}
//启动加速
func startAcc() {
let config = AccConfig()
config.accMode = .Redundant // 加速模式 1:聚合 2:双发 3:rtc
config.pingInterval = 2
config.congrestionMode = .BBR
config.groupId = "com.xxxx" // AppGroup
config.vpnName = "XXXXXX" // VPN名称
config.whiteList = [] // 白名单,默认拦截所有ip
config.blackList = [] // 设置黑名单
// 启动VPN
MpAccClient.shared.start(config: config)
}
//停止加速
func stopAcc() {
MpAccClient.shared.stop()
}
}

extension VPNViewController: AccCallback {
func onAccSuccess(ip: String, port: Int) -> Void { }
func onAccFail(_ error: NSError?) -> Void { }
func onAccDataUpdate(tRx: Int64, tTx: Int64, pathDetails: [MpPathDetail]) -> Void { }
func onSummaryInfoUpdate(_ summaryInfo: String) -> Void { }
func onNetworkStateChanged(_ type: MpInterfaceType, available: Bool, ip: String) -> Void { }
}

OC Code

@interface ViewController () <AccCallback>
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// 如果是单vpn模式SDK,则不需要配置该参数
MpAccClient.shared.accType = AccTypeVpn;
// Do any additional setup after loading the view.
[MpAccClient.shared registerAccCallback:self];
[MpAccClient.shared setupDatakey:@"xxxxxxx"
deviceId:@"xxxxxxx"];
[MpAccClient.shared resumeVpn];
}

- (void)startVpn {
AccConfig *config = [AccConfig new];
/// 加速模式 1:聚合 2:双发 3:rtc
config.accMode = AccModeRedundant;
config.pingInterval = 2;
config.congrestionMode = MpCongrestionModeBBR;
config.groupId = @"group.xxxxxxxx";
config.vpnName = @"Test_name3";
config.whiteList = @[];
config.blackList = @[];
[MpAccClient.shared startWithConfig:config];
}
- (void)stopAcc {
[MpAccClient.shared stop];
}

// AccCallback
- (void)onAccSuccessWithIp:(NSString *)ip port:(NSInteger)port {
}
- (void)onAccFail:(NSError *)error {
}
- (void)onAccDataUpdateWithTRx:(int64_t)tRx tTx:(int64_t)tTx pathDetails:(NSArray<MpPathDetail *> *)pathDetails {
}
- (void)onSummaryInfoUpdate:(NSString *)summaryInfo {
}
- (void)onNetworkStateChanged:(enum MpInterfaceType)type available:(BOOL)available ip:(NSString *)ip {
}
@end

1.2 VPN Extension

在 Xcode 的 Extension target 中自动生成的 PacketTunnelProvider 中增加如下代码:

Swift Code

class PacketTunnelProvider: NEPacketTunnelProvider {
var tunnelManager: MpPacketTunnelManager = MpPacketTunnelManager()
override func startTunnel(options: [String : NSObject]?, completionHandler: @escaping (Error?) -> Void) {
//调用SDK的startTunnel方法
tunnelManager.startTunnel(packetTunnel: self, options: options, completionHandler: completionHandler);
}
override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
//调用SDK的stopTunnel方法
tunnelManager.stopTunnel()
completionHandler()
}
override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) {
//调用SDK的handleAppMessage方法
tunnelManager.handleAppMessage(messageData, completionHandler: completionHandler);
}
}

OC Code

@interface PacketTunnelProvider() {
MpPacketTunnelManager *tunnelManager;
}
@end
@implementation PacketTunnelProvider

- (id)init {
self = [super init];
if (self != NULL) {
tunnelManager = [[MpPacketTunnelManager alloc] init];
}
return self;
}

- (void)startTunnelWithOptions:(NSDictionary *)options completionHandler:(void (^)(NSError *))completionHandler {
//调用SDK的startTunnel方法
[tunnelManager startTunnelWithPacketTunnel:self options:options completionHandler:completionHandler];
}

- (void)stopTunnelWithReason:(NEProviderStopReason)reason completionHandler:(void (^)(void))completionHandler {
//调用SDK的stopTunnel方法
[tunnelManager stopTunnel];
completionHandler();
}

- (void)handleAppMessage:(NSData *)messageData completionHandler:(void (^)(NSData *))completionHandler {
//调用SDK的handleAppMessage方法
[tunnelManager handleAppMessage:messageData completionHandler:completionHandler];
}
@end

2. SOCKS5加速示例

2.1 Swift Code(Alamofire为例)

import Alamofire
class Socks5ViewController: UIViewController {
private var afs: Session = AF
// 开始加速
func startAcc() {
// 加速方式,若单SOCKS5_SDK,则忽
MpAccClient.shared.accType = .socks5;
let config = AccConfig()
// 启动socks5
MpAccClient.shared.start(config: config)
}
}
extension Socks5ViewController: AccCallback {
func onAccSuccess(ip: String, port: Int) -> Void {
let sessionConfig = URLSessionConfiguration.default
sessionConfig.connectionProxyDictionary = [
kCFStreamPropertySOCKSProxyHost : "127.0.0.1",
// config.socksProxyPort
kCFStreamPropertySOCKSProxyPort : "xxxxxx",
]
afs = Session(configuration: sessionConfig)
}
}

2.2 OC Code(只有启动部分,HTTP请求可参考Swift代码)

@interface ViewController () <AccCallback>
@end

@implementation ViewController
- (void)startVpn {
// 若单SOCKS5_SDK,则忽略该字段
MpAccClient.shared.accType = AccTypeSocks5;
AccConfig *config = [AccConfig new];
// 参数设置
[MpAccClient.shared startWithConfig:config];
}

// AccCallback
- (void)onAccSuccessWithIp:(NSString *)ip port:(NSInteger)port {
// AFNetworking的设置类似Alamofire
}
@end

三、常见问题解答

1. 编译报Swift错误
由于 SDK 是 Swift 编写,需要 Swift 的运行环境。Objective-C 接入 SDK 时,需要在引入的 App 工程或者 CocoaPods 仓库中创建一个 Swift 空文件。
SDK 是由 Xcode 15 编译,Xcode 14 使用 SDK 时会报 Swift 兼容问题,需要升级 Xcode。
2. 签名问题
Xcode 默认不会对嵌套 SDK 进行签名,所以客户的 SDK 不要嵌套 MPAccSDK。或者客户编写脚本对其进行签名。
3. TRTC 插件接入注意事项
TRTC XCFramework 报错,升级 CocoaPods,12.1以前版本有 Bug。
加速放到进入房间之后,否则加速组件无法获取 TRTC 相关信息。
4. SOCKS5 模式加速,Xcode 联调卡顿问题
原因:网络库的运行机制跟 Xcode DEBUG 信号(SIGURG)有冲突,导致 Xcode 联调时响应性能变差。
解决:添加 GODEBUG 环境变量,值为 asyncpreemptoff = 1。可以用上面环境变量关闭对这个信号的响应。对于 Archive 包不受影响。
具体设置方法可以参考:配置说明和 SOCKS5 接入配置。
5. SOCKS5 模式 Privacy - Local Network Usage Description 弹框问题
原因:加速时,App 需要对本地端口网络进行数据读写,导致部分系统型号会弹出相应弹窗询问。
解决:需要配置 Privacy - Local Network Usage Description 权限描述。