Windows 以动态库 dll 的形式提供接口;IOS 以静态库.a 或动态库的形式提供接口;android 以 aar 或 jar 包的形式提供接口,同时也支持 C 或 $\mathrm { C } { + + }$ 直接调用.so 的动态库;支持 U3D、Cocos 、uniapp 等开发。
集成 sdk 非常方便,只需要调用接口中 “start”的函数就可以(有些系统为 clinkStart)。函数的原型如:int start(string key)
key:为 sdk 密钥,可从“单实例控制面板”中获取。
注意:调用时如果key不完整或错误,程序会崩溃。如果密钥被删除了,使用该密钥的应用将无法通过“金盾”的验证,所以在密钥删除后必需把原来应用中配置的密钥也要进行更换。同一把密钥在每次点击获取时都会和上次的内容不一样,但上次获取的密钥也是可
用的,虽然它们的密文内容不一样但其实是同一把密钥,因为我们采用了动态加密,所以每次加密后的密文内容都不一样。
集成后需要到“单实例控制面板”根据你的应用,配置相应的转发规则。将客户端程序原来直接连接服务器的 IP 和端口改成转发规则中对应的以 127开头的 IP 及端口。
文件目录说明:“金盾 sdk\lib” 下是各操作系统对应的 sdk 文件,“金盾 sdk\demo”、“金盾sdk\demo 高级功能”是我们写的各操作系统下不同开发语言sdk 集成示例代码。
如有任何的疑问请和我们的客服联系。
“金盾 sdk\lib\windows\x86\clinkAPI.dll”为 32 位的 dll“金盾 sdk\lib\windows\x64\clinkAPI.dll”为 64 位的 dll“金盾 sdk\lib\windows\ClinkAPI.h”为接口头文件
函数的原型:extern $^ { \prime \prime } \mathrm { C } ^ { \prime \prime }$ CLINKAPI_API int clinkStart(const char * key)
功能:启动客户端安全接入组件(只需要调用一次,重复调用也不会出错,调用时内部会判断是否已启动过,如果已启动过直接返回第一次调用的结果。调用时因客户端网络不通返回了0,等网络正常后我们会自动重连,这时再调用会返回 150,这时如果没有调用业务也可正常运行)
参数:key:sdk 配置密钥。key不完整或错误,程序会崩溃。
返回:150表示成功,其它的值均为失败。150:成功、0:网络不通、1:已外部停止(如调用了停止函数,该函数一般不需要调用)、2:已内部停止(如运行过程中密钥被删除等)、170:实例到期或密钥不存在
最好是在进程启动后先调用该函数,这样后面的所有连接都可以通过安全接入组件进行数据转发。
注意:用 $c { + + }$ 时 Release 模式下编译才能正常调用本 dll 中的函数,在 Debug 模式下编译出来的exe或在开发工具中以调试运行将报错。
#include<iostream>
#include<string>
comment(lib, "../../../../../lib/windows/x86/clinkAPI.lib")
#include "../../../../../lib/windows/clinkAPI.h" //包含 api 头文件
int_tmain(int argc, _TCHAR* argv[])
{
/*如果编译报字符串太长,可以把下面的代码分多行写如:
char* key = "Asqa05ZoKFpJphMAAJpHsItVh6E/J67eQ"
"1X602sE1W3amXPuWYxvXrV6+bbv2p4...";
char* key = "Ai9oW..."; //定义sdk密钥。可从单实例控制面板的sdk密钥列表中获取。以实际为准
int ret = clinkStart(key); //启动(只需要调用一次,重复调用也不会出错)
if (ret == 150)
{
cout << "盾启动成功。ret=" << ret << endl;
}
else
{
cout << "盾启动失败。ret=" << ret << endl;
}
/*将客户端原来连接到服务器端的IP改成“实例转发规则”配置的那个以127开头的IP(例如转发规则里配置的是127.0.10.21:600转到202.23.56.9:600,原先的代码里连接的是202.23.56.9:600,现在要改成连接127.0.10.21:600),集成完成。
具体的可参考下面两行伪代码
connect("202.23.56.9", 600) 未集成盾前的连接
connect("127.0.10.21", 600) 集成盾后的连接
\*/
//如有任何的疑问请和我们的客服联系
system("pause");
return 0;
如果你的项目用不了静态库版本,可选择用动态库版本。
“金盾 sdk\lib\IOS\IOS 静态库版本\真机\libclinkAPI.a”为真机运行库
“金盾 sdk\lib\IOS\IOS 静态库版本\真机 Bitcode\libclinkAPI.a”为真机 Bitcode 运行库
“金盾 sdk\lib\IOS 静态库版本\模拟器和真机\libclinkAPI_x86_arm.a”为真机和模拟器运行库
“金盾 sdk\lib\IOS 静态库版本\模拟器和真机 Bitcode\libclinkAPI_x86_arm.a”为真机和模拟器 Bitcode 运行库
“金盾 sdk\lib\IOS 静态库版本\ClinkAPI.hpp”为接口头文件
class ClinkAPI
{
public: int start(const char \*key);
};
函数的原型:int start(const char * key)
功能:启动客户端安全接入组件(只需要调用一次,重复调用也不会出错,调用时内部会判断是否已启动过,如果已启动过直接返回第一次调用的结果。调用时因客户端网络不通返回了0,等网络正常后我们会自动重连,这时再调用会返回 150,这时如果没有调用业务也可正常运行)
参数:key:sdk 配置密钥。key不完整或错误,程序会崩溃。
返回:150表示成功,其它的值均为失败。150:成功、0:网络不通、1:已外部停止(如调用了停止函数,该函数一般不需要调用)、2:已内部停止(如运行过程中密钥被删除等)、170:实例到期或密钥不存在
最好是在进程启动后先调用该函数,这样后面的所有连接都可以通过安全接入组件进行数据转发。
用Xcode将你的项目打开;
把 libclinkAPI_x86_arm.a(根据自己具体情况选对应版本)的文件直接拖入你的项目中;
把 ClinkAPI.hpp 文件拷贝到项目的目录下;
把要调用接口的.m 文件改成扩展名的.mm(采用动态库版的不需要改),否则无法通过编译,因为如果文件是.m 编译器会以 c的形式调用而不是 $c { + + }$ 形式。
如果在真机运行项目把 Enable Bitcode 设成 yes(默认就为 yes),用的库又是非 Bitcode版本的运行会报错, 解决办法有两个:可以将项目 Enable Bitcode 设成 no 或用Bitcode 版本的库。
有些高版本的 xcode 在模拟器运行报错,是因为 cpu 是 M1 的,需要在 BuildSettings- $\cdot >$ Architectures- $\cdot >$ Excluded Architectures 中加上 arm64 (手动输入)
import "ViewController.h"
#include "ClinkAPI.hpp";//包含api头文件
@interfaceViewController()
@end
@implementationViewController
-(void) viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
TextView *txtMsg = [[UITextField alloc] init];
[self.view addSubview: txtMsg];
txtMsg.frame = CGRectMake(50, 60, 170, 40);
txtMsg(layer边境Width = 1.0; // 边框的宽度
txtMsg(layer.color = [Uicolor blueColor].CGColor; // 边框的颜色
txtMsg.placeholder = "@返回的状态";
char* key="Ai90W..."; // 定义sdk密钥。可从单实例控制面板的sdk密钥列表中获取。以实际为准
ClinkAPI api;//定义api对象
int ret = api.start(key); // 启动(只需要调用一次,重复调用也不会出错)
txtMsg.text = [NSSString stringWithFormat:@"盾启动返回:%d", ret];
}
/*将客户端原来连接到服务器端的IP改成“实例转发规则”配置的那个以127开头的IP(例如转发规则里配置的是127.0.0.1:7000转到202.23.56.9:7000,原先的代码里连接的是202.23.56.9:7000,现在要改成连接127.0.0.1:7000),集成完成。
具体的可参考下面两行伪代码connect("202.23.56.9",7000)未集成盾前的连接connect("127.0.0.1",7000)集成盾后的连接\*///如有任何的疑问请和我们的客服联系
}
- (void) didReceiveMemoryWarning{[super didReceiveMemoryWarning];// Disposefofany resources that can be recreated.
}
@end
“金盾 sdk\lib\IOS\IOS 动态库版本\真机\clinkFrwAPI.framework”为真机运行库“金盾 sdk\lib\IOS\IOS 动态库版本\真机 Bitcode\clinkFrwAPI.framework”为真机 Bitcode 运行库“金盾 sdklib\IOS\IOS 动态库版本\模拟器\clinkFrwAPI.framework”为模拟器运行库“金盾 sdk\lib\IOS\IOS 动态库版本\ClinkFrwAPI.hpp”为接口头文件
函数的原型:extern ${ } ^ { \prime \prime } \mathrm { C } ^ { \prime \prime }$ int clinkStart(const char * key);
功能:启动客户端安全接入组件(只需要调用一次,重复调用也不会出错,调用时内部会判断是否已启动过,如果已启动过直接返回第一次调用的结果。调用时因客户端网络不通返回了0,等网络正常后我们会自动重连,这时再调用会返回 150,这时如果没有调用业务也可正常运行)
参数:key:sdk 配置密钥。key不完整或错误,程序会崩溃。
返回:150表示成功,其它的值均为失败。150:成功、0:网络不通、1:已外部停止(如调用了停止函数,该函数一般不需要调用)、2:已内部停止(如运行过程中密钥被删除等)、170:实例到期或密钥不存在
最好是在进程启动后先调用该函数,这样后面的所有连接都可以通过安全接入组件进行数据转发。
将 clinkFrwAPI.framework 拷贝到你的工程路径下;
进入 TARGETS $> ^ { \cdot }$ 你的项目名称 $>$ General $>$ Frameworks, Libraries, and Embedded Content 菜单,点击 $^ +$ ,再点击 Add Other…,将刚才拷贝到工程下的 SDK 文件添加进去;
添加进去后要将 Embed 属性设置为 Embed & Sign,以使得 SDK 动态库和应用签名保持一致;
把 ClinkFrwAPI.hpp 文件拷贝到项目的目录下;
将 clinkFrwAPI.framework 拷贝到你的工程路径下;
进入 TARGETS $>$ 你的项目名称 $>$ General $>$ Embedded Binaries 菜单,点击 $^ +$ ,再点击 Add Other…,将刚才拷贝到工程下的 SDK 文件添加进去;
把 ClinkFrwAPI.hpp 文件拷贝到项目的目录下;
如果在真机运行项目把 Enable Bitcode 设成 yes(默认就为 yes),用的库又是非 Bitcode版本的运行会报错, 解决办法有两个:可以将项目 Enable Bitcode 设成 no 或用Bitcode 版本的库。
有些高版本的 xcode 在模拟器运行报错,是因为 cpu 是 M1 的,需要在 BuildSettings- $\cdot >$ Architectures- $\cdot >$ Excluded Architectures 中加上 arm64 (手动输入)
Undefined symbols for architecture arm64: 并且后面还有 declaration possibly missing extern "C"
需要用 sdk\lib\IOS\IOS 动态库版本\含有 externC 头\ClinkFrwAPI.hpp
覆 盖 掉 项 目 下 的 clinkFrwAPI.framework\Headers\ClinkFrwAPI.hpp 和 项 目 目 录 下 的ClinkFrwAPI.hpp 文件,共两处。这个问题在cocos 开发的项目集成时遇到过。
import "ViewController.h"
# include "ClinkFrxAPI.hpp" //包含api头文件
@interfaceViewController()
@end
@implementation ViewController
- (void) viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UITextField *txtMsg = [[UITextField alloc] init];
[ self.view addSubview:txtMsg ];
txtMsg.frame = CGRectMake(50, 60, 170, 40);
txtMsg(layer边境Width = 1.0; // 边框的宽度
txtMsg(layerBorderColor = [Uicolor blueColor].CGColor; // 边框的颜色
txtMsg.placeholder = "@返回的状态";
char* key="Ai9oW..."; //定义sdk密钥。可从单实例控制面板的sdk密钥列表中获取。以实际为准
int ret = clinkStart(key); //启动(只需要调用一次,重复调用也不会出错)
txtMsg.text = [NsString.withFormat:@"盾启动返回:%d", ret];
/*将客户端原来连接到服务器端的IP改成“实例转发规则”配置的那个以127开头的IP(例如转发规则里配置的是127.0.0.1:7000转到202.23.56.9:7000,原先的代码里连接的是202.23.56.9:7000,现在要改成连接127.0.0.1:7000),集成完成。
具体的可参考下面两行伪代码
connect("202.23.56.9", 7000) 未集成盾前的连接
connect("127.0.0.1", 7000) 集成盾后的连接
*/
//如有任何的疑问请和我们的客服联系
}
- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Disposefofany resources that can be recreated.
}
@end
“金盾 sdk\lib\IOS\IOS 动态库版本\真机\clinkFrwAPI.framework”为真机运行库
“金盾 sdk\lib\IOS\IOS 动态库版本\真机 Bitcode\clinkFrwAPI.framework”为真机 Bitcode 运行库
“金盾 sdklib\IOS\IOS 动态库版本\模拟器\clinkFrwAPI.framework”为模拟器运行库
“金盾 sdk\lib\IOS\IOS 动态库版本\ClinkFrwAPI.hpp”为接口头文件
“金盾 sdk\lib\IOS\IOS 动态库版本\ClinkAPISwift-Bridging-Header.h”为 Swift 桥接文件
函数的原型:extern $^ { \prime \prime } \mathrm { C } ^ { \prime \prime }$ int clinkStart(const char * key);
功能:启动客户端安全接入组件(只需要调用一次,重复调用也不会出错,调用时内部会判断是否已启动过,如果已启动过直接返回第一次调用的结果。调用时因客户端网络不通返回了0,等网络正常后我们会自动重连,这时再调用会返回 150,这时如果没有调用业务也可正常运行)
参数:key:sdk 配置密钥。key不完整或错误,程序会崩溃。
返回:150表示成功,其它的值均为失败。150:成功、0:网络不通、1:已外部停止(如调用了停止函数,该函数一般不需要调用)、2:已内部停止(如运行过程中密钥被删除等)、
170:实例到期或密钥不存在
最好是在进程启动后先调用该函数,这样后面的所有连接都可以通过安全接入组件进行数据转发。
将 clinkFrwAPI.framework 拷贝到你的工程路径下;
进入 TARGETS $> ^ { \cdot }$ 你的项目名称 $>$ General $>$ Frameworks, Libraries, and Embedded Content 菜单,点击 $^ +$ ,再点击Add Other…,将刚才拷贝到工程下的 SDK文件添加进去;
添加进去后要将Embed 属性设置为Embed & Sign,以使得 SDK动态库和应用签名保持一致;
把 ClinkFrwAPI.hpp 文件拷贝到项目的目录下;
把桥接文件 ClinkAPISwift-Bridging-Header.h 拷贝到项目的目录下;
进入 TARGETS $>$ 你的项目名称>BuildSettings >Swift Compiler – General 在 Objective-C BridgingHeader 里把 ${SRCROOT}/你的项目名/ClinkAPISwift-Bridging-Header.h 设置进去;

如果在真机运行项目把 Enable Bitcode 设成 yes(默认就为 yes),用的库又是非 Bitcode版本的运行会报错, 解决办法有两个:可以将项目 Enable Bitcode 设成 no 或用Bitcode 版本的库。
有些高版本的 xcode 在模拟器运行报错,是因为 cpu 是 M1 的,需要在 BuildSettings- $\cdot >$ Architectures- $\cdot >$ Excluded Architectures 中加上 arm64 (手动输入)
import UIKit
class ViewController: UIiviewController{ override func viewDidLoad() { super.viewDidLoad() let txtMsg $=$ UITextViewField( view.addSubview(txtMsg) txtMsg.frame $=$ CGRectMake(50,60,170,40) txtMsg(layer.buttonWidth $= 1.0$ //边框的宽度 txtMsg(layer.buttonColor $=$ UIColor.blue.bgColor//边框的颜色 txtMsg.placeholder $=$ "返回的状态" let key $=$ "Ai9oW..."//定义sdk密钥。可从单实例控制面板的sdk密钥列表中获取。以实际为准 let ret $=$ clinkStart(key)//启动(只需要调用一次,重复调用也不会出错) txtMsg.text $=$ "盾启动返回:" + " $\backslash$ (ret)"
/*将客户端原来连接到服务器端的IP改成“实例转发规则”配置的那个以127开头的IP(例如转发规则里配置的是127.0.0.1:7000转到202.23.56.9:7000,原先的代码里连接的是202.23.56.9:7000,现在要改成连接127.0.0.1:7000),集成完成。
具体的可参考下面两行伪代码connect("202.23.56.9",7000)未集成盾前的连接connect("127.0.0.1",7000)集成盾后的连接\*///如有任何的疑问请和我们的客服联系
}
“金盾 sdk\lib\android\clinkapi-release.aar”为包含真机和模拟器运行库
接口类:com.dun.clinkapi.Api
函数的原型:int start(String key)
功能:启动客户端安全接入组件(只需要调用一次,重复调用也不会出错,调用时内部会判断是否已启动过,如果已启动过直接返回第一次调用的结果。调用时因客户端网络不通返回了0,等网络正常后我们会自动重连,这时再调用会返回 150,这时如果没有调用业务也可正常运行)
参数:key:sdk 配置密钥。key不完整或错误,程序会崩溃。
返回:150表示成功,其它的值均为失败。150:成功、0:网络不通、1:已外部停止(如调用了停止函数,该函数一般不需要调用)、2:已内部停止(如运行过程中密钥被删除等)、170:实例到期或密钥不存在
最好是在进程启动后先调用该函数,这样后面的所有连接都可以通过安全接入组件进行数据转发。
用 AndroidStudio 将你的项目打开;
把clinkapi-release.aar拷贝到模块libs文件夹下;
在模块的build.gradle中的dependencies节点下增加sdk的引用:
implementation files('libs/clinkapi-release.aar')


package com.dun.clinkapical1;
import android.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity { com.dun.clinkapi.Api api $=$ null;//定义api对象 @Override protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextViewtvState $=$ (TextView)findViewByld(R.id.tvState); String key $=$ "Ai9ow...";//定义sdk密钥。可从单实例控制面板的sdk密钥列表中获取。 api $\equiv$ new com.dun.clinkapi.Api();//创建api对象 int ret $\equiv$ api.start(key); //启动(只需要调用一次,重复调用也不会出错) tvState.setText("启动盾返回:" $^+$ ret);
/*将客户端原来连接到服务器端的IP改成“实例转发规则”配置的那个以127开头的IP(例如转发
具体可参考下面两行伪代码connect("202.23.56.9",7000)未集成盾前的连接connect("127.0.0.1",7000)集成盾后的连接\*///如有任何的疑问请和我们的客服联系}@Overridepublicvoid onBackPressed(){System.exit(0);}
“金盾 sdk\lib\android\jar\clinkapi-release.jar”接口 jar 包
“金盾 sdk\lib\android\jar\armeabi\libclinkapi-lib.so”真机和模拟器运行库
“金盾 sdk\lib\android\jar\x86\libclinkapi-lib.so”模拟器运行库
接口类:com.dun.clinkapi.Api
函数的原型:int start(String key)
功能:启动客户端安全接入组件(只需要调用一次,重复调用也不会出错,调用时内部会判断是否已启动过,如果已启动过直接返回第一次调用的结果。调用时因客户端网络不通返回了0,等网络正常后我们会自动重连,这时再调用会返回 150,这时如果没有调用业务也可正常运行)
参数:key:sdk 配置密钥。key 不完整或错误,程序会崩溃。
返回:150表示成功,其它的值均为失败。150:成功、0:网络不通、1:已外部停止(如调用了停止函数,该函数一般不需要调用)、2:已内部停止(如运行过程中密钥被删除等)、170:实例到期或密钥不存在
最好是在进程启动后先调用该函数,这样后面的所有连接都可以通过安全接入组件进行数据转发。

在 工 程 属 性 ->Java Build Path->Libraries 中 选 择 “ Add External JARs ”, 选 定clinkapi-release.jar,确定后返回。 通过以上两步操作后,您就可以正常使用金盾 SDK为您提供的功能了。
打开 manifest.xml 增加网络访问权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.test"
android:versionCode="1"
android:versionName="1.0">
<uses-permission android:name="android流畅ration.INTERNET"/>
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"/>
<activity
android:name=".MainActivity"
android:label="@string/app_name"/>
<intent-filter>
<action android:name="android intent.action.MAIN" />
<category android:name="android intent.category.LAUNCHER" />
</intent-filter>
</activity>
</manifest>
package com.dun.clinkapitest;
import com.dun.clinkapitest.R;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
com.dun.clinkapi.Api api $=$ null;//定义 api 对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tvState $=$ (TextView) findViewById(R.id.tv);
String key $=$ "Ai9oW..." ; //定义sdk密钥。 可从单实例控制面板的sdk密钥列表中获取。
api $=$ new com.dun.clinkapi.Api();//创建api对象
int ret $=$ api.start(key); //启动(只需要调用一次, 重复调用也不会出错)
tvState.setText("返回:" + ret);
/*将客户端原来连接到服务器端的IP改成“实例转发规则”配置的那个以127开头的IP(例如转发规则里配
具体的可参考下面两行伪代码connect("202.23.56.9",7000) 未集成盾前的连接connect("127.0.0.1", 7000) 集成盾后的连接*/}
@Override
public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }
@Override
public boolean onOptionsItemSelected(Item item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id $=$ item.getItemId(); if (id $= =$ R.id.action_settings){ return true; } return super.onOptionsItemSelected(item); } @Override public void onBackPressed() { //Todo Auto-generated method stub System.exit(0); 1
DLL文件引用代码:
.版本 2
.DLL 命令 clinkStart, 整数型, "clinkAPI.dll", "@clinkStart"
.参数 文本, 文本型
执行DLL命令函数:
clinkStart (“key”)
易语言程序仅能调用 32 位 clinkAPI.dll,调用时请确认 dll 是否为 32 位(lib\windows\x86\clinkAPI.dll)。
调用流程:



“金盾 sdk\lib\Unity\ClinkSDKForUnity.cs”为 C#调用的类
“金盾 sdk\lib\Unity\clinkAPIForIOS.mm”为支持 ios 调用的中间接口函数
由于 Unity 开发一般要支持 windows、IOS、Android 所以还要用到这三个版本的 sdk 文件
public class ClinkSDKForUnity : MonoBehaviour
{ public static int Start(string key, out string sysName) { }
函数的原型:public static int Start(string key, out string sysName)
功能:启动客户端安全接入组件(只需要调用一次,重复调用也不会出错,调用时内部会判断是否已启动过,如果已启动过直接返回第一次调用的结果。调用时因客户端网络不通返回了0,等网络正常后我们会自动重连,这时再调用会返回 150,这时如果没有调用业务也可正常运行)
参数:key:sdk 配置密钥。key 不完整或错误,程序会崩溃。
sysName:返回的当前运行的宏定义系统名称(有助于分析是否执行了正确的代码)返回:150表示成功,其它的值均为失败。150:成功、0:网络不通、1:已外部停止(如调用了停止函数,该函数一般不需要调用)、2:已内部停止(如运行过程中密钥被删除等)、170:实例到期或密钥不存在
最好是在进程启动后先调用该函数,这样后面的所有连接都可以通过安全接入组件进行数据转发。
把 sdk\lib\Unity\ClinkSDKForUnity.cs 文件拖到 Assets 文件夹里;
在 Assets 下新建 Plugins 文件夹(如果已有就不用了);
把 sdk\lib\windows\x64\clinkAPI.dll 文件拖到 Plugins 文件夹里(根据你的实际情况来确定你是用 64 位版本的还是 32 位版本);
在 Plugins 文件夹下新建 Android 文件夹,用来放 android 的 sdk 文件;
把 sdk\lib\android\clinkapi-release.aar 文件拖到 Android 文件夹里
在 Plugins 文件夹下新建 IOS 文件夹,用来放 ios 的 sdk 文件;
把 sdk\lib\IOS\IOS 静态库版本\真机 Bitcode\ libclinkAPI.a 文件拖到 IOS 文件夹里(根据你实际情况来确定你用的是 Bitcode 版本还是非 Bitcode 版本);
把 sdk\lib\Unity\clinkAPIForIOS.mm 文件拖到 IOS 文件夹里;
到 此 windows、IOS、Android 三个端的 sdk 就 已 集 成 好了 , 你 只 需 要 调 用ClinkSDKForUnity.Start(string key, out string sysName)方法就可以启动我们的 sdk 了。下图为集成好的文件目录结构:
Assets 下:

Plugins 下:

Android 下:

IOS 下:

□ 1 1. 当点Unity开发工具里的 “执行”按钮执行过,就无法删除我们 windows 版本的 sdk 文件 clinkAPI.dll,或运行生成的 exe 时提示端口冲突;这是因为点“执行”时是由 Unity 执行的,Unity 加载了我们的 clinkAPI.dll 并执行,当你停止“执行”时 Unity并没有退出我们的 clinkAPI.dll,所以文件被占用了而且我们的sdk也是在运行的。你只要关闭 Unity开发工具重新打开就可以了。

这可能是你没把 clinkAPI.dll 拖到Plugins 文件夹里,或者是选的 64 位版本或 32 位版本和你实际的项目不符,只要删除现有的 clinkAPI.dll 重新选对版本就可以了。这里要注意,一般开发环境的操作系统是 64 位的,所以这个一般用的是 64 位版的 clinkAPI.dll,当程序发布成32位时最好先把这个文件换成32位版本的,不然会无法调用。特别要记得如果你的程序要发布出 32 位和 64 位两个版本,在发布前最好要先替换好对应版本的clinkAPI.dll,当然也可以在发布后把发布的出来的 clinkAPI.dll 用正确版本替换也可以。
当导出 IOS 项目在 xcode 里运行时出错,这可能是 IOS 版 sdk 的 Bitcode 版和非 Bitcode版本没选对。如果 sdk 文件用的是 Bitcode 版本那么 xcode 里要把 Enable Bitcode 设成Yes,如果你选的是非 Bitcode 版本 xcode 里要把 Enable Bitcode 设成 No。具体项目里是选Bitcode版本还是非 Bitcode版本要看你已集成的其它sdk选的是哪一种版本,所有 sdk 的 Bitcode 或非 Bitcode 要一致。如果你没有集成其它的 sdk,只有我们的 sdk,两种都可以,只要在 xcode 里设对就行。Unity 默认导出来的 IOS 项目 Enable Bitcode 是设为 Yes 的,也就是 Bitcode 版本。
如果你的项目里 android 只能用 jar 包不能用 aar 包,我们也是支持的,只是 Unity 的不同版本有点小的区别,如 Unity2018 和 Unity2021 在用 jar 包时就有点不同。具体操作只要把上面的第 5 步操作变一下就可以了,其它的操作都一样。Unity2018 版:把sdk\lib\android\clinkapi-release.jar 文 件 拷 贝 到 Android 文 件 夹 里 , 把sdk\lib\android\armeabi-v7a\libclinkapi-lib.so 文件拷贝到 Android 文件夹里。Unity2021版本:把 sdk\lib\android\jar 下的所有文件及文件夹拷贝到 Android 文件夹里。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CallApiTest : MonoBehaviour { // Start is called before the first frame update void Start() { }
// Update is called once per frame
void Update()
{
}
void OnGUI()
{
string key = "Ai9oW..."; //定义sdk密钥。可从单实例控制面板的sdk密钥列表中获取。
string sysName = "";
//返回的宏定义系统名称
int ret = ClinkSDKForUnity.Start(key, out sysName); //启动(只需要调用一次,重复调用也不会出错)
string msg = "";
if (ret == 150)
msg = "盾启动成功 ret=" + ret + " sysName=" + sysName;
else
msg = "盾启动失败。ret=" + ret + " sysName=" + sysName;
GUI.Label(new Rect(100, 150, 900, 900), msg);
/*将客户端原来连接到服务器端的IP改成“实例转发规则”配置的那个以127开头的IP(例如转发规则里配置是127.0.10.21:600转到202.23.56.9:600,原先的代码里连接的是202.23.56.9:600,现在要改成连接127.0.10.21:600)集成完成。
具体的可参考下面两行伪代码
connect("202.23.56.9", 600) 未集成盾前的连接
connect("127.0.10.21", 600) 集成盾后的连接
*/
//如有任何的疑问请和我们的客服联系
}
我们提供的是Uni-app 的“原生代码插件”,和你用的其它的“原生代码插件”的用法是一样的。目前“原生代码插件”只支持 android和ios,不支持微信小程序等。也就是需要项目通过HBuilder“发行->原生App-云打包”生成原生 App。
“金盾 sdk\lib\uni-app\dunClinkApiForUni”为 uniapp 原生代码插件(以前叫“原生插件”)
插件 name:dunClinkApiForUni
插件函数:start (key)
功能:启动客户端安全接入组件(只需要调用一次,重复调用也不会出错,调用时内部会判断是否已启动过,如果已启动过直接返回第一次调用的结果。调用时因客户端网络不通返回了0,等网络正常后我们会自动重连,这时再调用会返回 150,这时如果没有调用业务也可正常运行)
参数:key:sdk 配置密钥。key 不完整或错误,程序会崩溃。
返回:150表示成功,其它的值均为失败。150:成功、0:网络不通、1:已外部停止(如调用了停止函数,该函数一般不需要调用)、2:已内部停止(如运行过程中密钥被删除等)、170:实例到期或密钥不存在
最好是在进程启动后先调用该函数,这样后面的所有连接都可以通过安全接入组件进行数据转发。


关键调用代码只有三行:
const api $=$ uni.requireNativePlugin('dunClinkApiForUni');//获取插件对象
let key $\stackrel { - } { } $ "Ai9oW...";//定义 sdk密钥,值可从单实例控制面板的sdk 密钥列表中获取
let ret $=$ api.start(key);//启动客户端安全接入组件
如果在开发过程中需要电脑连接手机进行调试的,需要先“制作自定义调试基座”,再“运行项目中”选“使用自定义基座运行”,不能使用“标准基座运行”,因为“标准基座”没有我们的 sdk,所以也就调不到我们的函数了。
在插件或manifest.json 有变化时需要重新“制作自定义调试基座”。手机上原来的版本也最好卸载调,因为在更新手机上的基座时是通过版本名称来判断要不要更新的,如果新生成的基座版本没比手机上的大将不会更新手机上的基座,只更新里面的资源。
下图为制作自定义调试基座:


下图为使用自定义基座运行:




使用标准基座运行(G)

使用自定义基座运行(C)仕么是自定义基座
包名:uni.UNIDDC7B59 修改时间:2023/9/8 19:2:10 uniRuntimeVersion:3.8.12位置
故障排查指南
运行(O)
我们建议您先用 android 测试全部功能没问题后,再来通过 HBuilder“发行->原生App-云打包”生成出 ios 真机版本来测试,因为 ios 里我们放的是真机库所以只能真机运行。
具体的示例项目在:“sdk\demo\uni-app\clinkAPIcallForUniApp”
以下是示例中的代码:
<template> <view class $=$ "content"> <image class $\coloneqq$ "logo" src $\coloneqq$ "/static/logo.png"></image> <view class $\coloneqq$ "text-area"> <text class $\coloneqq$ "title">{{retStr}}></text> </view> <button @tap $\coloneqq$ "dunStart()">启动盾</button> </view>
</template>