1.简介
UWingSDK是基于WingSDK功能实现的,支持快速接入的一套SDK方案。与传统的SDK接入不同,UWingSDK除了登录,大部分功能均无SDK后台限制,实现支持直接返回结果,直接调试接口,有效提升了接入效率。
2.快速开始
2.1.项目配置要求
API版本:最低API版本24,目标API版本35或以上
|
1 2 3 4 5 6 |
defaultConfig { applicationId "xxxxxx" minSdk 24 // 最低API版本24 targetSdk 35 // 目标API版本35或以上 } |
2.2.集成SDK
a、添加仓库地址
新项目配置:在项目根目录下的settings.gradle文件添加以下配置:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() //这里是UWingSDK的maven地址,内部声明支持http请求 maven { allowInsecureProtocol = true url "http://repo.wingsdk.cn:8081/repository/winga-group/" } } } |
旧项目配置:在项目根目录下的build.gradle文件添加以下配置:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apply plugin: 'maven' allprojects { repositories { jcenter() //这里是UWingSDK的maven地址,内部声明支持http请求 maven { allowInsecureProtocol= true url "http://repo.wingsdk.cn:8081/repository/winga-group/" } } } |
b、在项目的app/build.gradle中添加SDK库:
|
1 2 3 |
implementation 'com.uwa.sdk:uwa-sdk-base:1.0.0' |
2.3.AndroidManifest.xml配置
在清单配置中添加下面配置,sdk_app_id和sdk_app_key具体值从对接表中获取
|
1 2 3 4 5 6 7 8 |
<meta-data android:name="com.wa.sdk.APP_ID" android:value="@string/sdk_app_id" /> <meta-data android:name="com.wa.sdk.APP_KEY" android:value="@string/sdk_app_key" /> |
2.4 Activity结果传递
重写Activity的onActivityResult方法,并调用下面方法
|
1 2 |
UWingSDK.onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) |
参考示例
|
1 2 3 4 5 6 7 |
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 必须添加该方法,否则可能收不到登录和支付等回调结果 UWingSDK.onActivityResult(activity, requestCode, resultCode, data); } |
注意:若未添加该方法,可能导致无法接收登录、支付等功能的回调结果。
2.5 SDK初始化
在游戏页面Activity的onCreate中调用下面方法
|
1 2 |
UWingSDK.initialize(Activity activity, UWCallback<Void> sdkInitCallback) |
示例如下
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//初始化sdk,在游戏页面的onCreate中调用 UWingSDK.initialize(activity, new UWCallback<Void>() { @Override public void onSuccess(int code, String message, Void result) { Log.i(TAG, "初始化成功:" + message); } @Override public void onError(int code, String message, Void result, Throwable throwable) { Log.i(TAG, "初始化失败(" + code + "):" + message); } }); |
注意
1.SDK初始化必须在游戏页Activity(不能是闪屏页)的onCreate()方法中调用。
2.其他所有SDK接口都必须在SDK初始化成功的情况下才能调用。
2.6 添加测试设备
在登录测试框中点击蓝色ClientID文字进行复制,把该内容提供的运营添加测试设备
如果未添加测试设备,会导致无法使用登录,支付等功能。

3. 功能接入
3.1 登录
调用方法:
|
1 2 |
UWingSDK.User.login(Activity activity, UWCallback<UWLoginResult> callback) |
登录结果UWLoginResult说明
| 字段名 | 类型 | 说明 | 备注 |
|---|---|---|---|
| userId | String | SDK的用户ID | |
| token | String | SDK的登录token | |
| platform | String | 当前登录平台(如GOOGLE、FACEBOOK) |
示例如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
UWingSDK.User.login(activity, new UWCallback<UWLoginResult>() { @Override public void onSuccess(int code, String message, UWLoginResult result) { String userId = result.getUserId(); String token = result.getToken(); String platform = result.getPlatform(); String msg = "登录成功. uid: " + userId + "\ntoken:" + token + "\nplatform:" + platform; showMsg(msg); } @Override public void onError(int code, String message, UWLoginResult result, Throwable throwable) { showMsg("登录失败(" + code + "):" + message); } }); |
3.2 登出
调用方法
|
1 2 |
UWingSDK.User.logout(Activity activity) |
3.3 支付
调用方法
|
1 2 |
UWingSDK.User.pay(Activity activity, String sdkProductId, String extInfo, UWCallback<UWPayResult> callback) |
方法参数说明
| 参数名 | 类型 | 说明 | 备注 |
|---|---|---|---|
| activity | Activity | 当前Activity | |
| sdkProductId | String | SDK的商品ID(非Google商品ID),从运营处获取 | |
| extInfo | String | 扩展信息,可用于透传(如透传订单号或发货接口),支付成功后会原样通知CP服务器 | |
| callback | UWCallback |
支付回调处理 |
支付结果UWPayResult说明
| 字段名 | 类型 | 说明 | 备注 |
|---|---|---|---|
| platform | String | 支付平台(如GOOGLE) | |
| sdkProductId | String | SDK的商品ID | |
| extInfo | String | 扩展信息 | 支付时传入的extInfo一致 |
| orderId | String | SDK订单ID | 部分支付方式没有 |
| currency | String | 货币类型(基准货币) | 由SDK后台定义 |
| price | long | 商品价格,单位微分(1元=1000000) | 由SDK后台定义 |
示例如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// SDK 商品ID,从运营提供的商品列表中获取商品对应的值 String sdkProductId = "1"; // 额外信息,可用于透传,比如透传订单号或发货接口。该信息会在支付成功后原样通知到 CP 服务器,供 CP 用于检验 String extInfo = "test_ext_info_1111"; UWingSDK.User.pay(activity, sdkProductId, extInfo, new UWCallback<UWPayResult>() { @Override public void onSuccess(int code, String message, UWPayResult result) { String productId = result.getSdkProductId(); // SDK商品ID String info = result.getExtInfo(); // 额外信息 String platform = result.getPlatform(); // 支付平台 String currency = result.getCurrency(); // 币种(由SDK后台定义的基准货币) long price = result.getPrice(); // 商品价格,单位微分,1元=1000000(由SDK后台定义的基准货币价格) String orderId = result.getOrderId(); // SDK订单ID showMsg("支付成功. ProductId:" + productId + ", ExtInfo:" + info); } @Override public void onCancel() { showMsg("支付取消."); } @Override public void onError(int code, String message, UWPayResult result, Throwable throwable) { showMsg("支付失败(" + code + "): " + message + ". UWPayResult:" + result); } }); |
测试发货:具体查看《CP接口测试》章节中的 《内购商品发货接口》
3.4 事件发送
3.4.1 进入游戏服务器
调用方法:
|
1 2 |
UWingSDK.TrackEvent.enterGameServer(String serverId, String gameUserId, String nickname, int level) |
参数说明:
| 参数名 | 类型 | 说明 | 备注 |
|---|---|---|---|
| serverId | String | 服务器ID | |
| gameUserId | String | 游戏角色ID | 如果未创角,可以设置为 “-1” |
| nickname | String | 游戏角色名(昵称) | 如果未创角,可以设置为空字符串”” |
| level | int | 游戏角色当前等级 | 如果未创角,填入游戏角色初始等级,一般为 1 |
3.4.2 用户创建角色
调用方法:
|
1 2 |
UWingSDK.TrackEvent.createRole(String serverId, String gameUserId, String nickname, int level, long registerTime) |
参数说明:
| 参数名 | 类型 | 说明 | 备注 |
|---|---|---|---|
| serverId | String | 服务器ID | |
| gameUserId | String | 游戏角色ID | |
| nickname | String | 游戏角色名(昵称) | |
| level | int | 游戏角色当前等级 | |
| registerTime | long | 创建角色时的时间戳,单位为毫秒,长度13位 |
3.4.3 角色等级升级
调用方法:
|
1 2 |
UWingSDK.TrackEvent.levelUp(int currentLevel) |
参数说明:
| 参数名 | 类型 | 说明 | 备注 |
|---|---|---|---|
| currentLevel | int | 游戏角色当前等级 |
3.4.4 修改游戏角色名
调用方法:
|
1 2 |
UWingSDK.TrackEvent.updateNickname(String nickname) |
参数说明:
| 参数名 | 类型 | 说明 | 备注 |
|---|---|---|---|
| nickname | String | 更改后的游戏角色名(昵称) |
3.4.5 用户点击支付
调用方法:
|
1 2 |
UWingSDK.TrackEvent.clickToPay() |
3.4.6 新手任务完成
调用方法:
|
1 2 |
UWingSDK.TrackEvent.tutorialCompleted() |
3.5 客服中心
添加该功能入口:
在游戏设置页中添加该功能入口,入口的图标和名称可以使用SDK内置的资源。
文案资源(文案已国际化):R.string.wa_sdk_settings_customer_center
图标资源:R.drawable.wa_sdk_settings_center
效果如下:

调用方法:
|
1 2 |
UWingSDK.User.showCustomerCenter(Activity activity, UWIAccountCallback accountCallback) |
UWIAccountCallback 回调说明:
| 方法 | 说明 | CP需要处理 |
|---|---|---|
| onSwitchAccount(String userId, String token, Bundle bundle) | 账号切换成功 | 游戏客户端要回到登录页并重新登录 |
| onBindAccount(boolean isBound, String platform, Bundle bundle) | 账号绑定状态变更 | 无 |
| onDeleteAccount | 账号申请注销成功 | 游戏客户端要退出游戏回到登录页 |
示例如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
UWingSDK.User.showCustomerCenter(activity, new UWAccountCallback() { @Override public void onSwitchAccount(String userId, String token, Bundle bundle) { showMsg("账号切换成功【游戏客户端要回到登录页并重新登录】, uid: " + userId + ", token: " + token + ", 其他信息: " + bundle); } @Override public void onBindAccount(boolean isBound, String platform, Bundle bundle) { showMsg("账号绑定状态变更: " + (isBound ? "绑定" : "解绑") + ", 平台: " + platform + ", 其他信息: " + bundle); } @Override public void onDeleteAccount() { showMsg("账号申请注销成功!\n【游戏客户端要退出游戏回到登录页】"); } }); |
3.6 AiHelp客服
3.6.1 添加该功能入口
在游戏登录页中添加该功能入口,入口的图标和名称可以使用SDK内置的资源。
文案资源(文案已国际化):R.string.wa_sdk_settings_customer_center
图标资源:R.drawable.wa_sdk_settings_center
效果如下:

3.6.2 判断是否开启
调用方法:
|
1 2 |
boolean isEnable = UWingSDK.AiHelp.isEnable() |
返回结果说明:
true – 开启;false – 未开启
示例如下:
|
1 2 3 4 5 |
// 获取是否开启AiHelp boolean isEnable = UWingSDK.AiHelp.isEnable(); // 开启时显示AiHelp客服按钮,未开启时隐藏 btnAiHelp.setVisibility(isEnable ? View.VISIBLE : View.GONE); |
3.6.3 显示AiHelp客服
调用方法:
|
1 2 |
UWingSDK.AiHelp.show() |
3.6.4 获取未读消息
在SDK初始成功之后,调用方法:
|
1 2 |
UWingSDK.AiHelp.getUnreadMessageCount(UWCallback<Integer> callback) |
示例如下:
|
1 2 3 4 5 6 7 8 9 10 |
// 在SDK初始成功之后,才可以调用该方法获取未读消息数 UWingSDK.AiHelp.getUnreadMessageCount(new UWCallback<Integer>() { @Override public void onSuccess(int code, String message, Integer result) { Log.i(TAG, "AiHelp未读消息数: " + result); // 更新未读数,大于0则需要显示红点,否则移除红点 mAiHelpRedDot.setVisibility(result > 0 ? View.VISIBLE : View.GONE); } }); |
3.7 游戏评价
3.7.1.判断是否开启
如果游戏有做评价发奖的引导页, 需要根据该状态决定是否弹出引导页,true需要弹出,false不需要弹出
调用方法:
|
1 2 |
boolean isEnable = UWingSDK.GameReview.isEnable() |
示例如下:
|
1 2 3 4 5 |
//是否开启游戏评价 boolean isEnable = UWingSDK.GameReview.isEnable(); // 为 true 时才显示评价发奖的引导页 if (isEnable) showGameReviewGuide(); |
3.7.2.展示游戏评价弹窗
调用方法:
|
1 2 |
UWingSDK.GameReview.show(Activity activity, UWGameReviewCallback gameReviewCallback) |
示例如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
UWingSDK.GameReview.show(activity, new UWGameReviewCallback() { @Override public void onSuccess(int action) { // 1-好评;2-打开客服;3-拒绝; if (action == UWGameReviewCallback.ACTION_COMMENT) { // 如果需要好评发奖,可以在这里通知发奖 showMsg("游戏评价成功"); } else if (action == UWGameReviewCallback.ACTION_OPEN_CUSTOMER) { showMsg("打开客服"); } else if (action == UWGameReviewCallback.ACTION_REFUSE) { showMsg("拒绝评价"); } } }); |
注意:如果有多个触发点的情况,各触发点相互独立,不需要规定它们之间的逻辑关系(比如不要规定A点评价了B点就不弹评价等)
3.8 AdMob广告
3.8.1 判断是否开启奖励广告
调用方法:
|
1 2 |
boolean isEnable = UWingSDK.AdMob.RewardedAd.isEnable(String adName); |
参数说明:
| 参数名 | 类型 | 说明 | 备注 |
|---|---|---|---|
| adName | String | 广告名称,SDK后台配置的广告名称 | 具体值从运营处获取 |
3.8.2 展示激励广告
调用方法:
|
1 2 |
UWingSDK.AdMob.RewardedAd.showAd(Activity activity, String adName, String extInfo, UWAdMobAdsCallback callback) |
参数说明:
| 参数名 | 类型 | 说明 | 备注 |
|---|---|---|---|
| activity | Activity | 当前 Activity | |
| adName | String | 广告名称,SDK后台配置的广告名称 | 具体值从运营处获取 |
| extInfo | String | 额外信息,可用作透传,比如透传礼包ID | 该参数随广告奖励通知接口传递给游戏服务端,长度限制为100个字符 |
| callback | UWAdMobAdsCallback | 广告回调 |
UWAdMobAdsCallback广告回调说明:
| 方法 | 说明 |
|---|---|
| onAdShowed() | 广告页面成功显示 |
| onAdDismissed() | 广告页面关闭 |
| onAdFailed(String error_message) | 广告加载失败 |
示例如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
UWingSDK.AdMob.RewardedAd.showAd(activity, adName, extInfo, new UWAdMobAdsCallback() { @Override public void onAdShowed() { showMsg("广告已显示"); } @Override public void onAdFailed(String error_message) { showMsg("广告加载失败: " + error_message); } @Override public void onAdDismissed() { showMsg("广告已关闭"); } }); |
测试发货:具体查看《CP接口测试》章节中的 《AdMob激励广告通知接口》
3.9 退出游戏提示
拦截用户返回操作,弹出退出提示框,用户点击确认退出时,会finish所有Activity,并结束游戏进程
调用方法:
|
1 2 |
UWingSDK.showExitDialog(Activity activity, UWCallback<Void> callback) |
示例如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 返回手势拦截(建议使用该方式拦截返回手势,因为后续 目标 API 升级为 36(Android 16)时,onBackPress 需要也迁移到这种方式实现) getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { // 退出游戏提示 UWingSDK.showExitDialog(activity, new UWCallback<Void>() { @Override public void onSuccess(int code, String message, Void result) { // 用户点击确认后会先调用该回调,然后在内部执行退出应用 } }); } }); |
显示效果如下:

4. CP接口测试
根据接入需求,可能会要求CP提供商品发货接口(应用内购),礼包通知接口(预注册,浮窗礼包),AdMob激励广告通知接口,这些接口都可在相关功能调用中进行测试,下面对这些接口测试进行介绍说明。
重要提示:
1.长按输出的信息可以进行复制
2.调试信息中,会打印请求时所用参数
4.1 内购商品发货接口
该接口用于SDK进行应用内商品购买时,通知CP进行发货,具体接入实现要求参考文档:
https://blog.wing-analytics.com/archives/2510.html#cp_deliver
4.1.1 在UWingSDK中测试
前提条件:
1. CP已提供内购商品发货通知接口,并且运营已在SDK后台中配置该接口
2. 已经与运营沟通好商品列表,并在列表中提供有对应SDK商品ID
测试步骤:
1.游戏正常接入支付接口 UWingSDK.User.pay(),其传入的sdkProductId和extInfo会传递给通知发货接口
2.游戏调用支付接口,在弹出的支付测试框中点击支付,会直接通知已配置在SDK后台的内购商品发货接口
3.如果提示成功,则表接口接入正常,按照蓝字提示完成发货即可
4.如果提示异常,请按照提示调整发货接口;同时可以查看调试信息,检查和校对请求时所用的参数(长按输出内容可以进行复制)
测试效果如下:



4.2.礼包通知接口(预注册,浮窗礼包)
该接口用于SDK的预注册和浮窗礼包功能,通知CP进行礼包发货,具体接入实现要求参考文档:
https://blog.wing-analytics.com/archives/2510.html#gift_url
4.2.1 在UWingSDK中测试
前提条件:
1. CP已提供礼包通知接口,并且运营已在SDK后台中配置该接口
2. 已经与运营沟通好礼包内容与对应的礼包ID
测试步骤:
1.游戏调用客服中心接口UWingSDK.User.showCustomerCenter(),在测试框中点击“礼包通知发货”
2.在输入礼包ID提示框中,输入与运营约定的礼包ID
3.点击确定后会开始通知已配置在SDK后台的礼包通知接口
4.如果提示成功,则表接口接入正常,按照蓝字提示完成发货即可
5.如果提示异常,请按照提示调整发货接口;同时可以查看调试信息,检查和校对请求时所用的参数(长按输出内容可以进行复制)
测试效果如下:




4.3 AdMob激励广告通知接口
该接口用于SDK的AdMob激励广告功能,通知CP进行激励广告奖励发货,具体接入实现要求参考文档:
https://blog.wing-analytics.com/archives/2510.html#admob
4.3.1 在UWingSDK中测试
前提条件:
1. CP已提供AdMob激励广告通知接口,并且运营已在SDK后台中配置该接口
2. 已经与运营沟通好奖励内容与对应的SDK广告名称
测试步骤:
1.游戏调用AdMob激励广告接口,其传入的adName和extInfo会传递给奖励通知接口
2.弹出激励广告窗口,点击“通知发货”
3.在输入AdMob广告信息提示框中,确认信息正确后点击确定后会开始通知已配置在SDK后台的AdMob激励广告通知接口
4.如果提示成功,则表接口接入正常,按照蓝字提示完成发货即可
5.如果提示异常,请按照提示调整发货接口;同时可以查看调试信息,检查和校对请求时所用的参数(长按输出内容可以进行复制)
测试效果如下:



