UnitySDK接入说明文档
一、说明
1.适用范围
本文档适用于使用 Unity 来开发的移动端 APP 或产品。 本文档适用于 Android 4.0 及以上的安卓系统,及 iOS 8.0 及以上的苹果系统.
2.SDK 下载
- 最新 SDK 版本为:V1.0.0
- 下载地址
二、接入流程
1.申请APPKEY
1)打开 https://console.appadhoc.com/#/login ,使用您的 A/B 账号进行登录。 2)进入“应用列表”,点击右上方“新建应用”,完成应用创建,您将获得一串APPKEY,形如:ADHOC_ac66bf61-7608-4a5f-9bc4-9e7cf0f9694f 如果您已经完成应用创建,请在应用列表页面进行APPKEY的查看 APPKEY为应用的唯一标识,用于集成到SDK中。 注:为了保证您的数据安全,请勿泄露您的APPKEY。
2.导入SDK
1)前往最新 SDK 下载地址,下载 SDK 压缩包,解压至本地目录。 2)导入方法:将 zip 包解压缩后将包内 Assets 文件夹下的文件拷贝到项目 Assets 下。
3.接入SDK
详见“三、接入方法说明”
三、接入方法说明
1)Android
1.权限与配置
1.1 权限列表
在项目中找到项目配置文件 AndroidManifest.xml,加入网络访问等权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
//读取手机IMEI的权限,须在获得此权限后再初始化SDK,如果缺少此权限,会以AndroidID作为设备唯一标识符
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
//获取wifi状态权限
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
//读写sd卡的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
1.2 在应用的 build.gradle 下增加如下配置
android{
...
defaultConfig{
...
ndk { abiFilters 'armeabi-v7a','x86','arm64-v8a','x86_64','armeabi' }
}
packagingOptions {
doNotStrip "*/armeabi-v7a/*.so"
doNotStrip "*/x86/*.so"
doNotStrip "*/arm64-v8a/*.so"
doNotStrip "*/x86_64/*.so"
doNotStrip "armeabi.so"
}
}
2.java 混淆相关
在 proguard-rules.txt 文件中加入:
-dontwarn com.bun.miitmdid.**
-dontwarn com.adhoc.**
-keep class com.bun.miitmdid.** {*;}
-keep class com.adhoc.** {*;}
//标准包可视化编辑反射使用到ViewPager和RecyclerView避免混淆,support版本
-keep class android.support.v4.view.ViewPager{*;}
-keep class android.support.v4.view.ViewPager$*{*;}
-keep class android.support.v7.widget.RecyclerView{*;}
-keep class android.support.v7.widget.RecyclerView$*{*;}
-keep class * extends android.support.v7.widget.RecyclerView$Adapter
//避免混淆ViewPager和RecyclerView AndroidX版本
-keep class androidx.viewpager.widget.ViewPager{*;}
-keep class androidx.viewpager.widget.ViewPager$*{*;}
-keep class androidx.recyclerview.widget.RecyclerView{*;}
-keep class androidx.recyclerview.widget.RecyclerView$*{*;}
-keep class * extends androidx.recyclerview.widget.RecyclerView$Adapter
2)iOS
1. 添加依赖库
检查 TARGETS --> Build Phases --> Link Binary With Libraries 选项下是否已经加入 Security.framework,CFNetwork.framework,CoreTelephony.framework,AdSupport.framework,SystemConfiguration.framework ,AVFoundation.framework,AdhocSDK.framework,如果没有,请手动加入。并手动链接libsqlite3.tbd和libicucore.tbd:
2. 项目参数配置
在 TARGETS --> Build Settings 选项下 Other Linker Flags 中设置链接器参数: -ObjC
。
3. 权限配置
- 在 info.plist 文件中添加相机权限:
- 为了保证用户的唯一性,SDK将设备ID存储在本地Keychain中,iOS10需在Capabilities中打开Keychain sharing
四、SDK 方法说明
1.初始化 SDK
SDK 启动接口。
public static void init(string appKey, enableDebugAssist)
参数说明
参数 | 类型 | 说明 |
---|---|---|
appKey | string | 从 www.appadhoc.com 上申请的 AppKey |
enableDebugAssist | bool | 是否显示悬浮窗 |
示例代码
AdhocSDK.init("ADHOC_xxxx", true);
2. 获取试验变量值
2.1 从缓存获取试验变量值
获取后台设置的指定的试验变量的值,试验变量的名字注意与后台保持一致。该方法从 SDK 缓存中直接读取。如需从服务器获取 flag
值,请使用下面的 asynchronousGetFlag
方法。
public static string getFlag(string flagName, string defaultValue)
参数说明
参数 | 类型 | 说明 |
---|---|---|
flagName | string | www.appadhoc.com 控制台上设置的试验变量名字 |
defaultValue | string | 试验变量的默认值 |
示例代码
string flagValue = AdhocSDK.getFlag("xxxx", "1");
2.2 从服务器获取试验变量值
public void asynchronousGetFlag(string flagName, string defaultValue, asynchronousGetFlagResultHandler handler)
参数说明
参数 | 类型 | 说明 |
---|---|---|
flagName | string | www.appadhoc.com 控制台上设置的试验变量名字 |
defaultValue | string | 试验变量的默认值 |
handler | asynchronousGetFlagResultHandler | 回调 |
asynchronousGetFlagResultHandler 定义如下:
public asynchronousGetFlagResultHandler asynchronousGetFlagHandler;
public delegate void asynchronousGetFlagResultHandler(string flagValue, string errorMsg);
示例代码
void myHandler(string flagValue, string errorMsg) {
if (errorMsg != null) {
Debug.Log("error=" + errorMsg);
} else {
Debug.Log("value=" + flagValue);
}
}
AdhocSDK sdk = new AdhocSDK();
sdk.asynchronousGetFlag("xxx", "10086", myHandler);
3. 统计优化指标
根据在 www.appadhoc.com 控制台设置的优化指标名称,上报指标数据。
3.1 无用户自定义属性
public static void track(string indexName, int indexValue)
参数说明
参数 | 类型 | 说明 |
---|---|---|
indexName | string | www.appadhoc.com 控制台定义的优化指标名称 |
indexValue | int | 统计数值 |
示例代码
AdhocSDK.track("xxxx", 1);
3.2 有用户自定义属性
public static void track(string indexName, int indexValue, Hashtable attribute)
参数说明
参数 | 类型 | 说明 |
---|---|---|
indexName | string | 对应AppAdhoc控制台定义的优化指标名称 |
indexValue | int | 统计数值 |
attribute | Hashtable | 用户自定义属性 |
示例代码
Hashtable atrribute = new Hashtable();
atrribute.Add("Name", "Tom");
atrribute.Add("City", "Beijing");
AdhocSDK.track("xxxx", 1, atrribute);
4. 试验信息
4.1 获取当前设备所在试验的试验列表
public static string currentExperiments()
返回值说明
类型 | 说明 |
---|---|
string | JSON 字符串。 1.数组中只有 CONTROL,代表未进入任何试验。2.数组中存在一个或多个字典,代表进入一个或多个试验 { id = “试验版本 ID”; name = “试验名称”; } |
示例代码
string currentExperimentsJSON = AdhocSDK.currentExperiments();
4.2 根据试验变量名称获取当前设备所在试验的试验列表
public static string currentExperiments(string flagName)
参数说明
参数 | 类型 | 说明 |
---|---|---|
flagName | string | www.appadhoc.com 控制台上设置的试验变量名字 |
返回值说明
类型 | 说明 |
---|---|
string | JSON 字符串。 1.数组中只有 CONTROL,代表未进入任何试验。2.数组中存在一个或多个字典,代表进入一个或多个试验 { id = “试验版本 ID”; name = “试验名称”; } |
示例代码
string currentExperimentsJSON = AdhocSDK.currentExperiments("xxxx");
4.3 根据试验变量名称获取当前设备是否已经进入试验
public static bool isJoinedExperiments(string flagName)
参数说明
参数 | 类型 | 说明 |
---|---|---|
flagName | string | www.appadhoc.com 控制台上设置的试验变量名字 |
返回值说明
类型 | 说明 |
---|---|
bool | flagName 对应的试验版本是否已经进入 |
示例代码
bool isJoinedExperiments = AdhocSDK.isJoinedExperiments("xxxx");
5. ClientID
5.1 获取 ClientID
public static string getClientID()
返回值说明
类型 | 说明 |
---|---|
string | clientID |
示例代码
string clientID = AdhocSDK.getClientID();
5.2 设置 ClientID
public static void setClientID(string clientID)
参数说明
参数 | 类型 | 说明 |
---|---|---|
clientID | string | clientID |
示例代码
AdhocSDK.setClientID("xxxx");
6. 添加自定义属性
public static void addCustomAttribute(string key, string value)
参数说明
参数 | 类型 | 说明 |
---|---|---|
key | string | 键 |
value | string | 值 |
示例代码
AdhocSDK.addCustomAttribute("City", "Beijing");