WingSteamExeSDK-1.0.1(2023.12.12发布)
- WingSteamExeSDK变更如下:对接文档
1.新增Exit退出方法,程序退出时调用
WingSteamExeSDK-1.0.0(2023.11.14发布)
- WingSteamExeSDK变更如下:对接文档
1、登录:集成steam登录
2、支付:集成steam支付
3、数据收集:WINGSDK数据收集
WingSteamExeSDK主要是为满足PC端Steam平台Windows的游戏需要,为此类游戏提供基于Steam平台的登录、支付、数据收集等通用功能。以下文档中会把WingSteamExeSDK简称为SDK。
SDK提供了多个版本的库文件,可以根据项目需求使用。
序号 | 平台 | 是否MT编译 | lib库文件 | SDK下载 |
---|---|---|---|---|
1 | x86 | 否 | wingsdk.lib | 下载 |
2 | x64 | 否 | wingsdk64.lib | 下载 |
3 | x86 | 是 | wingsdk_mt.lib | 下载(推荐) |
4 | x64 | 是 | wingsdk64_mt.lib | 下载 |
MT编译版本:已经内置VC运行库内容,不依赖于外部VC运行库。
普通(MD)编译版本:该版本会使用附带的vcruntime140.dll,msvcp140.dll,vcruntime140_1.dll这几个文件。
对应的dll版本:
版本 | 包含文件 | 备注 |
---|---|---|
x86 | libcrypto-3-wing.dll libssl-3-wing.dll sdkencryptedappticket.dll steam_api.dll wingsdk.dll msvcp140.dll vcruntime140.dll |
|
x64 | ibcrypto-3-x64-wing.dll libssl-3-x64-wing.dll sdkencryptedappticket64.dll steam_api64.dll wingsdk64.dll msvcp140.dll vcruntime140.dll vcruntime140_1.dll |
|
x86_mt | libcrypto-3-wing-mt.dll libssl-3-wing-mt.dll sdkencryptedappticket.dll steam_api.dll wingsdk_mt.dll |
|
x64_mt | libcrypto-3-x64-wing-mt.dll libssl-3-x64-wing-mt.dll sdkencryptedappticket64.dll steam_api64.dll wingsdk64_mt.dll |
以VisualStudio项目工程为例
1.下载最新版本SDK压缩包,并解压
2.SDK头文件引入
1)复制include文件夹及其内容到项目中,主要包含wing目录下的wing_api.h头文件
2)右键项目->属性->C/C++->常规->附加包含目录,填入include文件夹路径,例如include文件夹是复制到项目根目录下,则路径可以填写:$(ProjectDir)include
3.SDK库文件引入
1)复制lib文件夹及其内容到项目中,并在项目属性页->链接器->常规->附加库目录,中填入lib文件夹路径,例如lib文件夹是复制到项目根目录下,则路径可以填写:$(ProjectDir)lib
2)在项目属性页->链接器->输入->附加依赖项中填入sdk的lib文件,如果是x86编译,则填入wingsdk.lib,如果是x64编译,则填入wingsdk64.lib,如果使用mt版本,则选择对应带mt后缀lib文件。
4.SDK的Api使用
1)在项目中引入。以前面步骤的配置路径作为示例,那么引入的路径为 #include “wing/wing_api.h”
2)在项目中使用。wing_api.h的接口为命名空间+方法的使用方式,例如:sdk的初始化方法使用,WingProxy::Init(“appId”,“appKey”,[](int code,string msg,string data){});
5.项目编译后,需要把sdk用到的dll文件复制到编译后的exe程序目录中,否则项目无法正常运行。具体版本对应的dll文件,参考前面dll版本文件对应表。例如x86的dll内容如下图:
6.运行程序
三方库 | 版本 | 包含dll(只列举x86版本) | 功能 |
---|---|---|---|
OpenSSL | 3.1.3 | libcrypto-3-wing.dll libssl-3-wing.dll |
网络请求 |
SteamSDK | 1.5.8 | steam_api.dll sdkencryptedappticket.dll |
Steam平台SDK |
sdk的api采用命名空间+方法的形式定义的,WingProxy是所有sdk接口的命名空间,以支付是否可用方法为例,使用方式:
1 2 3 |
bool isPayAvailable = WingProxy::IsPayAvailable(); |
sdk接口的参数中,除了一些常见类型参数,在wing_api.h中还声明了WingCallback回调函数,参数说明如下:
参数 | 类型 | 说明 | |
---|---|---|---|
code | int | 状态码,具体取值参考《状态码说明》章节 | |
msg | std::string | 状态码说明 | |
data | std::string | Json字符串,里面包含该接口会返回的字段,例如登录接口登录成功后返回的data内容:{“msg”:”token refreshed”,”code”:200,”isFirstLogin”:0,”userId”:7822920,”token”:”30_o1hejvBB22LKMu”} |
调用下面接口对SDK进行初始化,建议在程序开始时首先调用,确保后续其他sdk接口可以正常使用
1 2 3 |
WingProxy::Init(string appId, string appKey, WingCallback callback); |
参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
appId | std::string | Y | appId,具体值从运营处获取 |
appKey | std::string | Y | appKey,具体值从运营处获取 |
WingCallback | WingCallback | Y | 回调函数 |
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
std::string appId = "9910e80...80429f5"; // 从运营处获取 std::string appKey = "oHg7c7pW....N8YTWJN"; // 从运营处获取 WingProxy::Init(appId, appKey, [](int code, std::string msg, std::string data) { if (code == 200) { MessageBoxA(NULL, "初始化成功.", "提示", MB_OK | MB_ICONINFORMATION); } else { MessageBoxA(NULL, ("初始化失败.错误" + msg).c_str(), "提示", MB_OK | MB_ICONINFORMATION); } }); |
调用下面接口对SDK内资源进行释放,必须在程序退出前调用。
1 2 3 |
WingProxy::Exit(); |
使用下面接口进行登录
1 2 3 |
WingProxy::Login(WingCallback callback); |
参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
WingCallback | Y | 回调函数 |
WingCallback的data内容字段说明:
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
userId | long | Y | 用户Id |
token | string | Y | 在线token |
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
WingProxy::Login([](int code, std::string msg, std::string data) { if (code == 200) { json jsonData = json::parse(data); long userId = jsonData["userId"]; std::string token = jsonData["token"]; std::string tips = "登录成功."; tips.append("\nUserId:").append(std::to_string(userId)) .append("\nToken:").append(token); MessageBoxA(NULL, tips.c_str(), "提示", MB_OK); } else { MessageBoxA(NULL, ("登录失败.错误" + msg).c_str(), "提示", MB_OK); } }); |
调用下面接口退出账号
1 2 |
WingProxy::Logout(); |
进行支付之前,需要先判断支付是否可用
1 2 |
bool isPayAvailable = WingProxy::IsPayAvailable(); |
返回值为bool类型,true 表示支付可用,false表示支付不可用。
进行支付之前,需要先判断支付是否可用
1 2 |
WingProxy::CallPay(std::string productId, std::string extInfo, WingCallback callback); |
参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
productId | std::string | Y | WINGSDK平台的商品ID |
extInfo | std::string | Y | CP 扩展信息字段,限长512(JSON格式),WING服务器到CP服务器发货通知时原样返回给CP。如果CP的通知发货地址是动态变化的(比如每个服务区的地址都不一致),可以通过此字段设置:参数格式为标准JSON,参数名为 deliverUrl,参考格式{ “deliverUrl”:” http://game.com/deliver.do”, “otherInfo”:”otherInfo”,“merId”:””}merId字段(选填),收款商户ID,使用场景:同一个支付渠道下有多个不同的收款验证信息(或收款帐号)。无内容建议传入空字符串“”。 |
WingCallback | Y | 回调函数 |
WingCallback的data内容字段说明:
字段名 | 类型 | 必填 | 说明 |
---|---|---|---|
orderId | std::string | Y | 订单ID |
productId | std::string | Y | WINGSDK平台的商品ID |
currency | std::string | Y | 基准货币 |
amount | long long | Y | 基准货币价格 |
quantity | int | Y | 购买数量,目前一般都是1 |
extInfo | std::string | N | 扩展信息字段,内容与该方法传入的extInfo相同 |
status | int | Y | 1表示支付成功,其他表示支付失败 |
代码示例:
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 28 29 30 31 32 33 34 35 36 37 38 39 40 |
bool isPayAvailable = WingProxy::IsPayAvailable(); if (!isPayAvailable) { // 支付前需要判断支付是否可用 MessageBoxA(NULL, "支付不可用,请稍后重试", "提示", MB_OK); return; } std::string strProductId = "game001"; std::string strExtInfo = "MyInfo|10086"; WingProxy::CallPay(strProductId, strExtInfo, [](int code, std::string msg, std::string data) { if (code != 200) { MessageBoxA(NULL, ("支付失败. 错误:" + msg).c_str(), "提示", MB_OK); } else { json jsonData = json::parse(data); std::string orderId = jsonData["orderId"]; std::string productId = jsonData["productId"]; std::string currency = jsonData["currency"]; long long amount = jsonData["amount"]; int quantity = jsonData["quantity"]; std::string extInfo = jsonData["extInfo"]; int status = jsonData["status"]; std::string tips = ""; tips.append("\n订单ID:").append(orderId) .append("\n商品ID:").append(productId) .append("\n基准币种:").append(currency) .append("\n基准货币价格:").append(std::to_string(amount)) .append("\n购买数量:").append(std::to_string(quantity)) .append("\n透传信息:").append(extInfo) .append("\n订单状态:").append(std::to_string(status)) .append("\n\n") .append(status == 1 ? "支付成功" : "支付失败"); MessageBoxA(NULL, tips.c_str(), "提示", MB_OK); } }); |
WINGSDK包括serverId等游戏参数,这些参数主要用于数据跟踪和统计。
该部分参数必须严格按照文档进行设置,在后续的接口中会使用到这些参数,没有按照要求配置会导致部分接口调用失败。
参数设置时机除了按照说明设置,另外需要特别注意在游戏启动时的设置时机,具体参考 流程要求
当用户的服务器ID发生改变时,需要调用设置服务器ID接口设置新的服务器ID,例如每次进入服务
1 2 |
WingProxy::SetServerId(string serverId); |
注意:设置服务器id的操作在每次选服后都需要进行,必须在调用其他事件前设置
当游戏角色ID发生改变时,需要调用设置接口设置新的gameUserId,例如成功登录账号后、切换账号成功后
1 2 |
WingProxy::SetGameUserId(string gameUserId); |
注意:
1.必须在调用其他事件前设置。
2.游戏角色ID是游戏角色在游戏中的ID,不是WINGSDK自身的UserId。
3.若未创角前拿不到游戏角色ID,可以先设置-1,创角后再设置一次正确的角色ID
当用户角色等级发生改变时,需要调用设置等级接口设置新的等级,例如开始进入游戏、等级提升等。
1 2 |
WingProxy::SetLevel(int level); |
注意:第一次进服获取玩家等级或玩家等级变更后,需要及时调用这个接口设置玩家等级,必须在调用其他事件前设置。
设置游戏玩家的昵称,调用接口:
1 2 |
WingProxy::SetNickName(string nickName); |
注意:
1.当玩家登录、登出游戏,或修改昵称时,需要及时调用这个接口设置玩家昵称。
2.调用该接口设置昵称后,玩家进行购买时会自动记录昵称到订单信息中。
WINGSDK数据收集使用在游戏的过程中打点的方式,如图所示:
注意:
1.以上流程图中涉及到的几个接口是有时序要求的,请参考流程图中的逻辑步骤进行设置:WingProxy::SetServerId()、WingProxy::SetGameUserId()、WingProxy::SetLevel()、WingProxy::SetNickName()、ghw_user_import事件、ghw_user_create事件。
2.其它的事件如ghw_level_achieved、ghw_self_tutorial_completed等请根据对应业务逻辑,在对应业务发生时调用接口发送。
序号 | 事件(接口)名称 | 事件描述 | 事件作用 | 建议触发点 | 备注 |
---|---|---|---|---|---|
1 | SetServerId | 设置服务器ID | 标记玩家当前所在的服务器,后台根据该字段统计每个服务器的数据 | 登录游戏服成功后 | |
2 | SetGameUserId | 设置玩家角色ID | 标记玩家当前的游戏角色ID,后台根据该字段统计玩家的数据 | 登录游戏服成功后 | |
3 | SetLevel | 设置玩家当前等级 | 标记玩家当前的游戏角色等级 | 玩家等级发生变更后,如登录游戏服成功后、玩家完成升级后 | |
4 | SetNickName | 设置玩家昵称 | 标记玩家当前的游戏昵称 | 玩家设置昵称后 | |
5 | ghw_user_import | 玩家登录游戏服 | 记录玩家登录游戏服的动作,后台根据该事件统计导入数、登录数、导入留存等数据 | 玩家登录游戏服成功后 | 需要先调用SetServerId、SetGameUserId、SetLevel接口 |
6 | ghw_user_create | 玩家创建角色 | 记录玩家创建角色的动作,后台根据该事件统计创角数 | 玩家创建角色成功后 | 需要先调用SetServerId、SetGameUserId、SetLevel接口 |
7 | ghw_user_info_update | 更新用户信息 | 更新用户信 | 玩家信息更新时 | 需要先调用SetServerId、SetGameUserId、SetNickname接口 |
8 | ghw_level_achieved | 更新玩家等级 | 更新玩家等级,后台根据此字段更新玩家等级 | 玩家达到新的等级时 | 需要先调用setLevel接口更新玩家等级 |
9 | ghw_self_lv_x | 更新关键等级 | 更新关键等级 | 关键等级到达时 | 属于自定义事件 |
10 | ghw_self_tutorial_completed | 完成新手任务 | 完成新手任务 | 完成新手任务时 | 属于自定义事件 |
使用下面接口发送事件
1 2 |
WingProxy::PostEvent(const string& eventName, const string& params = "", double eventValue = numeric_limits<double>::quiet_NaN()) |
参数说明:
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
eventName | const std::string& | Y | 事件名称 |
params | const std::string& | N | 事件参数,可以不传,默认空。以json字符串的形式传递。例如需要设置isFirstEnter为1,则应该传递内容为:{“isFirstEnter”:1}。 |
eventValue | double | N | 事件价值,可以不传,默认无。 |
代码示例:
1 2 3 4 5 |
std::string strEventName = "ghw_user_import"; std::string strEventParams = "{\"isFirstEnter\":1}"; double value = 9.9; WingProxy::PostEvent(strEventName, strEventParams,value); |
说明:导入用户事件,玩家第一次进某个服时调用
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
isFirstEnter | int | 是否第一次进服 | Y | 0->否;1->是;默认为0 |
注意:发送ghw_user_import事件前需调用设置服务器ID接口更新服务器id、设置gameUserId接口更新游戏用户id
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* ghw_user_import 导入用户事件 事件描述 : 玩家登录游戏服 事件作用 : 记录玩家登录游戏服的动作,后台根据该事件统计导入数、登录数、导入留存等数据 建议触发点 : 玩家登录游戏服成功后 调用前提 : 需要先调用SetServerId、SetGameUserId接口、SetLevel接口 必填字段 : isFirstEnter 类型int 是否第一次进服 0→否 1→是; 默认为0 */ WingProxy::SetServerId(服务器ID); WingProxy::SetGameUserId(游戏用户ID); WingProxy::SetLevel(用户等级); //未创角时可以传0 std::string strEventName = "ghw_user_import"; std::string strEventParams = "{\"isFirstEnter\":1}"; WingProxy::PostEvent(strEventName, strEventParams); |
说明:创建游戏角色,游戏角色创建时调用
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
nickname | string | 角色名(昵称) | Y | |
registerTime | long long | 创建时间 | Y | 注册时间戳,13位数,单位为毫秒(1970以后) |
gender | number | 角色性别 | N | 0 女,1 男,2 未知 |
roleType | string | 角色类型 | N | |
vip | number | 等级 | N | |
bindGameGold | number | 绑定钻石 | N | |
gameGold | number | 用户钻石数 | N | |
fighting | number | 战斗力 | N | |
status | number | 状态 | N | 状态标识,-1: 锁定,1:未锁定 |
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/* ghw_user_create 创角事件 事件描述 : 玩家创建角色 事件作用 : 记录玩家创建角色的动作,后台根据该事件统计创角数 建议触发点 : 玩家创建角色成功后 调用前提 : 需要先调用SetServerId、SetGameUserId、SetLevel接口 必填字段 : nickname 昵称 registerTime 注册时间戳 单位为毫秒(1970以后) 可选字段 : roleType、gender、vip、bindGameGold、gameGold、fighting、status 具体参考博客 */ WingProxy::SetServerId(服务器ID); WingProxy::SetGameUserId(游戏用户ID); WingProxy::SetLevel(等级); std::string strEventName = "ghw_user_create"; //只有必传参数 std::string strEventParams = "{\"nickname\":\"Gooood\",\"registerTime\":1234567890123}"; //包含非必传参数 //std::string strEventParams = "{\"nickname\":\"Gooood\",\"registerTime\":1234567890123,\"gender\":1,\"roleType\":\"战士\",\"vip\":11,\"bindGameGold\":25467,\"gameGold\":98797878,\"fighting\":515747966,\"status\":1}"; WingProxy::PostEvent(strEventName, strEventParams); |
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
roleType | String | 角色类型 | N | |
nickname | String | 角色名称 | Y | 无昵称时,可填写空字符串 |
vip | int | 等级 | N | |
status | int | 状态 | N | 状态标识,-1:锁定,1:未锁定 |
代码示例
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 |
/* ghw_user_info_update 更新用户信息 事件描述 : 更新用户信息 事件作用 : 更新用户信 建议触发点 : 玩家信息更新时 调用前提 : 需要先调用SetServerId、SetGameUserId、SetNickname接口 必填字段 : nickname std::string 昵称 可选字段 : roleType std::string 角色类型 vip int 等级 status int 状态 状态标识,-1:锁定,1:未锁定 */ WingProxy::SetServerId(服务器ID); WingProxy::SetGameUserId(游戏用户ID); WingProxy::SetNickname(用户昵称); std::string strEventName = "ghw_user_info_update"; //只有必传参数 std::string strEventParams = "{\"nickname\":\"Gooood\"}"; //包含非必传参数 //std::string strEventParams = "{\"nickname\":\"Gooood\",\"roleType\":\"战士\",\"vip\":11,\"status\":1}"; WingProxy::PostEvent(strEventName, strEventParams); |
说明:统计玩家等级增长事件,达到等级时调用。
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
score | number | 账户分数 | N | |
fighting | number | 战斗力 | N |
注意:发送ghw_level_achieved事件前需调用设置用户等级level接口更新用户等级信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* ghw_level_achieved 更新玩家等级 事件描述 : 更新玩家等级 事件作用 : 更新玩家等级,后台根据此字段更新玩家等级 建议触发点 : 玩家达到新的等级时 调用前提 : 需要先调用SetLevel接口更新玩家等级 必填字段 : 可选字段 : score long long 账户分数 fighting long long 战斗力 */ WingProxy::SetLevel(等级); std::string strEventName = "ghw_level_achieved"; // 可选参数 // std::string strEventParams = "{\"score\":112344656,\"fighting\":12345656}"; WingProxy::PostEvent(strEventName); |
如果发送的事件不属于预定义事件范围,事件发送时会自动补上ghw_self_前缀,例如关键等级5的事件名称传入,lv_5,最终发送的事件名称为ghw_self_lv_5。
代码示例:
1 2 3 |
// 关键等级事件,ghw_self_lv_x,关键等级为5时发送lv_5即可 WingProxy::PostEvent("lv_5"); |
1 2 3 |
// 完成新手任务事件,ghw_self_tutorial_completed,发送tutorial_completed即可 WingProxy::PostEvent("tutorial_completed"); |
SDK的日志默认是关闭状态的,开启日志后会在程序目录下生成winglog.log日志文件,可以查看SDK的日志信息。
开启SDK调试日志:
1.SDK日志的开启需要提供设备的ClientId,在用户的隐藏目录AppData下找到SharedConf配置文件,以文本的形式查看文件可以得到ClientId值。
具体路径:C:\Users\用户名\AppData\Local\WingSteamExeSdk\SharedConf
文本内容参考:{“ClientId”:”5c56b3400000000000000e0a76c72″}
2.把ClientId的值提供给运营,运营在后台操作加入测试设备
3.重启已接入SDK的程序,进行SDK相关操作,即可在winlog.log查看SDK输出的相关日志信息。
状态码 | 说明 |
---|---|
200 | 操作成功 |
-400 | 一般错误 |
-401 | SDK未初始化 |
-402 | Steam初始化失败 |
-403 | Steam登录授权超时 |
-404 | Steam登录授权失败 |
-405 | 未登录 |
-500 | 服务器异常 |
-501 | 服务器异常:json解析异常 |
400 | 失败 |
500 | 服务器内部故障 |
501 | 所请求接口或页面未实现 |
4010 | 无效appId: appId不存在或未开启 |
4011 | 无效osign:osign校验失败 |
4012 | 请求已过期:ots校验失败 |
4013 | 第三方平台验证失败 |
4017 | 用户不存在(没有找到) |
4019 | 无效orderId |
4020 | 订单验证失败 |
4023 | 未找到渠道信息 |
4025 | 汇率转换失败 |
4026 | 支付渠道已关闭 |
4029 | 登录渠道已关闭 |
5005 | 该设备不能支付或者不允许支付 |
5006 | 支付过程中出错 |
提供 UI界面 和 接口调用 两种方式,满足用户不同需求。
内置登录UI弹窗,内含所有已经集成的登录方式,无需编写界面,一键集成登录功能
WINGSDK匿名登录无需账户密码,根据设备信息新建用户或登录已存在的用户,可以快速登录游戏。
第三方平台登录接口可以通过第三方平台账户登录,返回WINGSDK账号信息,使用没有绑定任何WINGSDK账号的第三方平台账号登录,会自动新建一个WINGSDK账号,并且与该平台账号绑定。支持Facebook登录、Google登录、VK登录。
内置账户管理UI界面,无需编写界面和逻辑,即可对账户进行管理,平台账户绑定情况一目了然,绑定、解绑平台账户,新建账号,切换账号,轻松搞定。
账号绑定接口,可以将WINGSDK账号跟第三方平台的账号绑定,绑定成功后可以使用绑定的平台账号登录,在同一应用中一个平台账号只能绑定一个WINGSDK账号。
账号解绑接口,可以将第三方平台账号与其绑定的WINGSDK账号解绑,解绑成功后,平台账号可以与WINGSDK账号再次绑定。
绑定账号查询接口,能够查询此时登录的账号(WINGSDK)已经绑定的第三方平台账号列表。
一键切换账号,迅速切换WINGSDK账号或者第三方账号。
支付模块提供支付充值接口,集成简单,无需理会复杂的支付流程,轻松完成商品的购买(充值)。
数据收集模块提供了数据收集的接口,多渠道灵活调用。数据收集包含了丰富的应用内的事件类型,还支持用户自定义事件类型。
社交模块,为游戏提供社交功能支持,一键集成,功能丰富。社交模块包含以下功能:
1、分享接口,支持分享链接、文字、图片、视频、Facebook OpenGraph;
2、游戏邀请,邀请还没有玩过该游戏的好友跟自己一起玩这款游戏,邀请好友一起玩游戏,还有丰富的邀请奖励;
3、Game Service,游戏互动更简单;
4、社区,提高玩家的积极性和互动。
应用墙模块,提供应用、游戏的推广下载,引导用户安装。
注意:此模块会对苹果应用商店上架造成一定的风险,请酌情使用。
WINGSDK推送功能是基于苹果APNS,可以向客户端推送消息,通过简单几步配置即可使用。
WINGSDK广告功能,可以向玩家展示视频广告,并且可以实现奖励机制。
WINGSDK智能客服功能,集成机器人、人工客服,FAQ等功能。
为了遵守欧盟以及Google等第三方的一些关于用户隐私的法律法规,WINGSDK实现了一套简单的用户隐私政策流程。分为两种类型,一种是自动的,针对的是对接了登录窗口方式的CP,这种情况CP无需接入任何新的接口;一种手动的,针对的是对接了接口登录的CP,这种情况CP需要对接新的接口,具体接口参考隐私政策接口章节。
WINGSDK用户中心功能,可以向玩家展示充值中心账号、初始密码、信息内容。
1、系统:Mac OS
2、开发工具:Xcode(12.0及以上)
3、Deployment Target:iOS9.0及以上版本
4、BaseSDK iOS 10.1及以上
集成步骤:
1、集成相应库到项目中 参考:2.2.1 库的引用
2、添加依赖库,以及配置 参考: 2.2.2 工程构建配置
3、修改配置文件 参考: 2.2.3 WINGSDK基本配置
4、编译正常,可继续sdk代码集成 参考: SDK初始化
建议:cp可先运行demo,看下配置以及需要引用的第三方库,再接入
集成参考demo: demo代码下载地址
SDK的抽象层和实现层以framework的形式提供,CP可以使用cocoapods的方式或者自行下载framework拖进xcode项目的方式进行引用。
CP可以使用Cocospods进行引用更新。
这部分脚本请使用WINGSDK打包配置页面生成,CP可以将生成的脚本代码复制到自己的Podfile中。
WINGSDK打包配置页面地址:https://admin.wingsdk.com/developers/pack_config.do
目前SDK提供的库包括:
抽象层:
实现层:
其它可选:
WAAdImpl(Ad)——可选
WAAfImpl(Appsflyer)——可选
WAApImpl(Apple)——可选
WACbImpl(Chartboost)——可选
WAFbImpl(Facebook) ——可选
WAPushImpl(Push)——可选
WAVkImpl(VK)——可选
WATwitterImpl(Twitter)——可选
WAInstagramImpl(Instagram)——可选
WAAiHelpImpl(AiHelp) ——可选
WAWebPayImpl(WebPay)——可选,如果需要第三方支付则需添加此模块
WAFirebaseImpl(Firebase)——可选
提示:使用CocoaPod引用的项目打开项目时需要点击’xcworkspace’而不是’ xcodeproj’
如果手动引用,可以使用WINGSDK打包配置页面https://admin.wingsdk.com/developers/pack_config.do进行各个包的下载,并添加到xcode项目中。
下载完成后解压,把解压后的文件拖入xcode工程,其中WASdkIntf和WASdkImpl是必接库,其它可选。
注意:需要加入系统库libsqlite3.tbd(libsqlite3.dylib)、libz.tbd(libz.dylib)
在项目Build Settings中搜索Other Linker Flags 修改值为-ObjC
如下图
需要引用的库:
AppTrackingTransparency.framework
libz.1.dylib
Accelerate.framework
libc++.tbd
libresolv.tbd
WebKit.framework
sqlite3
在 WASdkIntf下,以及配置文件wa_sdk_track_config.plist
,wa_sdk.plist
,如下图。
wa_sdk.plist文件配置:
参数说明:
WaSdkServerUrl:WINGSDK后台url(生产环境:https://api.wingsdk.com/sdkapi/)
appKey:WINGSDK后台appKey
appId:WINGSDK后台appId
os:手机操作系统
channel:发布渠道
关于wa_sdk_track_config.plist
详见2.6.1 配置 (wa_sdk_track_config.plist)
从3.12.0以及以后,需要增加如下配置:
1、在项目target,Signing&Capabilities,选择All,添加Capability,选择Keychain Sharing
2、点击+号,输入gamehollywood.wingsdk.clientid.group
导入头文件
#import <WASdkIntf/WASdkIntf.h>
1、请在AppDelegate的didFinishLaunchingWithOptions 调用下面代码:
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 28 29 30 |
//从3.12.0版本,sdk的初始化,需要确保有网络的情况下才初始化(cp可以根据情况选择): 方案一:仍使用旧的初始化,cp需要监听有网络后,才调用sdk的初始化 //注:此方法要在主线程中调用,不要放入子线程中。 // sdk初始化 [WACoreProxy init]; // 事件初始化 [WACoreProxy initAppEventTracker]; // 支付初始化 [WAPayProxy init4Iap]; // 推送注册 [WAPushProxy application:application initPushWithDelegate:self]; //各个模块的didFinishLaunchingWithOptions 初始化 [WACoreProxy application:application didFinishLaunchingWithOptions:launchOptions]; 方案二 sdk监听有网络后,才初始化sdk,cp需要使用新的初始化方法 //注:此方法要在主线程中调用,不要放入子线程中。 [WACoreProxy initWithCompletionHandler:^{ //sdk 初始化完成回掉,在此可以初始化其他模块,如支付、事件等 [WACoreProxy initAppEventTracker]; [WAPayProxy init4Iap]; [WAPushProxy application:application initPushWithDelegate:self]; [WACoreProxy application:application didFinishLaunchingWithOptions:launchOptions]; }]; |
2、在AppDelegate的applicationDidEnterBackground调用下面代码:
1 2 |
[WACoreProxy applicationDidEnterBackground:application]; |
3、在AppDelegate的applicationWillEnterForeground调用下面代码:
1 2 |
[WACoreProxy applicationWillEnterForeground:application]; |
4、在AppDelegate的applicationDidBecomeActive调用下面代码:
1 2 |
[WACoreProxy applicationDidBecomeActive:application]; |
登录过程中如果涉及到应用间跳转,需要在AppDelegate中实现以下方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [WACoreProxy application:application openURL:url sourceApplication:sourceApplication annotation:annotation]; } - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { return [WACoreProxy application:app openURL:url options:options]; } - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler { return [WACoreProxy application:application continueUserActivity:userActivity restorationHandler:restorationHandler]; } |
SDK内置了一个包含所有支持的登录方式的一个对话框,通过调用以下接口打开对话框:
注意:测试时,需要联系运营添加测试设备,才能出现登录方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
(1)登录成功 /*! @abstract 登录成功 @param result 登录的用户信息 */ -(void)loginViewDidCompleteWithResult:(WALoginResult*)result; (2)登录失败 /*! @abstract 登录失败 @param result 登录的用户信息 注:这不是登录结果,由于登录失败所以userId是空的.但如果第三方平台(Facebook,Apple)授权成功,pUserId,pToken,extends不为空,可用于提示用户. @param error 错误 */ -(void)loginViewDidFailWithError:(NSError*)error andResult:(WALoginResult*)result; (3)登录取消 /*! @abstract 用户取消登录 @param result 登录的用户信息(只有platform非空). */ -(void)loginViewDidCancel:(WALoginResult*)result; |
登录结果说明 WALoginResult
字段名 | 类型 | 说明 | 备注 |
---|---|---|---|
message | String | 登录结果消息 | |
userId | String | WINGSDK用户id | |
token | String | WINGSDK用户token | |
pUserId | NSString | 用户在第三方平台的Id,GUEST登录时 值与userId一致 | |
platform | String | 平台类型 | 当前登录的平台名称 |
pToken | NSString | 第三方平台的token | |
isGuestAccount | int | 是否游客登录 | 0 不是游客账号 1是游客账号 |
+(void)login:(id<WALoginViewDelegate>)delegate cacheEnabled:(BOOL)cacheEnabled;
cacheEnabled是否缓存登录方式。如果缓存登录方式,第二次调用的时候直接按照上次的登录方式进行登录,不会弹出登录选择框。如果想弹出登录选择框,请调用clearLoginCache方法,清除缓存
代码示例:
1 2 |
[WAUserProxy login:<#your delegate#> cacheEnabled:<#(BOOL)#>]; |
+(void)clearLoginCache;
代码示例:
1 2 |
[WAUserProxy clearLoginCache]; |
+(void)hide;
代码示例:
1 2 |
[WAUserProxy hide]; |
如果CP有自己的登录窗口,可以使用WINGSDK登录接口:
+(void)loginWithPlatform:(NSString *const)platform extInfo:(NSString*)extInfo delegate:(id<WALoginDelegate>)delegate;
注:extInfo目前主要用于应用内登录等高级登录设置,请参考3.3.2 应用内登录相关章节
代码示例:facebook登录
1 2 |
[WAUserProxy loginWithPlatform: WA_PLATFORM_FACEBOOK extInfo:nil delegate:self]; |
登录平台请参考5.1.2 平台取值
说明:关于APPLE登录,用户每次进入APP进行登录操作,Game Center只进行一次授权。假如用户在第一次登录的时候取消了,以后每次进行登录,程序都会执行登录取消的协议方法,除非用户结束应用重新打开。同样的,第一次登录的时候,出现Game Center授权错误,之后程序都会执行登录失败的协议方法,除非用户结束应用重新打开。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
(1)登录成功 /*! @abstract 登录成功 @param results 登录结果 */ -(void)loginDidCompleteWithResults:(WALoginResult*)result; (2)登录失败 /*! @abstract 登录失败 @param result 登录的用户信息 注:这不是登录结果,由于登录失败所以userId是空的.但如果第三方平台(Facebook,Apple)授权成功,pUserId,pToken,extends不为空,可用于提示用户. @param error 错误 */ -(void)loginDidFailWithError:(NSError*)error andResult:(WALoginResult*)result; (3)登录取消 /*! @abstract 用户取消登录 @param result 登录的账户信息 (注:返回的result只有platform有值) */ -(void)loginDidCancel:(WALoginResult*)result; |
退出游戏的时候,必须登出操作。用户登出调用以下接口:
[WAUserProxy logout];
注意:调用logout接口后,serverId、gameUseId、level字段值会被重置,如果需要保持相应字段的值不重置,需要重新设置相应字段的值,参考3.1 公共参数设置
WINGSDK支付流程如下:
使用对应平台的支付服务前必须对其进行初始化,请在AppDelegate的didFinishLaunchingWithOptions方法调用以下方法。
+(void)init4Iap;
代码示例:
1 2 |
[WAPayProxy init4Iap]; |
1 2 3 4 5 6 7 8 9 10 11 12 |
/*! @abstract 查询成功 @param Inventory 是一个数组,保存着WAIapProduct类型的实例(仅productIdentifier可用) */ -(void)queryInventoryDidCompleteWithResult:(NSArray<WAIapProduct *>*)Inventory; /*! @abstract 查询失败 @param error 错误 */ -(void)queryInventoryDidFailWithError:(NSError*)error; |
查寻库存商品,调用以下接口:
+(void)queryInventoryWithDelegate:(id<WAInventoryDelegate>)delegate;
代码示例:
1 2 |
[WAPayProxy queryInventoryWithDelegate:self]; |
注意:这里返回的库存商品信息是WINGSDK平台的商品信息,并非第三方平台的商品信息。
建议在商品页出来之前调用,最好是sdk初始化完后就开始调用,如下
1 2 3 |
[WAPayProxy init4Iap]; //支付初始化 [WAPayProxy queryInventoryWithDelegate:self];// 提前查询商品列表 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/*! @abstract 支付成功 @param iapResult 支付结果 @param platform 支付平台 */ -(void)paymentDidCompleteWithResult:(WAIapResult*)iapResult andPlatform:(NSString*)platform; /*! @abstract 支付失败 @param error 错误 @param platform 支付平台 */ -(void)paymentDidFailWithError:(NSError*)error andPlatform:(NSString*)platform; |
支付结果说明 WAIapResult
字段名 | 类型 | 说明 | 备注 |
---|---|---|---|
productIdentifier | NSString | 商品id | |
resultCode | long | 支付结果代码 | 1.支付成功 2.支付失败 3.用户取消 4.支付成功,上报失败 5.商品消耗中 6.创建订单失败 |
注意:如果需要在订单信息中记录当前玩家昵称,需要按3.1.4 设置玩家昵称设置玩家昵称。
购买指定平台的商品,调用以下接口:
+(void)payWithProductId:(NSString*)productId extInfo:(NSString*)extInfo delegate:(id<WAPaymentDelegate>)delegate;
代码示例:
1 2 |
[WAPayProxy payWithProductId:product.productIdentifier extInfo:nil delegate:self]; |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
productId | String | Y | 库存商品的id | wingsdk平台的商品id |
extInfo | String | N | 额外信息,该信息会在支付成功后原样通知到CP服务器,CP用于检验 | CP 扩展信息字段,限长512(JSON格式),WING服务器到CP服务器发货通知时原样返回给CP。如果CP的通知发货地址是动态变化的(比如每个服务区的地址都不一致),可以通过此字段设置:参数格式为JSON,参数名为 deliverUrl,参考格式 { “deliverUrl”:” http://game.com/deliver.do”, “otherInfo”:”otherInfo”, “merId”:”” } merId字段(选填),收款商户ID,使用场景:同一个支付渠道下有多个不同的收款验证信息(或收款帐号)。如果是 APPLE支付渠道,merId使用客户端bundleId |
通过查询商品信息,可以获取库存商品的本地价格,查询商品本地价格调用接口:
+ (void)queryChannelProduct:(NSString )channel
callBackBlock:(void(^)(NSArray
代码示例
1 2 3 4 |
[WAPayProxy queryChannelProduct:@"APPLE" callBackBlock:^(NSArray<WAChannelProduct *> *channelProductsArray, NSError *error) { if (!error) { }}]; |
注意:这个接口需要在查询库存商品( queryInventoryWithDelegate)成功回调后使用。
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
chanel | NSString | Y | 渠道名称 | 如苹果渠道 APPLE |
实体结果说明 WAChannelProduct:
字段名 | 类型 | 说明 | 备注 |
---|---|---|---|
channel | NSString | 渠道名称 | 传递的channel |
productIdentifiere | NSString | 平台商品id | |
localeCurrencyCode | NSString | 本地货币code | USD 、CNY |
localFormattedPrice | NSString | 格式化价格 | $999.99 、 ¥6,498.00 |
price | NSDecimalNumber | 价格 | 999.99、 6498 |
通过以下接口可以获取支付服务是否可用,返回boolean类型结果,true为可用,false为不可用,只要有一个支付渠道可用即为true:
+(BOOL)isPayServiceAvailableWithPlatform;
代码示例:
1 2 |
[WAPayProxy isPayServiceAvailableWithPlatform]; |
使用WINGSDK数据收集接口配合大数据平台,可以轻松统计玩家习惯以及充值等行为,为游戏的市场营销提供数据依据。WINGSDK数据收集使用在游戏的过程中打点的方式,如图所示:
序号 | 事件(接口)名称 | 事件描述 | 事件作用 | 建议触发点 | 备注 |
---|---|---|---|---|---|
1 | setServerId | 设置服务器ID | 标记玩家当前所在的服务器,后台根据该字段统计每个服务器的数据 | 登录游戏服成功后 | |
2 | setGameUserId | 设置玩家角色ID | 标记玩家当前的游戏角色ID,后台根据该字段统计玩家的数据 | 登录游戏服成功后 | |
3 | setNickname | 设置玩家角色昵称 | 标记玩家当前的游戏角色昵称,后台订单记录中会记录该昵称 | 登录游戏服成功后 | |
4 | setLevel | 设置玩家当前等级 | 标记玩家当前的游戏角色等级 | 玩家等级发生变更后,如登录游戏服成功后、玩家完成升级后 | |
5 | ghw_user_import | 玩家登录游戏服 | 记录玩家登录游戏服的动作,后台根据该事件统计导入数、登录数、导入留存等数据 | 玩家登录游戏服成功后 | 需要先调用setServerId、setGameUserId接口 |
6 | ghw_user_create | 玩家创建角色 | 记录玩家创建角色的动作,后台根据该事件统计创角数 | 玩家创建角色成功后 | 需要先调用setServerId、setGameUserId、setLevel接口 |
7 | ghw_self_tutorial_completed | 完成新手任务 | 完成新手任务 | 玩家完成新手任务后 | |
8 | ghw_level_achieved | 更新玩家等级 | 更新玩家等级,后台根据此字段更新玩家等级 | 玩家达到新的等级时 | 需要先调用setLevel接口更新玩家等级 |
9 | ghw_self_lv_x | 更新玩家等级 | 更新玩家等级,后台根据此字段更新玩家等级 | 需要先调用setLevel接口更新玩家等级 | |
10 | ghw_user_info_update | 更新用户信息 | 更新用户信 | 玩家信息更新时 | 需要先调用setServerId、setGameUserId、setNickname接口 |
对各个平台进行相应的配置(修改wa_sdk_track_config.plist)。注:文件名以及key值不可修改。
其中,AppleAppID可以在iTunes Connect(https://itunesconnect.apple.com)中新建应用之后获取,具体可以参考iOS-第三方后台配置文档“Apple基础配置”章节。
每个数据收集平台都有相应的开关,可以进行配置。下图的Enable就是开关,Enable: YES-开,NO-关。
WINGSDK URL正式环境的地址: https://api.wingsdk.com/data/
#import <WASdkIntf/WASdkIntf.h>
您需要在第一次启动在应用程序上进行SDK初始化。请保证在发送下面的跟踪事件之前进行SDK初始化。请在AppDelegate中的didFinishLaunchingWithOptions方法中添加以下代码:
[WACoreProxy initAppEventTracker];
安装和打开游戏事件是内部触发的,另外关于充值事件(WAEventPayment)和点击充值(WAEventInitiatedPayment)的跟踪已经在WINGSDK中自动调用,用户不用自己调用。若不想启用这两个事件的自动跟踪,可在didFinishLaunchingWithOptions进行如下操作:
[WATrackProxy autoTriggerAfterPayment:NO];
调用方法有两种。方法一调用方法简单,但是发送到各个渠道的事件名称(eventName)、参数(params)、累加值(value)是一样的。如果需要自己设置事件名称、参数、累加值,请使用方法二。
注:当使用带有小数点的数值时,使用NSDecimalNumber类型,如[NSDecimalNumber decimalNumberWithString:@"8.88"];
调用事件的用法如下:
+(void)trackWithEventName:(NSString *)eventName valueToSum: (double)value params:(NSDictionary *)params;
-eventName:事件名称可在附表中查询
-valueToSum:传入一个double值作为累加值,没有累加值可以传0。
-params:参数字典参数可在附表中查询
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
NSDictionary *params = @{ WAEventParameterNameSuccess:@YES, WAEventParameterNameTransactionId:@”transactionId”, WAEventParameterNamePaymentType:[NSNumber numberWithInt:WAEnumPaymentTypeApple], WAEventParameterNameCurrencyType:@”CNY”, WAEventParameterNameCurrencyAmount:@100, WAEventParameterNameVirtualCoinAmount:@122, WAEventParameterNameIAPId:@”iapId”, WAEventParameterNameIAPName:@”iapName”, WAEventParameterNameIAPAmount:@100, WAEventParameterNamePrice:@100, }; [WATrackProxy trackWithEventName:WAEventPayment valueToSum:100 params:params]; |
调用购买事件WAEventPayment,
参数:WAEventParameterNameContentType
道具类型,
WAEventParameterNameContentID
内容ID,
WAEventParameterNameItemAmount
购买数量,
WAEventParameterNameCurrencyType
货币类型,
WAEventParameterNameCurrencyAmount
现金额
…
注:当使用带有小数点的数值时,使用NSDecimalNumber类型,如[NSDecimalNumber decimalNumberWithString:@"8.88"];
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 28 29 30 31 32 33 34 35 36 |
WAEvent* event = [[WAEvent alloc]init]; event.defaultEventName = WAEventLevelAchieved; event.defaultValue = 1; event.defaultParamValues = @{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 }; event.eventNameDict = @{WA_PLATFORM_APPSFLYER:WAEventLevelAchieved,WA_PLATFORM_CHARTBOOST:WAEventLevelAchieved,WA_PLATFORM_FACEBOOK:@"FacebookLevelAchieved",WA_PLATFORM_WINGA:WAEventLevelAchieved,WA_PLATFORM_FIREBASE:WAEventLevelAchieved}; event.valueDict = @{WA_PLATFORM_APPSFLYER:@1,WA_PLATFORM_CHARTBOOST:@1,WA_PLATFORM_FACEBOOK:@2,WA_PLATFORM_WINGA:@1, WA_PLATFORM_FIREBASE:@1}; event.channelSwitcherDict = @{WA_PLATFORM_APPSFLYER:@NO,WA_PLATFORM_FACEBOOK:@YES,WA_PLATFORM_WINGA:@YES,WA_PLATFORM_CHARTBOOST:@YES,WA_PLATFORM_FIREBASE:@YES}; event.paramValuesDict = @{ WA_PLATFORM_APPSFLYER:@{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 }, WA_PLATFORM_CHARTBOOST:@{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 }, WA_PLATFORM_FACEBOOK:@{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 }, WA_PLATFORM_WINGA:@{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 }, WA_PLATFORM_FIREBASE:@{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 } }; [event trackEvent]; |
1 2 |
[event trackEvent]; |
设置该事件的事件名称,请参考5.2.1 SDK 预定义事件名
event.defaultEventName = WAEventLevelAchieved;
1 2 |
event.eventNameDict = @{WA_PLATFORM_APPSFLYER:WAEventLevelAchieved,WA_PLATFORM_CHARTBOOST:WAEventLevelAchieved,WA_PLATFORM_FACEBOOK:@"FacebookLevelAchieved",WA_PLATFORM_WINGA:WAEventLevelAchieved}; |
注:
1)eventNameDict的key参考附表 2.6.2 渠道名称表
2)AppsFlyer和facebook的应用内事件和WINGSDK的应用内事件已经做了映射(例如: ghw_login <-> af_login,ghw_login<->fb_login,参考下图),用户无需再手动自定义。
3)如果不进行设置,所有的渠道将采用设置的默认值(defaultEventName)。
设置累加值用于统计数字,比如购买的金额等
event.defaultValue = 1;
1 2 |
event.valueDict = @{WA_PLATFORM_APPSFLYER:@1,WA_PLATFORM_CHARTBOOST:@1,WA_PLATFORM_FACEBOOK:@2,WA_PLATFORM_WINGA:@1,WA_PLATFORM_FIREBASE:@1}; |
1)valueDict的key值参考 附表2.6.2 渠道名称表
2)如果不进行设置,所有的渠道将采用设置的默认值(defaultValue)。
1 2 3 4 5 |
event.defaultParamValues = @{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 }; |
注:
1)参数名称参考5.2.2 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 |
event.paramValuesDict = @{ WA_PLATFORM_APPSFLYER:@{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 }, WA_PLATFORM_CHARTBOOST:@{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 }, WA_PLATFORM_FACEBOOK:@{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 }, WA_PLATFORM_WINGA:@{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 }, WA_PLATFORM_FIREBASE:@{ WAEventParameterNameScore:@100, WAEventParameterNameFighting:@1000 }, }; |
注:
1)渠道名称参考:附表 2.6.2 渠道名称表
2)参数名称参考:5.2.2 SDK 预定义参数名
3)如果不进行设置,所有的渠道将采用设置的默认值(defaultParamValues)
1 2 |
event.channelSwitcherDict = @{WA_PLATFORM_APPSFLYER:@NO,WA_PLATFORM_FACEBOOK:@YES,WA_PLATFORM_WINGA:@YES,WA_PLATFORM_CHARTBOOST:@YES, WA_PLATFORM_FIREBASE:@YES}; |
注:以上代码会关闭Appsflyer对该事件的收集,而Facebook、WINGSDK、Chartboost、firebase是打开的。默认情况下,WINGSDK和Appsflyer、firebase是打开的,而Facebook和Chartboost是关闭的。
建议参数属性:(参数对应的静态变量名请看5.2.2 SDK 预定义参数名)
说明:导入用户事件,用户每次进服事件–通过用户id在后台查找
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
isFirstEnter | int | 是否为第一次导入 | Y | 否为0, 是为:1。 默认为0。 |
注意:发送ghw_user_import事件前需要调用 设置服务器ID 和设置角色ID
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* ghw_user_import 导入用户 事件描述 : 玩家登录游戏服 事件作用 : 记录玩家登录游戏服的动作,后台根据该事件统计导入数、登录数、导入留存等数据 建议触发点 : 玩家登录游戏服成功后 调用前提 : 需要先调用setServerId、setGameUserId接口 必填字段 : isFirstEnter 类型int 是否第一次进服 0→否 1→是; 默认为0 */ [WACoreProxy setServerId:@"serverid_001"]; [WACoreProxy setGameUserId:@"gameuserid_001"]; WAEvent* event = [[WAEvent alloc]init]; event.defaultEventName =WAEventUserImport; event.defaultParamValues = @{ /*必填*/ WAEventParameterNameIsFirstEnter:@1, }; [event trackEvent]; |
说明:点击购买的时候调用(用于游戏内部虚拟交易统计)
无参数
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
/* ghw_initiated_purchase 点击购买 事件描述 : 点击购买(虚拟货币) 事件作用 : 用于游戏内部虚拟交易统计 建议触发点 : 点击购买的时候调用 调用前提 : 无 必填字段 : 无 */ WAEvent* event = [[WAEvent alloc]init]; event.defaultEventName =WAEventInitiatedPurchase; [event trackEvent]; |
说明:点击购买的时候调用(用于游戏内部虚拟交易统计)。
注:valueToSum(或者defaultValue)的值要传,而且值要和price一样。
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
itemName | String | 游戏内虚拟物品的名称/ID | Y | |
itemAmount | int | 交易的数量 | Y | |
price | float | 交易的总价 | Y |
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/* ghw_purchase 购买完成 事件描述 : 购买完成(虚拟货币) 事件作用 : 用于游戏内部虚拟交易统计 建议触发点 : 购买完成的时候调用 调用前提 : 无 必填字段 : itemName String 游戏内虚拟物品的名称/ID itemAmount int 交易的数量 price float 交易的总价 */ WAEvent* event = [[WAEvent alloc]init]; event.defaultEventName =WAEventPurchase; event.defaultParamValues = @{ /*必填*/ WAEventParameterNameItemName:@"钻石001", //游戏内虚拟物品的名称/ID WAEventParameterNameItemAmount:@1, //交易的数量 WAEventParameterNamePrice:@1.99 //交易的总价 }; [event trackEvent]; |
说明:统计玩家等级增长事件,达到等级时调用。
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
score | int | 账户分数 | N | |
fighting | int | 战斗力 | N |
注意:发送事件前WAEventLevelAchieved需调用3.1.3 设置用户等级level 接口更新用户等级信息。
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* ghw_level_achieved 更新玩家等级 事件描述 : 更新玩家等级 事件作用 : 更新玩家等级,后台根据此字段更新玩家等级 建议触发点 : 玩家达到新的等级时 调用前提 : 需要先调用setLevel接口更新玩家等级 必填字段 : 可选字段 : score int 账户分数 fighting int 战斗力 */ [WACoreProxy setLevel:10]; WAEvent* event = [[WAEvent alloc]init]; event.defaultEventName =WAEventLevelAchieved; event.defaultParamValues = @{ /*可选*/ WAEventParameterNameScore:@10, WAEventParameterNameFighting:@600, }; [event trackEvent]; |
说明:创建游戏角色
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
roleType | string | 角色类型 | N | |
nickname | String | 角色名(昵称) | Y | |
gender | int | 角色性别 | N | 性别: 0表示女, 1表示男, 2表示未知 |
registerTime | long | 创建时间 | Y | 注册时间戳,单位为毫秒(1970以后) |
vip | int | 等级 | N | |
status | int | 状态 | N | 状态标识: -1: 锁定, 1:未锁定 |
bindGameGold | int | 绑定钻石 | N | |
gameGold | int | 用户钻石数 | N | |
fighting | int | 战斗力 | N |
代码示例:
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
/* ghw_user_create 创角事件 事件描述 : 玩家创建角色 事件作用 : 记录玩家创建角色的动作,后台根据该事件统计创角数 建议触发点 : 玩家创建角色成功后 调用前提 : 需要先调用setServerId、setGameUserId、setLevel接口 必填字段 : nickname 昵称 registerTime 注册时间戳 单位为毫秒(1970以后) 可选字段 : roleType、gender、vip、bindGameGold、gameGold、fighting、status 具体参考博客 */ NSTimeInterval interval = [[NSDate date] timeIntervalSince1970] * 1000; NSInteger time = interval; NSString *timestamp = [NSString stringWithFormat:@"%zd",time]; [WACoreProxy setServerId:@"serverid_001"]; [WACoreProxy setGameUserId:@"gameuserid_001"]; [WACoreProxy setLevel:1]; WAEvent* event = [[WAEvent alloc]init]; event.defaultEventName =WAEventUserCreate; event.defaultParamValues = @{ /*必填*/ WAEventParameterNameNickName:@"昵称", //昵称 WAEventParameterNameRegisterTime:timestamp, // 时间戳 毫秒 /*可选*/ WAEventParameterNameVip:@10, //等级 WAEventParameterNameRoleType:@"角色类型", //角色类型 WAEventParameterNameGender:@1, //性别 WAEventParameterNameStatus:@1, //状态标识 -1锁定。 1未锁定 WAEventParameterNameBindGameGold:@110, //绑定钻石 WAEventParameterNameGameGold:@100, //用户钻石数 WAEventParameterNameFighting:@100, //战斗力 }; [event trackEvent]; |
说明:新手完成新手任务时调用
无参数
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
/* ghw_self_tutorial_completed 完成新手任务 事件描述 : 完成新手任务 事件作用 : 统计 建议触发点 : 新手完成新手任务时调用 调用前提 : 无 必填字段 : 无 */ WAEvent* event = [[WAEvent alloc]init]; event.defaultEventName =@"tutorial_completed"; [event trackEvent]; |
说明:完成关键等级时调用,如ghw_self_lv_1、ghw_self_lv_3
无参数
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* ghw_self_lv_x 关键等级 事件描述 : 关键等级 事件作用 : 统计 建议触发点 : 到达关键等级时 调用前提 : 无 必填字段 : 无 */ int level = 10; WAEvent* event = [[WAEvent alloc]init]; event.defaultEventName =[NSString stringWithFormat:@"lv_%d",level]; [event trackEvent]; |
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
roleType | String | 角色类型 | N | |
nickname | String | 昵称 | Y | 无昵称时,可填写空字符串 |
vip | int | 等级 | N | |
status | int | 状态 | N | 状态标识,-1:锁定,1:未锁定 |
代码示例:
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 28 29 30 31 32 33 34 35 |
/* ghw_user_info_update 更新用户信息 事件描述 : 更新用户信息 事件作用 : 更新用户信 建议触发点 : 玩家信息更新时 调用前提 : 需要先调用setServerId、setGameUserId、setNickname接口 必填字段 : nickname String 昵称 可选字段 : roleType String 角色类型 vip int 等级 status int 状态 状态标识,-1:锁定,1:未锁定 */ NSString * nickName = @"昵称"; [WACoreProxy setServerId:@"serverid_001"]; [WACoreProxy setGameUserId:@"gameuserid_001"]; [WACoreProxy setNickName:nickName]; WAEvent* event = [[WAEvent alloc]init]; event.defaultEventName =WAEventLevelAchieved; event.defaultParamValues = @{ /*必填*/ WAEventParameterNameNickName:nickName, /*可选*/ WAEventParameterNameRoleType:@"角色类型", //角色类型 WAEventParameterNameVip:@10, //等级 WAEventParameterNameStatus:@1, //状态标识 -1锁定。 1未锁定 }; [event trackEvent]; |
事件描述:自定义事件
事件名称:自定义
参数:自定义
有无累计值:自定义
说明:支持自定义事件的统计
自定义
自定义事件目前只支持事件名和累加值,见示例。
例如:
1 2 3 4 5 |
WAEvent* event = [[WAEvent alloc]init]; event.defaultEventName =@”custom_event_name”; event.defaultValue = 1; [event trackEvent]; |
名称 | 标识 |
---|---|
人民币 | CNY |
美元 | USD |
港币 | HKD |
欧元 | EUR |
英镑 | GBP |
日元 | JPY |
加元 | CAD |
详见:https://en.wikipedia.org/wiki/ISO_4217
常量 | 代表渠道 |
---|---|
WA_PLATFORM_APPSFLYER | Appsflyer |
WA_PLATFORM_FACEBOOK | |
WA_PLATFORM_WINGA | WINGSDK |
WA_PLATFORM_CHARTBOOST | ChartBoost |
WA_PLATFORM_FIREBASE | Firebase |
应苹果要求,iOS14后,获取IDFA需要授权弹框。目前sdk默认为不弹框获取用户授权。如需弹框授权,需要以下步骤
1、xcode升级到12或者以后版本
2、接入sdk3.9.1或以后版本
3、Info.plist 中新增 key Privacy – Tracking Usage Description ,value 填写使用 IDFA 原因。其中原因将展示给用户
效果如图:
如果CP对接的登录方式是接口登录方式,则可以使用以下几个接口来实现隐私政策流程,具体流程可参考下图。
WINGSDK有自己的隐私政策,调用以下接口获取到隐私政策url(隐私政策内容为html页面)
1 2 |
+(NSString *)getPrivacyUrl |
示例:
1 2 |
[WACoreProxy getPrivacyUrl]; |
隐私政策更新需要重新显示时可以调用以下接口获取最新隐私政策更新时间,和上一次保存的时间戳作对比,从而确定是否需要展示
1 2 |
+(NSString *)getPrivacyUpdateTime |
示例:
1 2 |
[WACoreProxy getPrivacyUpdateTime]; |
当需要显示隐私政策详情时,可以调用以下接口显示出隐私政策详情界面
1 2 |
+(void)showPrivacyUI:(void(^)())privacyUIClosedHandler |
示例:
1 2 3 4 |
[WACoreProxy showPrivacyUI:^(){ // 已关闭隐私政策回调 }]; |
WINGSDK包括serverId等公共参数,这些参数主要用于数据跟踪和统计。公共参数必须严格按照文档进行配置,在后续的接口中会使用到这些公共的参数,没有按照要求配置会导致部分接口调用失败。
当用户的服务器ID发生改变时,需要调用设置服务器ID接口设置新的服务器ID,例如每次进入服务器:
[WACoreProxy setServerId: @"127.0.0.1"];
注意:设置服务器ID的操作在每次选服后都需要进行,必须在调用其他接口前设置。
用户在选择服务器并且登录之后将用户gameUserId设置到SDK中以便于跟踪。
[WACoreProxy setGameUserId:@"12345"];
设置游戏玩家的角色等级,调用接口:
[WACoreProxy setLevel:10];
注意:第一次进服获取玩家等级或玩家等级变更后,需要及时调用这个接口设置玩家等级,必须在调用其他接口前设置。
设置游戏玩家的昵称,调用接口:
[WACoreProxy setNickName:@"测试角色名称"];
注意:
1.当玩家登录、登出游戏,或修改昵称时,需要及时调用这个接口设置玩家昵称。
2.调用该接口设置昵称后,玩家进行购买时会自动记录昵称到订单信息中。
WINGSDK具备调试模式并提供了Log悬浮按钮调试工具,打开调试模式就会显示Log悬浮按钮,使用这个工具测试人员不需要IDE环境就可以在工具窗口中查看调试信息。开启/关闭调试模式调用以下接口(WINGSDK默认是关闭调试模式的)。
[WACoreProxy setDebugMode:YES];
关闭调试模式:
[WACoreProxy setDebugMode:NO];
打开调试模式后,显示Logcat工具,点击-设备信息-clientid,点击获取
使用该接口需注意以下两点:
1)一般来说,如果应用登录的时候有登录方式选择界面,就不需要使用此接口,此接口默认是这种方式(取值为1)。
2)这个接口主要是用来满足以下需求:用户第一次登录是以游客方式进行登录,进到应用里面可以切换其它登录方式,下次登录会直接以切换后的账户进行登录(取值为2)。
+(void)setLoginFlowType:(int)flowType;
代码示例:
[WAUserProxy setLoginFlowType:WA_LOGIN_FLOW_TYPE_DEFAULT];
登录流程有两种模式,在WAConstants类中定义,取值如下表:
名称 | 取值 | 备注 |
---|---|---|
WA_LOGIN_FLOW_TYPE_DEFAULT | 1 | 适用于有登录界面的场景,登录的时候不会重新绑定设备 |
WA_LOGIN_FLOW_TYPE_REBIND | 2 | 适用于无登录界面的场景,登录时重新将新账号与当前设备绑定,如在游戏中切换账户,切换以后的匿名登录是以切换后的账户进行登录。 |
SDK平台应用内登录,是指CP本身有自己登录系统,先登录CP后台拿到用户信息后登录SDK后台,应用内登录调用接口2.4.2 用户登录接口 ,登录平台取值WINGA(CHANNEL_WA),将CP后台返回的用户信息按照规定格式(JSON字符串)通过extInfo字段传入。
应用内登录extInfo格式(标准JSON格式字符串)
1 2 3 4 5 6 7 |
{ "appSelfLogin": true, "puserId": "12345", "accessToken": "o1akkfjia81FMvFSO8kxC96TgQYlheEr", "extInfo": "extInfo String" } |
实例:
1 2 3 |
NSString* extra = @"{\"puserId\":\"12345\",\"extInfo\":\"extInfo String\",\"accessToken\":\"o1akkfjia81FMvFSO8kxC96TgQYlhEEr\",\"appSelfLogin\":true}"; [WAUserProxy loginWithPlatform:WA_PLATFORM_WINGA extInfo: extra delegate:self]; |
字段说明:
字段名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
appSelfLogin | boolean | 应用内登录固定值true | Y | |
puserId | String | CP用户id | Y | |
accessToken | String | CP用户Token | Y | |
extInfo | String | 额外信息 | N | CP 扩展信息字段,限长512,WING服务器到CP服务器验证登录时原样返回给CP。CP可以添加任意自定义的字段(JSON格式),用于检验登录或扩展其它功能,不超过长度限制即可。 |
SDK内置了账户管理页面,打开这个内置的页面之前必须先登录,通过这个页面可以对账户进行管理操作,包括账号绑定、解绑、切换账户、新建账户。
1 2 3 4 5 6 7 8 9 10 11 12 |
/*! @abstract 新建账户回调接口 @param result 新建账户的账户信息 */ -(void)newAcctDidCompleteWithResult:(WALoginResult*)result; /*! @abstract 切换账户回调接口 @param result 切换账户的账户信息 */ -(void)switchAcctDidCompleteWithResult:(WALoginResult*)result; |
+(void)openAccountManager:(id<WAAcctManagerDelegate>)delegate;
代码示例:
1 2 |
[WAUserProxy openAccountManager:self]; |
账户管理界面没有返回绑定和解绑结果,但是会以通知的方式将结果回调给CP。当绑定有结果之后(无论成功失败),将回传一个WABindingResult实例。当解绑有结果(无论成功失败),将回传一个WAAccount实例。有四个通知,分别是绑定成功、绑定失败、解绑成功、解绑失败,通知的名称分别是以下常量:
WABindDidSucceedNotification;
//绑定成功
WABindDidFailNotification;
//绑定失败
WAUnbindDidSucceedNotification;
//解绑成功
WAUnbindDidFailNotification;
//解绑失败
注:关于绑定facebook成功之后,请注意触发邀请奖励。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//接收通知的方法 -(void)bindDidSucceed:(NSNotification*)noti{ if (noti.object) { WABindingResult* result = noti.object; if ([result.platform isEqualToString:WA_PLATFORM_FACEBOOK]) { [WASocialProxy inviteInstallRewardPlatform:WA_PLATFORM_FACEBOOK TokenString:result.accessToken handler:^(NSUInteger code, NSString *msg, NSError *error) { if (code == 200) { //触发被邀请人安装应用事件接口成功 }else{ //触发被邀请人安装应用事件接口失败 } }]; } } } |
说明:关于APPLE账号的绑定,请参考2.4.2.2 实现协议WALoginDelegate中定义的方法的说明。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
(1)绑定成功 /*! @abstract 绑定成功 @param result 绑定的账户信息 */ -(void)bindingDidCompleteWithResult:(WABindingResult*)result; (2)绑定失败 /*! @abstract 绑定失败 @param result 绑定的账户信息 @param error 错误 */ -(void)bindingDidFailWithError:(NSError*)error andResult:(WABindingResult*)result; (3)绑定取消 /*! @abstract 绑定取消 @param result 绑定的账户信息(注:返回的result只有platform有值) */ -(void)bindingDidCancel:(WABindingResult*)result; |
+(void)bindingAccountWithPlatform:(NSString *const)platform extInfo:(NSString*)extInfo delegate:(id<WAAccountBindingDelegate>)delegate;
绑定平台取值:
名称 | 取值 | 备注 |
---|---|---|
WA_PLATFORM_FACEBOOK | FACEBOOK平台 | |
WA_PLATFORM_APPLE | APPLE | APPLE平台 |
WA_PLATFORM_VK | VK | VK平台 |
示例代码:
1 2 |
[WAUserProxy bindingAccountWithPlatform:WA_PLATFORM_FACEBOOK extInfo:nil delegate:self]; |
通过以下接口,可以查询当前的账户已经绑定的第三方平台账户:
+(void)queryBoundAccountWithCompleteBlock:(void(^)(NSError* error,NSArray<WAAccount *>* accounts))block;
示例代码:
1 2 3 4 5 6 7 8 |
[WAUserProxy queryBoundAccountWithCompleteBlock:^(NSError *error, NSArray<WAAccount *> *accounts) { if (error) { //失败处理 }else{ //成功 } }]; |
通过以下接口,可以解绑已经绑定的第三方平台账户:
+(void)unBindAccountWithPlatform:(NSString *const)platform platformUserId:(NSString*)pUserId completeBlock:(void(^)(NSError* error))completeBlock;
有以下情况之一者,不可解绑:
1.解绑的账户为WINGSDK平台的;
2.用户没有绑定第三方平台账户的;
3.用户只绑定一个第三方平台账户,且用户没有与当前设备绑定的。
示例代码:
1 2 3 4 5 6 7 8 |
[WAUserProxy unBindAccountWithPlatform:_accountSelected.platform platformUserId:_accountSelected.pUserId completeBlock:^(NSError *error) { if (error) { //失败处理 }else{ //成功处理 } }]; |
使用以下接口可以快速切换登录的账户
+(void)switchAccountWithPlatform:(NSString *const)platform completeBlock:(void(^)(NSError* error,WALoginResult* result))completeBlock;
+(void)createNewAccountWithCompleteBlock:(void(^)(NSError* error,WALoginResult* result))completeBlock;
新建账户后,新的账户会跟当前设备绑定,如果之前的账户没有绑定第三方平台账户,数据将会丢失。
代码示例:
1 2 3 4 5 6 7 8 |
[WAUserProxy createNewAccountWithCompleteBlock:^(NSError *error, WALoginResult *result) { if (!error) { //新建账号成功 }else{ //新建账号失败 } }]; |
SDK提供了获取指定平台的账户信息,可以通过以下接口获取:
+(WAAppUser*)getAccountInfoWithPlatform:(NSString *const)platform;
示例代码:
1 2 |
WAAppUser* appUserId = [WAUserProxy getAccountInfoWithPlatform:WA_PLATFORM_VK]; |
注意:此模块会对苹果应用商店上架造成一定的风险,请酌情使用。
WINGSDK应用墙包含了应用推荐等功能。
[WAApwProxy showEntryFlowIcon];
[WAApwProxy hideEntryFlowIcon];
1 2 3 4 5 6 7 8 9 |
(1)分享成功 - (void)sharer:(NSObject<WASharing>*)sharer platform:(NSString *const)platform didCompleteWithResults:(NSDictionary *)results; (2)分享失败 - (void)sharer:(NSObject<WASharing>*)sharer platform:(NSString *const)platform didFailWithError:(NSError *)error; (3)分享取消 - (void)sharerDidCancel:(NSObject<WASharing>*)sharer platform:( NSString *const)platform; |
分享调用以下接口,支持分享链接、图片、视频、Facebook OpenGraph:
+(void)shareWithPlatform:( NSString *const)platform shareContent:(NSObject<WASharingContent>*)shareContent shareWithUI:(BOOL)shareWithUI delegate:(NSObject<WASharingDelegate>*)delegate;
示例代码:
1 2 3 4 5 6 7 8 9 |
WASharePhoto *photo = [[WASharePhoto alloc]init]; photo.image = image; //phote.imageURL = [NSURL URLWithString:@"..."];//image 和 imageURL 可以二选一 photo.userGenerated = YES; photo.caption = @"caption..."; WASharePhotoContent *content = [[WASharePhotoContent alloc]init]; content.photos = @[photo]; [WASocialProxy shareWithPlatform:WA_PLATFORM_FACEBOOK shareContent:content shareWithUI:YES delegate:self]; |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
shareContent | NSObject |
Y | 分享内容 | |
shareWithUI | BOOL | Y | 是否通过UI分享 | 设置为YES时直接通过UI分享,有界面。设置为NO时通过API分享,没有界面。注意:目前不支持这种方式,相关权限已被facebook收回,此值只能为false |
delegate | NSObject |
N | 委托 |
WAShareLinkContent字段说明
字段名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
contentURL | NSURL | Y | 链接 | |
peopleIDs | NSArray | N | 分享好友ID | |
placeID | NSString | N | 地址id | |
ref | NSString | N | 添加到引用链接中的参数值 | |
contentTitle | NSString | N | 连接标题 | Facebook无效 |
contentDescription | NSString | N | 链接描述 | |
imageURL | NSURL | N | 配图 | Facebook无效 |
WASharePhotoContent字段说明
字段名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
contentURL | NSURL | N | 内容URL | |
peopleIDs | NSArray | N | 分享好友ID | |
placeID | NSString | N | 地址id | |
ref | NSString | N | 添加到引用链接中的参数值 | |
photos | NSArray | Y | 图片列表 | 不能超过12MB,而且列表不能为空,至少一张图片 |
WASharePhoto字段说明
字段名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
image | UIImage | Y | 图片对象 | 和imageURL两个必选一个 |
imageURL | NSURL | Y | 图片Uri | 和image两个必选一个 |
userGenerated | BOOL | N | 未使用 | |
caption | NSString | N | 图片描述 |
WAShareVideoContent字段说明
字段名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
contentURL | NSURL | N | 内容URL | |
peopleIDs | NSArray | N | 分享好友ID | |
placeID | NSString | N | 地址id | |
ref | NSString | N | 添加到引用链接中的参数值 | |
previewPhoto | WASharePhoto | N | 视频缩略图 | |
video | WAShareVideo | Y | 视频 | 不能超过12MB |
WAShareVideo字段说明
字段名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
videoURL | NSURL | Y | 视频URL |
发送请求接口向平台好友发送请求,请求包括普通请求、游戏邀请(详见3.6.3 游戏邀请)等,发送请求调用以下接口:
1 2 |
+(void)sendRequestWithPlatform:(NSString *const)platform requestType:(NSString *const)requestType title:(NSString*)title message:(NSString*)message objectId:(NSString*)objectId receiptIds:(NSArray*)receiptIds delegate:(NSObject<WAGameRequestDialogDelegate>*)delegate; |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
platform | NSString | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持VK以及FACEBOOK |
requestType | NSString | Y | 请求类型 | 请求类型默认的在WAConstants下有定义,请参考5.1.3 请求类型说明 |
title | NSString | Y | 标题 | 部分平台需要显示 |
message | NSString | Y | 说明文字 | 部分平台需要显示 |
objectId | NSString | N | 对象id | 部分请求类型必填 |
receiptIds | NSArray | Y | 接收者id | 根据平台而定,有些平台支持一次发送请求给多个用户,有些平台一次只能发送给一个用户。VK平台一次只能发送一个用户,Facebook时传入为nil |
delegate | NSObject | N | 代理 |
示例代码:
1 2 |
[WASocialProxy sendRequestWithPlatform:WA_PLATFORM_FACEBOOK requestType:WA_REQUEST_TYPE_SEND title:@"A gift" message:@"send you a gift" objectId:@"objectId" receiptIds:@[@"receiptId1",@"receiptId2"] delegate:self]; |
游戏邀请只能邀请没有玩过当前游戏的好友,称为可邀请好友,查询可邀请的好友调用以下接口:
+(void)queryInvitableFriendsWithDuration:(float)duration platform:(NSString *const)platform completeBlock:(void(^)(NSArray* friends,NSError *error))block;
代码示例:
1 2 3 4 5 6 7 8 |
[WASocialProxy queryInvitableFriendsWithDuration:5 completeBlock:^(NSArray *friends, NSError *error) { if (!error) { //查询成功 }else{ //查询失败 } }]; |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
block | String | Y | 回调 | |
platform | NSString | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持VK |
duration | long | Y | 过滤时间间隔 | 单位为分钟,当过滤时间间隔大于0时,在这个时间间隔内不会出现已经发出邀请的好友 |
1 2 3 4 5 6 7 8 9 |
(1)游戏请求成功 - (void)gameRequestDialog:(WAGameRequestDialog *)gameRequestDialog platform:(NSString *const)platform didCompleteWithResults:(NSDictionary *)results; (2) 游戏请求失败 - (void)gameRequestDialog:(WAGameRequestDialog *)gameRequestDialog platform:(NSString *const)platform didFailWithError:(NSError *)error; (3) 游戏请求取消 - (void)gameRequestDialogDidCancel:(WAGameRequestDialog *)gameRequestDialog platform:(NSString *const)platform; |
发送游戏邀请请求调用以下接口(注:VK平台一次只能发一次邀请给一个好友):
+(void)gameInviteWithPlatform:(NSString *const)platform Content:(WAGameRequestContent*)content delegate:(NSObject<WAGameRequestDialogDelegate>*)delegate;
代码示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
WAGameRequestContent *gameRequestContent = [[WAGameRequestContent alloc] init]; gameRequestContent.message = @"Take this bomb to blast your way to victory!!!"; gameRequestContent.title = @"Game for you."; //recipients是个数组,可以同时发送给多个好友 NSMutableArray* recipients = [NSMutableArray array]; for (WAAppUser* appUser in _friendSelected) { [recipients addObject:appUser.ID]; } gameRequestContent.recipients = recipients; [WASocialProxy gameInviteWithPlatform:WA_PLATFORM_FACEBOOK Content:gameRequestContent delegate:self]; |
注:如果是VK平台 actionType必须赋值(gameRequestContent.actionType = WAGameRequestActionRequest) VK平台有两个actionType: WAGameRequestActionInvite, WAGameRequestActionRequest。在游戏的测试阶段,请用WAGameRequestActionRequest进行测试。正式上线的时候修改为WAGameRequestActionInvite,参照下图。
成功邀请好友后,在协议方法-gameRequestDialog:platform:didCompleteWithResults:
中调用以下接口向服务器记录邀请信息:
+(void)createInviteInfoWithPlatform:(NSString *const)platform results:(NSDictionary*)results handler:(void (^)(NSUInteger code,NSString* msg, NSError* error)) handler;
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//请求成功 - (void)gameRequestDialog:(WAGameRequestDialog *)gameRequestDialog platform:(NSString *const)platform didCompleteWithResults:(NSDictionary *)results{ //邀请好友成功 发送邀请信息到SDK后台 [WASocialProxy createInviteInfoWithPlatform:WA_PLATFORM_FACEBOOK results:results handler:^(NSUInteger code, NSString *msg, NSError *error) { //当code为200时,表示发送成功 进行相应的操作。 if (code == 200) { //发送成功 }else{ //发送失败 } }]; } |
通过邀请安装使用的用户,安装后需要通知服务器对邀请人进行奖励,必须在玩家进行登录成功或者绑定成功之后时候调用。
+(void)inviteInstallRewardPlatform:(NSString *const)platform TokenString:(NSString*)tokenString handler:(void (^)(NSUInteger code,NSString* msg, NSError* error)) handler;
示例代码:
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 28 29 30 31 |
1.在登录成功的协议(-loginDidCompleteWithResults:)方法中调用 -(void)loginDidCompleteWithResults:(WALoginResult *)result{ if (result.platform == WA_PLATFORM_FACEBOOK||result.platform == WA_PLATFORM_VK) { [WASocialProxy inviteInstallRewardPlatform:result.platform TokenString:result.pToken handler:^(NSUInteger code, NSString *msg, NSError *error) { if (code == 200) { //触发被邀请人安装应用事件接口成功 }else{ //触发被邀请人安装应用事件接口失败 } }]; } } 2.在绑定成功的协议(-bindingDidCompleteWithResult:)方法中调用 -(void)bindingDidCompleteWithResult:(WABindingResult*)result{ if ([result.platform isEqualToString:WA_PLATFORM_FACEBOOK]||[result.platform isEqualToString:WA_PLATFORM_VK]) { [WASocialProxy inviteInstallRewardPlatform:result.platform TokenString:result.accessToken handler:^(NSUInteger code, NSString *msg, NSError *error) { if (code == 200) { //触发被邀请人安装应用事件接口成功 }else{ //触发被邀请人安装应用事件接口失败 } }]; } } |
通过邀请安装使用的用户,在触发定义的特定事件,需要通知服务器奖励邀请人,比如等级达成、充值等,调用以下接口:
+(void)inviteEventRewardWithPlatform:(NSString *const)platform eventName:(NSString*)eventName handler:(void (^)(NSUInteger code,NSString* msg, NSError* error)) handler;
代码示例:
1 2 3 4 5 6 7 8 |
[WASocialProxy inviteEventRewardWithPlatform:WA_PLATFORM_FACEBOOK eventName:@"eventName" handler:^(NSUInteger code, NSString *msg, NSError *error) { if (code == 200) { //发送邀请奖励事件成功 }else{ //发送邀请奖励事件失败 } }]; |
通过Group id查询Group详情,调用以下接口:
+(void)getGroupWithPlatform:(NSString *const)platform groupIds:(NSArray*)groupIds extInfo:(NSString*)extInfo completeBlock:(void(^)(NSArray* groups,NSError* error))block;
示例代码:
1 2 3 4 5 6 7 8 |
[WASocialProxy getGroupWithPlatform:WA_PLATFORM_VK groupIds:@[@"groupid1",@"groupid2"] extInfo:nil completeBlock:^(NSArray *groups, NSError *error) { if (!error) { //查询成功 }else{ //查询失败 } }]; |
WAGroup实体说明
参数名 | 类型 | 说明 | 备注 |
---|---|---|---|
gid | NSString | group id | |
name | NSString | group名称 | |
screen_name | NSString | group screen_name | |
is_closed | int | 是否封闭 | 0 – 开放 1 – 封闭 2 – 私有 |
is_member | BOOL | 当前用户是否该group成员 | 0 – 不是group的成员 1 – 是group的成员 |
type | NSString | 类型 | group — group, page — public page, event — event |
photo | NSString | group图片 | |
photo_medium | NSString | group图片,中尺寸 | |
photo_big | NSString | group图片,大尺寸 | |
desc | NSString | group描述 | |
members_count | int | 成员数 | |
status | NSString | 状态 | |
schemeUrl | NSString | 跳转到应用对应的页面 | |
pageUrl | NSString | 跳转到浏览器对应的页面 |
一个应用只能关联一个Group,通过以下接口可以查询当前应用关联的Group详细信息:
+(void)getCurrentAppLinkedGroupWithPlatfrom:(NSString *const)platform extInfo:(NSString*)extInfo completeBlock:(void(^)(NSArray* groups,NSError* error))block;
示例代码:
1 2 3 4 5 6 7 8 |
[WASocialProxy getCurrentAppLinkedGroupWithPlatfrom:WA_PLATFORM_VK extInfo:nil completeBlock:^(NSArray *groups, NSError *error) { if (!error) { //查询成功 }else{ //查询失败 } }]; |
查询当前用户加入的Group详细信息调用以下接口:
+(void)getCurrentUserGroupWithPlatfrom:(NSString *const)platform extInfo:(NSString*)extInfo completeBlock:(void(^)(NSArray* groups,NSError* error))block;
示例代码:
1 2 3 4 5 6 7 8 |
[WASocialProxy getCurrentUserGroupWithPlatfrom:WA_PLATFORM_VK extInfo:nil completeBlock:^(NSArray *groups, NSError *error) { if (!error) { //查询成功 }else{ //查询失败 } }]; |
这是3.6.5.2 查询当前应用关联的Group和 3.6.5.3 查询当前用户已加入的Group查询到的Group的汇总,调用以下接口:
+(void)getGroupsWithPlatform:(NSString *const)platform extInfo:(NSString*)extInfo completeBlock:(void(^)(NSArray* groups,NSError* error))block;
示例代码:
1 2 3 4 5 6 7 8 |
[WASocialProxy getGroupsWithPlatform:WA_PLATFORM_VK extInfo:nil completeBlock:^(NSArray *groups, NSError *error) { if (!error) { //查询成功 }else{ //查询失败 } }]; |
加入指定的某个Group,调用以下接口:
+(void)joinGroupWithPlatform:(NSString *const)platform groupId:(NSString*)groupId extInfo:(NSString *const)extInfo completeBlock:(void(^)(NSError* error))block;
示例代码:
1 2 3 4 5 6 7 8 |
[WASocialProxy joinGroupWithPlatform:WA_PLATFORM_VK groupId:@"GroupId" extInfo:nil completeBlock:^(NSError *error) { if (!error) { //join Group 成功 }else{ //join Group 失败 } }]; |
进入Group的详情页面,调用以下接口:
+(void)openGroupPageWithPlatform:(NSString *const)platform groupUri:(NSString *const)groupUri extInfo:(NSString*)extInfo
如果客户端已经安装platform指定平台的app客户端,将会进入到app客户端详情页面,如果没有安装,则打开网页详情页。
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
platform | String | Y | 平台类型 | |
groupUri | String | Y | 打开Group的uri | VK平台为screen_name字段值 |
extInfo | String | N | 额外数据信息 | 扩展字段,根据各个平台需要定义 |
示例代码:
1 2 |
[WASocialProxy openGroupPageWithPlatform:WA_PLATFORM_VK groupUri:_group.screen_name extInfo:nil]; |
WINGSDK推送功能是基于苹果APNS,可以给客户端发送推送通知,通过简单几步配置即可使用。
导出App推送证书为p12,并上传到WINGSDK后台。
注意:
1、苹果消息推送证书配置请参考Apple官方文档
http://help.apple.com/xcode/mac/current/#/dev11b059073
添加推送模块依赖方法参考2.2 集成SDK到项目
注:Appsflyer卸载检测某些配置与消息推送一样,但如果是用于Appsflyer,此步骤可忽略
在 Xcode 8.x 以上,必须开启Push Notification能力。找到应用Target设置中的Capabilities -> Push Notifications,确认开关已经设为ON状态。如果没有开启该开关,在 Xcode 8.x 上编译后的应用将获取不到DeviceToken。
为了更好支持消息推送,提高消息到达率,需要配置APNs静默推送权限
1、导入文件头,在AppDelegate中导入:
#import <UserNotifications/UserNotifications.h>
2、初始化消息推送,在AppDelegate的application:initPushWithDelegate:调用下面代码:
1 2 |
[WAPushProxy application:application initPushWithDelegate:self]; |
注:Appsflyer卸载检测某些配置与消息推送一样,但如果是用于Appsflyer,此步骤可忽略
3、监控用户对推送消息的设置
在AppDelegate的application:didRegisterUserNotificationSettings:调用下面代码:
1 2 |
[WACoreProxy application:application didRegisterUserNotificationSettings:notificationSettings]; |
4、注册DeviceToken
在AppDelegate的application:didRegisterForRemoteNotificationsWithDeviceToken:调用下面代码:
1 2 |
[WACoreProxy application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken]; |
5、监控APNs推送错误
在AppDelegate的application:didFailToRegisterForRemoteNotificationsWithError:调用下面代码:
1 2 |
[WACoreProxy application:application didFailToRegisterForRemoteNotificationsWithError:error]; |
6、为更好统计用户在不同场景下和不同iOS系统中收到的消息,需在AppDelegate的application:didReceiveLocalNotification:调用下面代码:
1 2 |
[WACoreProxy application:application didReceiveLocalNotification:notification]; |
7、在iOS 10 以前,为统计 APNs 消息接收事件,需在AppDelegate里的application:didReceiveRemoteNotification:fetchCompletionHandler:回调方法中调用以下接口
1 2 |
[WACoreProxy application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; |
对于iOS 10 及以后版本,为统计 APNs 消息接收事件,需要AppDelegate实现协议 UNUserNotificationCenterDelegate,然后在AppDelegate的 userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:回调方法中调用以下接口:
1 2 |
[WACoreProxy userNotificationCenter:center didReceiveNotificationResponse:response withCompletionHandler:completionHandler]; |
8、iOS10中,App可以在前台获取通知,为统计这种消息的接收情况,需在AppDelegate的userNotificationCenter:willPresentNotification:withCompletionHandler:调用下面代码:
1 2 |
[WACoreProxy userNotificationCenter:center willPresentNotification:notification withCompletionHandler:completionHandler]; |
WINGSDK具备调试模式并提供了检测设备是否越狱接口
1 2 |
[WACoreProxy isJailBreak]; |
+ (NSInteger) checkRewardedVideo;
大于0为可用
示例代码:
1 2 |
[WAAdProxy checkRewardedVideo]; |
+ (void) displayRewardedVideoWithExtInfo:(NSString *)extInfo delegate:(id<WAAdRewardedVideoDelegate>)delegate;
示例代码:
1 2 |
[WAAdProxy displayRewardedVideoWithExtInfo:nil delegate:self]; |
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
extInfo | NSString | N | 额外数据(CP调用展示广告接口传递的自定义数据) | |
delegate | WAAdRewardedVideoDelegate | Y | WAAdRewardedVideoDelegate代理 |
在调用3.9.2显示广告代码,需要实现WAAdRewardedVideoDelegate代理
- (void) adPreDisplayRewardedVideoWithCampaignId:(NSString *)campaignId adSetId:(NSString *)adSetId rewarded:(NSString *)rewarded rewardedCount:(NSInteger)rewardedCount extInfo:(NSString *)extInfo;
参数名 | 类型 | 说明 | 备注 |
---|---|---|---|
campaignId | NSString | 活动Id | |
adSetId | NSString | 广告Id | |
rewarded | NSString | 奖励物品 | |
rewardedCount | NSInteger | 奖励物品数量 | |
extInfo | NSString | 额外数据(CP调用展示广告接口传入的自定义数据) |
- (void) adDidCancelRewardedVideoWithCampaignId:(NSString *)campaignId adSetId:(NSString *)adSetId process:(WAAdCancelType)process extInfo:(NSString *)extInfo;
参数名 | 类型 | 说明 | 备注 |
---|---|---|---|
campaignId | NSString | 活动Id | |
adSetId | NSString | 广告Id | |
process | WAAdCancelType | WAAdCancelTypePlayBefore 播放前取消 WAAdCancelTypePlaying 播放过程中取消 WAAdCancelTypeAfter 播放后取消 |
|
extInfo | NSString | 额外数据(CP调用展示广告接口传入的自定义数据) |
- (void) adDidFailToLoadRewardedVideoWithCampaignId:(NSString *)campaignId adSetId:(NSString *)adSetId extInfo:(NSString *)extInfo;
参数名 | 类型 | 说明 | 备注 |
---|---|---|---|
campaignId | NSString | 活动Id | |
adSetId | NSString | 广告Id | |
extInfo | NSString | 额外数据(CP调用展示广告接口传入的自定义数据) |
- (void) adDidDisplayRewardedVideoWithCampaignId:(NSString *)campaignId adSetId:(NSString *)adSetId rewarded:(NSString *)rewarded rewardedCount:(NSInteger)rewardedCount extInfo:(NSString *)extInfo;
参数名 | 类型 | 说明 | 备注 |
---|---|---|---|
campaignId | NSString | 活动Id | |
adSetId | NSString | 广告Id | |
rewarded | NSString | 奖励物品 | |
rewardedCount | NSInteger | 奖励物品数量 | |
extInfo | NSString | 额外数据(CP调用展示广告接口传入的自定义数据) |
- (void) adDidClickRewardedVideoWithCampaignId:(NSString *)campaignId adSetId:(NSString *)adSetId rewarded:(NSString *)rewarded rewardedCount:(NSInteger)rewardedCount extInfo:(NSString *)extInfo;
参数名 | 类型 | 说明 | 备注 |
---|---|---|---|
campaignId | NSString | 活动Id | |
adSetId | NSString | 广告Id | |
rewarded | NSString | 奖励物品 | |
rewardedCount | NSInteger | 奖励物品数量 | |
extInfo | NSString | 额外数据(CP调用展示广告接口传入的自定义数据) |
+ (void)setWAAdRewardedVideoCachedDelegate:(id<WAAdRewardedVideoCachedDelegate>)delegate;
示例代码:
1 2 |
[WAAdProxy setWAAdRewardedVideoCachedDelegate:self]; |
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
delegate | WAAdRewardedVideoCachedDelegate | Y | WAAdRewardedVideoCachedDelegate代理 |
在调用3.9.4设置视频广告缓存回调代码,需要实现WAAdRewardedVideoCachedDelegate代理
视频广告缓存完成回调
- (void)adDidRewardedVideoCachedWithCacheCount:(NSInteger)cacheCount;
参数名 | 类型 | 说明 | 备注 |
---|---|---|---|
cacheCount | NSInteger | 可用广告数量,大于0为可用 |
1 2 |
[WACscProxy isOpenAiHelp]; |
说明:该接口返回布尔值,true表示已开启,false表示未开启。在使用其他AIHELP接口前请先判断这个接口,在返回true的情况下使用。示例如下:
1 2 3 4 5 6 7 |
if([WACscProxy isOpenAiHelp]){ [WACscProxy openAiHelp:@"zh_CN" isVip:vip]; } |
1 2 3 |
[WACscProxy openAiHelp:language isVip:vip]; |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
language | String | Y | 语言设置 | 如果使用默认配置传null,比如简体中文传zh_CN。 |
isVip | boolean | Y | 是否vip用户 | true表示vip用户,false是非vip用户。 |
说明:这个接口展示的界面由WING后台中SDK客服开关配置决定。如果后台未开启客服开关,此接口不生效。同时提供了无参数的重载方法WACscProxy.openAiHelp(),表示使用默认语言设置和设置非Vip用户。
1 2 |
+ (void)setLanguage:(nonnull NSString *)language |
示例代码:
1 2 |
[WACscProxy setLanguage:@"zh_CN"]; |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
language | NSString | Y | 语言名称 | 语言支持如下图 |
语言支持列表图:
1 2 |
-(void)userCenterNoticeWithResult:(WAUserCenterResult *)result; |
WAUserCenterResult说明
字段名 | 类型 | 说明 | 备注 |
---|---|---|---|
code | int | 状态码 | 参照5.1.1 状态码说明 |
msg | string | 错误信息 | — |
userCenterInfo | string | 用户中心文字内容 | — |
uid | string | 用户ID | — |
characterId | string | 充值中心Character ID |
1 2 |
[WAUserProxy getUserCenterNotice:(id<WAUserCenterNoticeDelegate>)delegate]; |
1)用户中心界面关闭回调接口
1 2 |
- (void)userCenterNoticeClose; |
2)用户中心界面错误回调接口
1 2 |
- (void)userCenterNoticeError:(NSError *)error; |
1 2 |
[WAUserProxy showUserCenterNoticeUI:(id<WAUserCenterNoticeUIDelegate>)delegate]; |
cp可根据需求,调用appStore评分界面,调用方法
1 2 |
[WAUserProxy openReview]; |
系统要求:iOS10.3及以上系统才可以调起评分界面。
sdk内部已经完成了UI展示,以及请求接口操作,CP只需要调用即可。
类名:WAUserProxy
方法名:requestDeleteAccoutUI
返回值:callback
调用方法:WAUserProxy.requestDeleteAccoutUI
调用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[WAUserProxy requestDeleteAccoutUI:^(NSError *error, NSUInteger status) { if(error){ // 有错误,展示错误信息 NSLog(@"错误信息====%@",error.userInfo[WAErrorDeveloperMessageKey]]); // [self showToastMessage:error.userInfo[WAErrorDeveloperMessageKey]]; return; } if(status==WA_ACCOUNT_DELETE_UI_SUCCESS ){ [WAUserProxy logout]; [self showToastMessage:@"注销成功,cp需要退出sdk登录,以及cp退出登录页"]; } }]; |
接口版本为,cp需要自己做UI,然后调用sdk接口进行删除操作。
描述:如果是SIGGINWITHAPPLE登录(可通过接口[WAUserProxy getCurrentLoginPlatform]获取登录方式),需要单独授权一次拿到授权信息,然后再调用请求删除账号接口,目前只支持SIGGINWITHAPPLE
类名:WAUserProxy
方法名:deleteAccounAuthorizationWithPlatform
请求参数:paltform,登录平台
调用方法:WAUserProxy.deleteAccounAuthorizationWithPlatform
调用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
if ([[WAUserProxy getCurrentLoginPlatform] isEqualToString:WA_PLATFORM_SIGNINWITHAPPLE]) { [WAUserProxy deleteAccounAuthorizationWithPlatform:WA_PLATFORM_SIGNINWITHAPPLE completeBlock:^(NSError *error, WADeleteRequestModel *deleteResult) { // 删除账号接口 [WAUserProxy requestDeleteAccout:deleteResult completeBlock:^(NSError *error, WADeleteResult *result) { if(error){ [self showToastMessage:error.userInfo[WAErrorDeveloperMessageKey]]; return; } [WAUserProxy logout]; NSLog(@"注销成功,cp需要退出sdk登录,以及cp退出登录页"); NSLog(@"申请时间==%@",result.apply_date); NSLog(@"删除时间==%@",result.delete_date); }]; }]; } |
WADeleteRequestModel说明
字段名 | 类型 | 说明 | 备注 |
---|---|---|---|
deletePlatform | string | 删除平台(Facebook,Apple) | — |
deleteToken | string | 删除平台accessToken | — |
类名:WAUserProxy
方法名:requestDeleteAccout
请求参数:(WADeleteRequestModel*)deleteResult,如无则传递nil。此参数通过调用第三方账号删除授权接口回掉获取。如signinwithappie需要传递此参数
返回值:callback
调用方法:WAUserProxy.requestDeleteAccout
调用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
if ([[WAUserProxy getCurrentLoginPlatform] isEqualToString:WA_PLATFORM_SIGNINWITHAPPLE]) { [WAUserProxy deleteAccounAuthorizationWithPlatform:WA_PLATFORM_SIGNINWITHAPPLE completeBlock:^(NSError *error, WADeleteRequestModel *deleteResult) { // 删除账号接口 [WAUserProxy requestDeleteAccout:deleteResult completeBlock:^(NSError *error, WADeleteResult *result) { if(error){ [self showToastMessage:error.userInfo[WAErrorDeveloperMessageKey]]; return; } [WAUserProxy logout]; NSLog(@"注销成功,cp需要退出sdk登录,以及cp退出登录页"); NSLog(@"申请时间==%@",result.apply_date); NSLog(@"删除时间==%@",result.delete_date); }]; }]; } |
类名:WAUserProxy
方法名:cancelRequestDeleteAccoutWithUserid
返回值:callback
调用方法:WAUserProxy.cancelRequestDeleteAccoutWithUserid
调用示例:
1 2 3 4 5 6 7 8 |
[WASdkAccountDeleteHandler cancelRequestDeleteAccoutWithUserid:userid callback:^(NSError * error) { if(!error){ NSLog(@"取消删除账号成功"); } }] |
游戏如需使用Facebook相关登录、社交、数据收集功能,需要进行以下配置。如果不需要相关功能,请忽略此章节
具体配置请参考第三方后台配置—iOS版 二、Facebook第三方登录后台配置。
1、在facebook开发者平台创建一个Facebook应用,创建完之后会生成App ID和App Secret
这里的App ID要配置在项目当中,作为客户端与后台服务器连接的标识
注:从3.9.7版本开始,需要配置FacebookClientToken,获取方式:设置-高级-客户端口令
2、在Xcode中配置相应的信息,主要是在info.plist文件中配置URL Schemes、FacebookAppID、FacebookDisplayName、FacebookClientToken。注意一定要对应到facebook后台该App的App ID和Display Name、FacebookClientToken。参考步骤1的截图。
3、针对iOS9做的一些配置
(1)Whitelist Facebook Servers for Network Requests
在info.plist增加下面配置
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 28 29 30 |
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> <key>NSExceptionDomains</key> <dict> <key>facebook.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> <key>fbcdn.net</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> <key>akamaihd.net</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <false/> </dict> </dict> </dict> |
(2)Whitelist Facebook Apps
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<key>LSApplicationQueriesSchemes</key> <array> <string>fbapi</string> <string>fbapi20130214</string> <string>fbapi20130410</string> <string>fbapi20130702</string> <string>fbapi20131010</string> <string>fbapi20131219</string> <string>fbapi20140410</string> <string>fbapi20140116</string> <string>fbapi20150313</string> <string>fbapi20150629</string> <string>fbapi20160328</string> <string>fbauth</string> <string>fb-messenger-share-api</string> <string>fbauth2</string> <string>fbshareextension</string> </array> |
权限 | 类型 | 权限取值 | 说明 |
---|---|---|---|
读取用户配置 | string | public_profile | |
读取好友列表 | string | user_friends |
游戏如需使用APPLE账号进行登录、APPLE商店进行支付,需要进行以下配置。 如果不需要使用APPLE相关功能,请忽略此章节
具体配置请参考第三方后台配置—iOS版 一、Apple后台应用配置。
游戏如需使用Appsflyer相关数据收集功能,需要进行以下配置。如果不需要相关功能,请忽略此章节
详见2.6.1 配置 (wa_sdk_track_config.plist)
a)官方说明:https://support.appsflyer.com/hc/en-us/articles/211211963-iOS-Uninstall-Tracking
b)对接WINGSDK代码同3.7消息推送
c) 导出App推送证书p12文件,进入appsflyer后台–配置-应用配置-卸载模块
上传p12证书与密码,点击验证。开启卸载衡量开关
游戏如需使用Chartboost相关数据收集功能,需要进行以下配置。如果不需要相关功能,请忽略此章节
1.数据收集配置:详见2.6.1 配置 (wa_sdk_track_config.plist)
游戏如需使用VK相关登录、社交功能,需要进行以下配置。如果不需要相关功能,请忽略此章节
在xcode配置URL Schemes:
在VKapp管理后台https://vk.com/apps?act=manage找到对应App的配置信息。将下图中Application ID(标注1)填到Xcode中的URL Schemes(标注2)。注意加上前缀vk。
游戏如需使用Twitter账号登录游戏,需要进行以下配置。如果不需要相关功能,请忽略此章节
Twitter需要iOS 9.0以上编译,如果使用9.0以下版本编译,会导致应用闪退。具体配置请参考第三方后台配置—iOS 四、Twitter后台应用配置
1、在twitter开发者平台创建一个twitter应用,创建完之后会生成Consumer Key和Consumer Secret
这里的Consumer Key和Consumer Secret要配置在项目info.plist中,作为客户端与后台服务器连接的标识。
可复制下面代码到info.plist中在修改为对应Consumer Key和Consumer Secret。
1 2 3 4 5 6 7 8 |
<key>Twitter</key> <dict> <key>consumerKey</key> <string>Consumer Key</string> <key>consumerSecret</key> <string>Consumer Secret</string> </dict> |
2、配置URL Scheme
URL Scheme格式:twitterkit-
例如: twitterkit-SPRwO9pH5p9bJCAbUHaiV8oQY
游戏如需使用Instagram账号登录游戏,需要进行以下配置。如果不需要相关功能,请忽略此章节
具体配置请参考第三方后台配置—iOS 五、Instagram后台应用配置
在instagram开发者平台创建一个instagram应用,创建完之后会生成Client ID、Client Secret和Website URL
这里的Client ID、Client Secret和Website URL要配置在项目info.plist中clientId、clientSecret和redirectUri,作为客户端与后台服务器连接的标识。
可复制下面代码到info.plist中在修改为对应clientId、clientSecret和redirectUri
1 2 3 4 5 6 7 8 9 10 |
<key>Instagram</key> <dict> <key>clientId</key> <string>your Client Id</string> <key>clientSecret</key> <string>your Client Secret</string> <key>redirectUri</key> <string>your Redirect Uri</string> </dict> |
如果不需要AiHelp 功能,请忽略此章节
具体配置请参考WINGSDK第三方后台配置-智能客服 AIHelp 相关章节。
可复制下面代码到info.plist中在修改为对应appId、domain和appSecret(appKey)
1 2 3 4 5 6 7 8 9 10 |
<key>AiHelp</key> <dict> <key>appId</key> <string>your appId</string> <key>domain</key> <string>your domain</string> <key> appSecret</key> <string>your appKey</string> </dict> |
注:从3.9.7版本开始,项目中的domain如果为gamehollywoodhk@aihelp.net,接入新版本后,可能后闪退,需要把domain的@改成.
如 gamehollywoodhk.aihelp.net
Privacy – Photo Library Additions Usage Description
如果不需要Firebase 功能,请忽略此章节
具体配置请参考WINGSDK第三方后台配置-Firebase相关章节。
1、引入WAFirebaseImpl库到项目
2、引用GoogleService-Info.plist配置文件到项目中
Firebase SDK会自动收集事件,详情请参考:Firebase自动收集事件。
完成以上两个步骤,即完成Firebase 模块的接入工作
firebase analytics调试方法
1、在xcode中,选择Product > Scheme > Edit scheme…
2、在左侧菜单选择Run
3、选择Arguments 项
4、在Arguments Passed On Launch区域,添加-FIRAnalyticsDebugEnabled
5、运行项目后,登录firebase 管理后台,项目—分析—DebugView模块,可查看到调试设备上传事件
SDK所有的状态码都定义在枚举WACode中,详见下表:
枚举名称 | 取值 | 说明 |
---|---|---|
WACodeSuccess | 200 | 成功 |
WACodeError | 400 | 错误 |
WACodeUnautherized | 401 | 请求未认证:访问受限资源是缺少认证信息,或者认证未通过 |
WACodeForbiden | 403 | 禁止访问:由于应用上下文原因或请求端上下文的原因被禁止访问资源,例如IP限制等 |
WACodeNotFound | 404 | 找不到被访问资源:接口不存在、页面不存在或对应的业务实体找不到 |
WACodeServerError | 500 | 服务器内部故障 |
WACodeApiInvalid | 501 | 所请求接口或页面未实现 |
WACodeSdkAppIdInvalid | 4010 | 无效appId: appId不存在或未开启 |
WACodeSignError | 4011 | 无效osign:osign校验失败 |
WACodeRequestTimeOut | 4012 | 请求已过期:ots校验失败 |
WACodeAccountVerifyError | 4013 | 第三方平台验证失败 |
WACodeAccountVerifyError | 4014 | 访客登录验证失败,登录验证失败 |
WACodePlatformBoundAlready | 4015 | 用户已经绑定了这个平台的其他账户 |
WACodePrePlatformVerifyError | 4016 | prePlatform验证失败 |
WACodeUserNotFound | 4017 | 用户不存在(没有找到) |
WACodeAccountBoundByOthers | 4018 | 账户已经被其他用户绑定 |
WACodeOrderIdInvalid | 4019 | 无效orderId |
WACodeOrderVerifyError | 4020 | 订单验证失败 |
WACodeRewardNotFound | 4021 | FB邀请奖励事件未找到奖励政策 |
WACodeRepeatCrashReport | 4022 | 闪退发送报告重复 |
WACodeChannelNotFound | 4023 | 未找到渠道信息 |
WACodeCanNotUnbind | 4024 | 不可以执行解绑操作 |
WACodeExchangeRateConversionFailure | 4025 | 汇率转换失败 |
WACodePayPlatformClosed | 4026 | 支付渠道已关闭 |
WACodeLoginPlatformClosed | 4029 | 登录渠道已关闭 |
WACodeBindAccountClosed | 4048 | 账号绑定关闭 |
WACodeUnBindAccountClosed | 4049 | 账号解绑关闭 |
WACodeUserCenterClosed | 4059 | 用户中心未开启 |
WACodeCanNotSwitchToAnonymous | 5001 | 切换到匿名 |
WACodeFbObjectType | 5002 | facebook的objectType不能为空 |
WACodeFbGiftListRequestPrameterLack | 5003 | 请求gift列表缺少appid,appSecret,objectType参数 |
WACodeFbTokenNull | 5004 | facebook token为空 |
WACodeCanNotMakePayment | 5005 | 该设备不能支付或者不允许支付 |
WACodePaymentError | 5006 | 支付过程中出错 |
WACodeCancelled | -100 | 取消操作 |
WACodeSdkUninitialized | -200 | SDK没有初始化 |
WACodeContentCanNotBeShared | -201 | 内容不可分享,一般是传入的内容为空,或者其他 |
WACodeNotLogin | -202 | 没有登录 |
WACodeLoginFailure | -203 | 登录失败 |
WACodeNoPermission | -204 | 登录没有获取到相应的权限 |
WACodeFileSizeLimit | -206 | 文件大小超出限制 |
WACodeCurrentIDNotMatch | -211 | 登录的平台账户和当前用户不匹配 |
WACodeDeviceNotSupported | -401 | 设备不支持 |
WACodeNetworkUnavailable | -402 | 网络不可用 |
WACodePayReOrderTimeLimit | -509 | 支付:订单时间间隔限制(在特定的时间内重复下订单) |
常量 | 取值 | 备注 |
---|---|---|
WA_PLATFORM_WINGA | WINGA | WA平台,分匿名登录和应用内登录 |
WA_PLATFORM_APPLE | APPLE | APPLE平台 |
WA_PLATFORM_FACEBOOK | Facebook平台 | |
WA_PLATFORM_VK | VK | VK平台 |
取值值 | 说明 | 备注 |
---|---|---|
INVITE | 邀请 | |
REQUEST | 普通请求 |
注:vk平台测试游戏邀请功能需要申请权限,可以把请求类型设置成WA_REQUEST_TYPE_REQUEST来测试普通邀请,带申请权限通过后改成WA_REQUEST_TYPE_INVITE来测试。关于vk邀请功能的业务流程图如下:
静态变量名称 | 事件名称 | 说明 |
---|---|---|
WAEventInitiatedPurchase | ghw_initiated_purchase | 点击购买 |
WAEventPurchase | ghw_purchase | 购买完成 |
WAEventUserCreate | ghw_user_create | 创建角色 |
WAEventUserInfoUpdate | ghw_user_info_update | 更新用户信息 |
WAEventUserImport | ghw_user_import | 导入用户 |
WAEventTaskUpdate | ghw_task_update | 玩家任务统计 |
WAEventLevelAchieved | ghw_level_achieved | 等级或分数 |
参数意义 | 值 | 类型 | 备注 |
---|---|---|---|
货币类型 | currencyType | Stirng | 货币类型:如美元USD,人民币CNY详见货币表 |
现金额 | currencyAmount | Int | |
价钱 | price | Double | |
道具类型 | ContentType | String | |
道具ID | contentId | Stirng | |
搜索内容 | searchString | Stirng | |
成功失败 | success | Bool | 0表示失败 1表示成功 |
是否可获得 | ghw_payment_info_available | Bool | 1表示可获得, 0表示不可获得 |
物品数量 | itemAmount | Int | |
物品id | itemId | Stirng | 道具id |
物品名称 | itemName | Stirng | 道具名称 |
是否为第一次导入 | isFirstEnter | Int | |
得分 | score | Int | |
描述 | description | Stirng | |
性别 | gender | int | 性别(int): 0表示女, 1表示男, 2表示未知 |
年龄 | age | Int | |
账户类型 | accountType | Stirng | |
设备id | deviceId | Stirng | |
渠道id | channelId | Stirng | |
广告标识 | idfa | Stirng | |
交易流水号 | transactionId | Stirng | |
支付类型 | paymentType | Int | 0表示google支付, 1表示apple支付, 2表示赠送 |
虚拟游戏币 | virtualCoinAmount | Int | |
道具名称 | iapName | Stirng | |
道具数量 | iapAmount | Stirng | |
道具id | iapId | Stirng | |
注册时间 | registerTime | String | 时间戳(从1970年开始) |
任务id | taskId | String | |
任务名称 | taskName | String | |
任务类型 | taskType | String | |
任务状态 | taskStatus | String | 状态标识: 1->领取任务, 2->开始任务, 3->待领奖(任务完成), 4->已领奖 |
角色名称 | nickName | String | |
vip等级 | vip | Int | |
状态 | status | Int | 状态标识,-1: 锁定,1:未锁定 |
游戏角色Id | gameUserId | String | |
角色类型 | roleType | String | |
绑定钻石 | bindGameGold | Int | |
用户钻石数 | gameGold | Int | |
战斗力 | fighting | Int | |
货币类型 | goldType | String | 货币类型(string) 钻石,绑定钻石,金币,军魂等。预定义有1和2: 1:游戏货币; 2:游戏绑定货币 |
变更途径 | approach | String | |
当前货币数量 | currentAmount | Int | 用户变更以后该种货币的数量 |
变更货币数 | amount | Int |
对接完成之后可以使用工具进行校验:点击下载
本工具用于协助对接完Wing SDK后,检查相关的配置、包引入等是否正确,具体使用方法见操作手册
提供 UI界面 和 接口调用 两种方式,满足用户不同需求。
内置登录UI弹窗,内含所有已经集成的登录方式,无需编写界面,一键集成登录功能
WINGSDK匿名登录无需账户密码,根据设备信息新建用户或登录已存在的用户,可以快速登录游戏。
第三方平台登录接口可以通过第三方平台账户登录,返回WINGSDK账号信息,使用没有绑定任何WINGSDK账号的第三方平台账号登录,会自动新建一个WINGSDK账号,并且与该平台账号绑定。支持Facebook登录、Google登录、VK登录。
内置账户管理UI界面,无需编写界面和逻辑,即可对账户进行管理,平台账户绑定情况一目了然,绑定、解绑平台账户,新建账号,切换账号,轻松搞定。
账号绑定接口,可以将WINGSDK账号跟第三方平台的账号绑定,绑定成功后可以使用绑定的平台账号登录,在同一应用中一个平台账号只能绑定一个WINGSDK账号。
账号解绑接口,可以将第三方平台账号与其绑定的WINGSDK账号解绑,解绑成功后,平台账号可以与WINGSDK账号再次绑定。
绑定账号查询接口,能够查询此时登录的账号(WINGSDK)已经绑定的第三方平台账号列表。
一键切换账号,迅速切换WINGSDK账号或者第三方账号。
支付模块提供支付充值接口,集成简单,无需理会复杂的支付流程,轻松完成商品的购买(充值)。
数据收集模块提供了数据收集的接口,多渠道灵活调用。数据收集包含了丰富的应用内的事件类型,还支持用户自定义事件类型。
社交模块,为游戏提供社交功能支持,一键集成,功能丰富。社交模块包含以下功能:
1、分享接口,支持分享链接、文字、图片、视频
2、游戏邀请,邀请还没有玩过该游戏的好友跟自己一起玩这款游戏,邀请好友一起玩游戏,还有丰富的邀请奖励;
3、Game Service,游戏互动更简单;
4、社区,提高玩家的积极性和互动。
应用墙模块,提供应用、游戏的推广下载,引导用户安装。
注意:此模块会对应用商店上架造成一定的风险,请酌情使用。
WINGSDK推送功能,可以向客户端推送消息,通过简单几步配置即可使用。
WINGSDK广告功能,可以向玩家展示视频广告,并且可以实现奖励机制。
WINGSDK智能客服功能,集成机器人、人工客服,FAQ等功能。
为了遵守欧盟以及Google等第三方的一些关于用户隐私的法律法规,WINGSDK实现了一套简单的用户隐私政策流程。分为两种类型,一种是自动的,针对的是对接了登录窗口方式的CP,这种情况CP无需接入任何新的接口;一种手动的,针对的是对接了接口登录的CP,这种情况CP需要对接新的接口,具体接口参考隐私政策接口章节。
WINGSDK用户中心功能,可以向玩家展示充值中心账号、初始密码、信息内容。
目前各方机构对用户隐私比较敏感,很多权限已经被禁止使用,比如google不允许同时收集谷歌广告id以及Imei。为了确保安全过审,建议通过以下配置禁止Imei获取。具体如下:
1)AndroidManifest.xml中关闭
默认情况下,WINGSDK内部在可以获取到权限的情况下会去获取谷歌广告Id、Imei,可以在AndroidManifest.xml中<manifest><application>
标签下配置开关明确禁止获取Imei,这样WINGSDK将不会再获取Imei号。
获取Imei(默认关闭):
1 2 |
<meta-data android:name=”com.wa.sdk.interface.ENABLE_IM” android:value=”true”/> |
2)去掉Imei权限
获取imei需要READ_PHONE_STATE这个权限, google可能是根据这个权限来判断应用中是否有获取imei的行为。
1 2 |
<uses-permission android:name=”android.permission.READ_PHONE_STATE” /> |
如果应用要上架谷歌应用市场需要在AndroidManifest.xml中去掉该权限。
Android API 15及以上版本
jdk1.7及以上版本。
compileSdkVersion 26及以上版本
WINGSDK基于gradle提供了多种集成方式:Gradle自动集成、手动集成、Eclipse项目集成、命令行集成,可以根据需要选择其中任意一种方式。
集成参考demo: demo代码下载地址
第三方SDK依赖关系如下表
第三方SDK | 版本 |
---|---|
com.google.android.gms:play-services-base:18.0.1 com.google.android.gms:play-services-auth:20.0.1 com.google.android.gms:play-services-games:22.0.1 com.google.android.gms:play-services-ads-identifier:18.0.1 com.android.billingclient:billing:4.0.0 com.google.android.play:review:2.0.1 com.google.gms:google-services:4.3.10 |
|
Google Firebase | com.google.firebase:firebase-analytics:21.2.1 com.google.firebase:firebase-messaging:23.1.2 |
16.0.1 | |
APPSFLYER | 6.10.1 |
CHARTBOOST | 8.3.1 |
VK | 1.6.9 |
3.3.0 | |
AIHELP | 4.2.6 |
glide | 4.11.0 |
更新至2018年12月11日(无版本号) | |
华为海外 | com.huawei.hms:hwid:6.7.0.300 com.huawei.hms:iap:6.4.0.301 com.huawei.hms:hianalytics:6.8.0.300 com.huawei.agconnect:agconnect-crash:1.7.2.300 com.huawei.agconnect:agconnect-apms:1.6.1.303 com.huawei.hms:ads-identifier:3.4.56.300 |
新项目配置:在项目目录下的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() //这里是新增的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 |
apply plugin: 'maven' allprojects { repositories { jcenter() maven { allowInsecureProtocol= true url "http://repo.wingsdk.cn:8081/repository/winga-group/" } } } |
注意:
1)部分项目中可能只有一个build.gradle文件;
2)以上的url为WingSdk仓库地址:http://repo.wingsdk.cn:8081/repository/winga-group/
在程序module下面的build.gradle文件的dependencies内增加依赖配置;
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 28 29 30 31 32 33 34 35 36 |
// 基础模块(必选) compile 'com.wa.sdk:wa-sdk-base:X.X.X' // 核心模块(必选) compile 'com.wa.sdk:wa-sdk-core:X.X.X' // Firebase模块(3.9.3及之后必选) compile 'com.wa.sdk:wa-sdk-firebase: x.x.x' // AppsFlyer模块(可选) compile 'com.wa.sdk:wa-sdk-appsflyer:X.X.X' // Chartboost模块(可选) compile 'com.wa.sdk:wa-sdk-chartboost:X.X.X' // Facebook模块(可选) compile 'com.wa.sdk:wa-sdk-facebook:X.X.X' // Google模块(可选) compile 'com.wa.sdk:wa-sdk-google:X.X.X' // VK模块(可选) compile 'com.wa.sdk:wa-sdk-vk:X.X.X' // 网页支付模块(可选,如果需要第三方支付则需要添加此模块) compile 'com.wa.sdk:wa-sdk-webpay:X.X.X' // 应用墙模块(可选) compile 'com.wa.sdk:wa-sdk-apw:x.x.x' // 推送模块(可选3.9.3版本已移除,改为firebase模块) compile 'com.wa.sdk:wa-sdk-push:x.x.x' // Twitter模块(可选) compile 'com.wa.sdk:wa-sdk-twitter:x.x.x' // Instagram模块(可选) compile 'com.wa.sdk:wa-sdk-instagram:x.x.x' // WINGSDK广告模块(可选) compile 'com.wa.sdk:wa-sdk-ad:x.x.x' // WA AIHelp模块(可选) compile 'com.wa.sdk:wa-sdk-aihelp:x.x.x' // 华为HMS模块(可选) compile 'com.wa.sdk:wa-sdk-huaweihms:x.x.x' // 网页集成登录,GHG和R2平台 (可选) compile 'com.wa.sdk:wa-sdk-weblogin:x.x.x' |
注意:
1)部分项目中可能只有一个build.gradle文件;
2)以上的“必选”项目必须引入,“可选”项目可根据需求引入。
3) 其中x.x.x为各个模块的具体版本号,随SDK版本升级会发生改变,各个版本对应的渠道包版本请参考:https://admin.wingsdk.com/developers/pack_config.do 在这个地址页面,也可以通过选择版本和所需要的渠道,一键生成依赖脚本配置。
打包配置页面地址在上面章节查找。下载页面如下图所示:
打开项目,在菜单“File→New→New Module”
打开新建Module页面,选择“Import .JAR/.AAR Package”项,下一步
选择下载好的SDK .AAR包,导入
此时项目的目录将会多了一个上面新建的Module,然后将Module关联到程序Module中,关联方法有两种:
第一种:直接在程序Module中的build.gradle的dependencies下添加代码(单引号内部为要关联的Module名称,以冒号“:”开头)
1 2 |
compile project(':wa_sdk_base') |
第二种:选中程序Module,鼠标右键→Open Module Settings(或F12),打开程序Module设置面板
在打开的Module设置窗口中选中程序Module,定位到“Dependencies”选项卡,点击“+”符号添加依赖,选择“Module Dependency”,
弹出Module选择窗口,在这个窗口中会展示出所有的未关联的Module
选中要关联的Module,OK→OK完成配置
1)wa-sdk-base AAR包(必选)
2)wa-sdk-core AAR包(必选)
需要依赖androidx.legacy:legacy-support-v4
1 2 |
compile 'androidx.legacy:legacy-support-v4:1.0.0' |
3)wa-sdk-appsflyer AAR包(可选)
需要依赖AppsFlyer AAR包,5.3.0版本
1 2 |
compile 'com.appsflyer:af-android-sdk:5.3.0@aar' |
4)wa-sdk-chartboost AAR包(可选)
5)wa-sdk-facebook AAR包(可选)
需要依赖Facebook SDK,6.5.1版本
1 2 |
compile 'com.facebook.android:facebook-android-sdk:6.5.1' |
6)wa-sdk-google AAR包(可选)
需要依赖Google Service相关包,版本为16.0.1
1 2 3 4 5 |
compile 'com.google.android.gms:play-services-base:16.1.0' compile 'com.google.android.gms:play-services-plus:16.0.0' compile 'com.google.android.gms:play-services-auth:16.0.1' compile 'com.google.android.gms:play-services-games:17.0.0' |
7)wa-sdk- vk AAR包(可选)
需要依赖VK SDK包,版本1.6.9
1 2 |
compile 'com.vk:androidsdk:1.6.9' |
8)wa-sdk-webpay AAR包(可选)
9) wa-sdk-push AAR包(可选)
需要依赖Google Firebase相关包,版本为15.0.2
1 2 3 4 |
compile 'com.google.firebase:firebase-core:16.0.9', compile 'com.google.firebase:firebase-messaging:18.0.0', compile 'com.firebase:firebase-jobdispatcher:0.8.5', |
10) wa-sdk-twitter AAR包(可选)
需要依赖Twitter sdk,版本3.3.0
1 2 |
compile 'com.twitter.sdk.android:twitter:3.3.0' |
11) wa-sdk-instagram AAR包(可选)
12) wa-sdk-ad AAR包(可选)
13) wa-sdk-aihelp AAR包(可选)
需要依赖aihelp sdk,版本1.7.2.2
1 2 |
compile 'net.aihelp:elva:1.7.2.2' |
说明:以上的“必选”项目必须引入,“可选”项目可根据需求引入
在AndroidManifest.xml中application标签下添加以下设置。不同的应用配置的参数值不相同,需要申请相应资源。
1 2 3 4 5 6 7 8 9 10 |
<!-- sdk的appid --> <meta-data android:name="com.wa.sdk.APP_ID" android:value="f7f9a9d18da611e5a0be000d3a906774" /> <!-- sdk的appkey --> <meta-data android:name="com.wa.sdk.APP_KEY" android:value="CFHF7nQCCaojCX6Sm4eT1GEIWRprimgX" /> <!-- sdk平台请求的host地址,所有请求的前面公共部分 --> <meta-data android:name="com.wa.sdk.HTTP_BASE_URL" android:value="https://api.wingsdk.com/sdkapi" /> <!-- 数据收集请求地址 --> <meta-data android:name="com.wa.sdk.track.BASE_URL" android:value="https://api.wingsdk.com/data"/> |
注意:以上配置中android:name必须保持一致,android:value根据CP应用申请的资源而定。
注:WINGSDK中使用到的权限
1)SDK内部自动添加的权限(普通权限)
1 2 3 4 5 |
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="com.android.vending.BILLING" /> |
2)CP选配权限(危险权限) 如果应用上Google推荐,需注意Google推荐位需知
1 2 3 |
<!-- 可选(但建议配置)允许读取设备状态,包括设备的标识、电话号码、蜂窝网信息、任何正在进行的呼叫状态,以及设备注册的任何电话账户列表,此权限用于提高数据收集跟踪的精准性 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> |
在所有使用到SDK接口的Activity的onActivityResult方法中增加以下代码:
1 2 3 4 5 6 7 8 9 |
@Override protected void onActivityResult(int requestCode, int resultCode, Intent intent) { if (WACommonProxy.onActivityResult(requestCode, resultCode, intent)) { return; } super.onActivityResult(requestCode, resultCode, intent); } |
调用下面接口对SDK进行初始化:
1 2 |
WACoreProxy.initialize(Activity activity); |
注意:SDK初始化必须在第一个Activity的onCreate()方法中调用,强烈建议在UI线程中调用。
注意:测试时,需要联系运营添加测试设备,才能出现登录方式。
SDK内置了一个包含所有支持的登录方式的一个对话框,通过调用以下接口显示对话框:
1 2 |
WAUserProxy.loginUI(Activity activity, boolean enableCache, WACallback<WALoginResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用接口的Activity | |
enableCache | boolean | Y | 是否启用登录缓存,true为启用,false为关闭 | 如果开启登录缓存,那么调用这个接口的时候会看是否有登录记录,如果有,不会显示登录方式选择对话框,直接使用上一次的登录方式登录。 |
callback | WACallback<WAloginResult> | N | 回调,用来返回登录结果 | 2.4.3 处理登录结果 |
注意:使用登录窗口时,点击图标登录SDK自动弹出加载框,无需再次添加加载框。
使用登录窗口对话框进行登录,如果启用了缓存,SDK会缓存当前登录方式,下一次在启用缓存的前提下使用登录窗口登录,会自动使用上一次登录方式登录,不再弹出登录窗口。清除掉缓存后,可以重新弹出登录窗口,清除缓存调用以下接口:
1 2 |
WAUserProxy.clearLoginCache(); |
如果CP有自己的登录窗口,可以使用以下登录接口:
1 2 |
WAUserProxy.login(Activity activity, String platform,WACallback<WALoginResult> callback, String extra) |
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用接口的Activity | |
platform | String | Y | 登录账户的平台类型 | 在WAConstants类中定义,详情请看5.1.2 平台取值 |
callback | WACallback<WAloginResult> | N | 回调,用来返回登录结果 | 2.4.3 处理登录结果 |
extra | String | N | 额外信息 | Facebook自定义权限登录、应用内登录等高级登录设置请参考3.3 登录高级设置相关章节 |
登录结果通过传入的回调返回,数据封装在WALoginResult类中。
WALoginResult字段说明
字段名 | 类型 | 说明 | 备注 |
---|---|---|---|
code | int | 登录结果码 | 5.1.1 状态码说明 |
message | String | 登录结果消息 | |
userId | String | WINGSDK用户id | |
token | String | WINGSDK用户token | |
platformUserId | String | 平台用户id | |
platformToken | String | 平台用户token | |
platform | String | 平台类型 | 当前登录的平台名称 |
isGuestAccount | int | 是否游客登录 | 0 不是游客账号 1是游客账号 |
退出游戏的时候,必须执行登出操作。用户登出调用以下接口:
1 2 |
WAUserProxy.logout() |
注意:调用logout接口后,serverId、gameUseId、level字段值会被重置,如果需要保持相应字段的值不重置,需要重新设置相应字段的值,参考3.1 公共参数设置
WINGSDK支付流程如下:
初始化支付,SDK会对所有已经支持的支付平台做初始化,初始化调用接口
1 2 |
WAPayProxy.initialize(Context context, WACallback<WAResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | Context | Y | Context对象 | |
callback | WACallback<WAResult> | N | 回调方法,返回初始化结果 | 初始化成功才能使用支付 |
支付的初始化在调用Activity的onCreate中初始化。
通过查询库存商品列表,可以获取所有可以购买的库存商品,查询库存调用接口
1 2 |
WAPayProxy.queryInventory(WACallback<WASkuResult> callback) |
注意:这里返回的库存商品信息是WINGSDK平台的商品信息,并非第三方平台的商品信息。建议在游戏商品页出来之前调用,最好是支付初始化完后就开始调用一次,可以参考下方代码示例进行调用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
WAPayProxy.initialize(this, new WACallback<WAResult>() { @Override public void onSuccess(int code, String message, WAResult result) { WAPayProxy.queryInventory(null); } @Override public void onCancel() { } @Override public void onError(int code, String message, WAResult result, Throwable throwable) { } }); |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
callback | WACallback<WASkuResult> | N | 回调方法,结果返回 |
WASkuDetails实体类说明:
get方法名 | 返回值类型 | 不为空 | 说明 | 备注 |
---|---|---|---|---|
getSku() | String | Y | 库存商品id | |
getTitle() | String | N | 商品名称 | |
getDescription() | String | N | 商品描述 | |
getVirtualCoinAmount() | long | Y | 虚拟货币数 |
购买指定商品,调用以下接口发起支付:
1 2 |
WAPayProxy.payUI(Activity activity, String waProductId, String extInfo, WACallback<WAPurchaseResult> callback) |
调用支付接口支付将会出现两种情况:
1)直接弹出google购买窗口(如果该商品有且只有google支付渠道);
2)弹出支付渠道选择窗口(如果有除google之外的渠道),选择支付方式后进行支付。
注意:如果需要在订单信息中记录当前玩家昵称,需要按3.1.4 设置玩家昵称设置玩家昵称。
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用Activity | |
waProductId | String | Y | WINGSDK 商品的id | 必须WINGSDK 平台的商品id |
extInfo | String | N | 额外信息,该信息会在支付成功后原样通知到CP服务器,CP用于检验 | CP 扩展信息字段,限长512(JSON格式),WING服务器到CP服务器发货通知时原样返回给CP。如果CP的通知发货地址是动态变化的(比如每个服务区的地址都不一致),可以通过此字段设置:参数格式为标准JSON,参数名为 deliverUrl,参考格式 { “deliverUrl”:” http://game.com/deliver.do”, “otherInfo”:”otherInfo”, “merId”:”” } merId字段(选填),收款商户ID,使用场景:同一个支付渠道下有多个不同的收款验证信息(或收款帐号)。如果是 APPLE支付渠道,merId使用客户端bundleId |
callback | WACallback< WAPurchaseResult > | N | 回调方法,结果返回 |
注意:如果需要横竖屏适配,请在AndroidMainifest.xml中对弹出购买窗口的Activity声明中添加如下语句:
1 2 |
android:configChanges="keyboardHidden|screenSize|orientation" |
WAPurchaseResult实体类说明:
Get方法名 | 返回值类型 | 不为空 | 说明 | 备注 |
---|---|---|---|---|
getPlatform() | String | Y | 支付平台 | |
getWAProductId() | String | Y | WINGSDK商品id | |
getExtInfo() | String | N | 额外数据 | 支付的时候CP传入的 |
getOrderId() | String | N | WINGSDK订单号 | 部分支付方式没有 |
getPlatformOrderId() | String | N | 第三方平台订单号 | 部分支付方式没有 |
getSku() | String | N | 第三方平台商品id | |
getPriceCurrencyCode() | String | N | 本地货币类型 | |
getPriceAmountMicros() | long | N | 本地货币数量 | 微分,1元=1000000 |
getDefaultCurrency() | String | N | 基准货币类型 | |
getDefaultAmountMicro() | long | N | 基准货币数量 | 微分,1元=1000000 |
getVirtualCurrency() | String | N | 虚拟货币类型 | |
getVirtualCoinAmount() | long | Y | 虚拟货币数量 |
通过以下接口可以获取支付服务是否可用,返回boolean类型结果,true为可用,false为不可用,只要有一个支付渠道可用即为true。
1 2 |
WAPayProxy.isPayServiceAvailable(Context context) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | Context | Y | 上下文 |
通过查询商品信息,可以获取库存商品的本地价格,查询商品本地价格调用接口
1 2 |
WAPayProxy.queryChannelProduct(String channel,WACallback<Map<String,WAChannelProduct>> callback) |
注意:这个接口需要在查询库存商品(WAPayProxy.queryInventory)成功回调后使用。
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
channel | String | Y | WAConstants类中定义的渠道类型,比如谷歌渠道传WAConstants.CHANNEL_GOOGLE | |
callback | WACallback<Map<String,WAChannelProduct>> | Y | 回调方法,结果返回,如果未获取到谷歌商品本地化价格信息,Map返回空集合 | Map中的键是库存商品id(sku) |
WAChannelProduct实体类说明:
Get方法名 | 返回值类型 | 不为空 | 说明 | 备注 |
---|---|---|---|---|
getChannel() | String | Y | 渠道类型 | |
getSku() | String | Y | 库存商品id | |
getPriceCurrencyCode() | String | Y | 本地货币类型 | 比如美元返回USD |
getPrice() | String | Y | 本地货币类型换算的价格(格式化) | 比如美元返回US$1.17 |
getPriceAmount() | Double | Y | 本地货币价格(数值类型) |
使用WINGSDK数据收集接口配合大数据平台,可以轻松统计玩家习惯以及充值等行为,为游戏的市场营销提供数据依据。WINGSDK数据收集使用在游戏的过程中打点的方式,如图所示:
1. 以上流程图中涉及到的几个接口是有时序要求的,请参考流程图中的逻辑步骤进行设置:setServerId、setGameUserId、setLevel、setNickname、ghw_user_import事件、ghw_user_create事件
2. 其它的事件如ghw_level_achieved、ghw_self_tutorial_completed、ghw_self_lv_x等请根据对应业务逻辑,在对应业务发生时调用接口发送
序号 | 事件(接口)名称 | 事件描述 | 事件作用 | 建议触发点 | 备注 |
---|---|---|---|---|---|
1 | setServerId | 设置服务器ID | 标记玩家当前所在的服务器,后台根据该字段统计每个服务器的数据 | 登录游戏服成功后 | |
2 | setGameUserId | 设置玩家角色ID | 标记玩家当前的游戏角色ID,后台根据该字段统计玩家的数据 | 登录游戏服成功后 | |
3 | setNickname | 设置玩家角色昵称 | 标记玩家当前的游戏角色昵称,后台订单记录中会记录该昵称 | 登录游戏服成功后 | |
4 | setLevel | 设置玩家当前等级 | 标记玩家当前的游戏角色等级 | 玩家等级发生变更后,如登录游戏服成功后、玩家完成升级后 | |
5 | ghw_user_import | 玩家登录游戏服 | 记录玩家登录游戏服的动作,后台根据该事件统计导入数、登录数、导入留存等数据 | 玩家登录游戏服成功后 | 需要先调用setServerId、setGameUserId接口 |
6 | ghw_user_create | 玩家创建角色 | 记录玩家创建角色的动作,后台根据该事件统计创角数 | 玩家创建角色成功后 | 需要先调用setServerId、setGameUserId、setLevel接口 |
7 | ghw_self_tutorial_completed | 完成新手任务 | 标记玩家完成新手任务 | ||
8 | ghw_level_achieved | 更新玩家等级 | 更新玩家等级,后台根据此字段更新玩家等级 | 玩家达到新的等级时 | 需要先调用setLevel接口更新玩家等级 |
9 | ghw_self_lv_x | 更新玩家关键等级 | 更新玩家关键等级,如ghw_self_lv_3、ghw_self_lv_5 | 玩家达到关键等级时 | |
10 | ghw_user_info_update | 更新用户信息 | 更新用户信 | 玩家信息更新时 | 需要先调用setServerId、setGameUserId、setNickname接口 |
使用WAEvent.Builder构建一个WAEvent类对象,并设置数据收集的相关参数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Map<String, Object> afEventValues = new HashMap<>(); afEventValues.put(WAEventParameterName.ITEM_NAM, "GG"); afEventValues.put(WAEventParameterName.ITEM_AMOUNT, 20); afEventValues.put(WAEventParameterName.PRICE, 50); afEventValues.put(WAEventParameterName.LEVEL, 120); WAEvent event = new WAEvent.Builder() .setDefaultEventName(WAEventType.COMPLETE_PURCHASE) .setChannelEventName(WAConstants.CHANNEL_APPSFLYE, "af_purchase_custom") .setChannelEventName(WAConstants.CHANNEL_FACEBOOK, "fb_purchase_custom") .setChannelEventName(WAConstants.CHANNEL_HUAWEI_HMS,"hw_purchase_custom") .setDefaultValue(50) .addDefaultEventValue(WAEventParameterName.ITEM_NAM, "GG") .addDefaultEventValue(WAEventParameterName.ITEM_AMOUNT, 50) .addDefaultEventValue(WAEventParameterName.PRICE, 50) .addDefaultEventValue(WAEventParameterName.LEVEL, 120) .setChannelEventValues(WAConstants.CHANNEL_APPSFLYER, afEventValues) .disableChannel(WAConstants.CHANNEL_APPSFLYER) .build(); |
调用第一步创建WAEvent对象的trackEvent(Context)方法发送数据
1 2 |
event.track(this); |
或者调用以下接口发送:
1 2 |
WATrackProxy.trackEvent(Context context, WAEvent event) |
1 2 |
public Builder setDefaultEventName(String eventName) |
参数:
eventName事件名称
1 2 |
public Builder setChannelEventName(String eventChannel, String eventName) |
参数:
eventChannel 渠道名称
eventName 事件名称
注意:
1)AppsFlyer预定义的事件名称和WINGSDK预定义的事件名称已经做了映射(例如: ghw_login <-> af_login),用户无需再手动自定义。
2)如果不进行设置,所有的渠道将采用设置的默认值。
1 2 |
public Builder setDefaultValue(float value) |
参数:
value 累加统计的数值
1 2 |
public Builder setChannelValue(String eventChannel, float value) |
参数:
eventChannel 渠道名称
value 累加统计的数值
注意:
1)如果不进行设置,所有的渠道将采用设置的默认值。
1 2 |
public Builder setDefaultEventValues(Map<String, Object> eventValues) |
参数:
eventValues 参数/值Map
1 2 |
public Builder addDefaultEventValue(String paramName, Object paramValue) |
参数:
paramName 参数名称
paramValue 参数值
1 2 |
public Builder setChannelEventValues(String eventChannel, Map<String, Object> eventValues) |
参数:
eventChannel 渠道名称
eventValues参数/值Map
注意:
1)AppsFlyer预定义的参数名称和WINGSDK预定义的参数名称已经做了映射,用户无需再手动自定义。
2)如果不进行设置,所有的渠道将采用设置的默认值。
1 2 |
public Builder addChannelEventValue(String eventChannel,String paramName, Object paramValue) |
参数:
eventChannel 渠道名称
paramName 参数名
paramValue 参数值
注意:
1)AppsFlyer预定义的参数名称和WINGSDK预定义的参数名称已经做了映射,用户无需再手动自定义。
2)如果不进行设置,所有的渠道将采用设置的默认值。
1 2 |
public Builder disableChannel(String eventChannel) |
参数:
eventChannel 渠道名称
注意:
1)默认情况下是所有启用的渠道都发送
2)该接口只是针对当前事件禁用发送到某个渠道
3)完全启用/关闭某个渠道数据收集,请参考四、第三方配置相关章节
建议参数属性:(参数对应的静态变量名请看5.2.2 SDK预定义参数名)
说明:导入用户事件,玩家每次进服时调用–通过用户id在后台查找
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
isFirstEnter | int | 是否第一次进服 | Y | 0→否; 1→是; 默认为0 |
注意:发送ghw_user_import事件前需调用设置服务器ID接口更新服务器id、设置gameUserId接口更新服务器id
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* ghw_user_import 导入用户事件 事件描述 : 玩家登录游戏服 事件作用 : 记录玩家登录游戏服的动作,后台根据该事件统计导入数、登录数、导入留存等数据 建议触发点 : 玩家登录游戏服成功后 调用前提 : 需要先调用setServerId、setGameUserId接口 必填字段 : isFirstEnter 类型int 是否第一次进服 0→否 1→是; 默认为0 */ // 调用前,需要先设置setServerId、setGameUserId WACoreProxy.setServerId(服务器id); //设置用户选择的服务器id WACoreProxy.setGameUserId(游戏的用户id);// 设置游戏的用户id WAEvent event = new WAEvent.Builder() .setDefaultEventName(WAEventType.IMPORT_USER) //必填字段 .addDefaultEventValue(WAEventParameterName.IS_FIRST_ENTER, 0) //是否第一次进服 0→否 1→是; 默认为0 .build(); WATrackProxy.trackEvent(MainActivity.this, event); |
说明:点击购买的时候调用(用于游戏内部虚拟交易统计)。
无参数
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* ghw_initiated_purchase 点击购买 事件描述 : 点击购买(虚拟货币) 事件作用 : 用于游戏内部虚拟交易统计 建议触发点 : 点击购买的时候调用 调用前提 : 无 必填字段 : 无 */ WAEvent event = new WAEvent.Builder() .setDefaultEventName(WAEventType.INITIATED_PURCHASE) .build(); WATrackProxy.trackEvent(MainActivity.this, event); |
说明:购买完成的时候调用(用于游戏内部虚拟交易统计)。
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
itemName | String | 游戏内虚拟物品的名称/ID | Y | |
itemAmount | int | 交易的数量 | Y | |
price | float | 交易的总价 | Y |
代码示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* ghw_purchase 购买完成 事件描述 : 购买完成(虚拟货币) 事件作用 : 用于游戏内部虚拟交易统计 建议触发点 : 购买完成的时候调用 调用前提 : 无 必填字段 : itemName String 游戏内虚拟物品的名称/ID itemAmount int 交易的数量 price float 交易的总价 */ WAEvent event = new WAEvent.Builder() .setDefaultEventName(WAEventType.COMPLETE_PURCHASE) //必选字段 .addDefaultEventValue(WAEventParameterName.ITEM_NAME, "GGGGG") .addDefaultEventValue(WAEventParameterName.ITEM_AMOUNT, 1) .addDefaultEventValue(WAEventParameterName.PRICE, 50) .build(); WATrackProxy.trackEvent(MainActivity.this, event); |
说明:统计玩家等级增长事件,达到等级时调用。
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
score | int | 账户分数 | N | |
fighting | int | 战斗力 | N |
注意:发送ghw_level_achieved事件前需调用3.1.3 设置用户等级level接口更新用户等级信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* ghw_level_achieved 更新玩家等级 事件描述 : 更新玩家等级 事件作用 : 更新玩家等级,后台根据此字段更新玩家等级 建议触发点 : 玩家达到新的等级时 调用前提 : 需要先调用setLevel接口更新玩家等级 必填字段 : 可选字段 : score int 账户分数 fighting int 战斗力 */ WACoreProxy.setLevel(3);// 设置用户等级 WAEvent event = new WAEvent.Builder() .setDefaultEventName(WAEventType.LEVEL_ACHIEVED) //可选字段 // .addDefaultEventValue(WAEventParameterName.SCORE, 3241234) // .addDefaultEventValue(WAEventParameterName.FIGHTING, 10) .build(); WATrackProxy.trackEvent(MainActivity.this, event); |
说明:创建游戏角色,游戏角色创建时调用
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
roleType | String | 角色类型 | N | |
nickname | String | 角色名(昵称) | Y | |
gender | int | 角色性别 | N | 0 女 1 男 2 未知 |
registerTime | long | 创建时间 | Y | 注册时间戳,单位为毫秒(1970以后) |
vip | int | 等级 | N | |
bindGameGold | int | 绑定钻石 | N | |
gameGold | int | 用户钻石数 | N | |
fighting | int | 战斗力 | N | |
status | int | 状态 | N | 状态标识 -1: 锁定, 1:未锁定 |
注意:发送ghw_user_create事件前需调用setGameUserId、setLevel、setServerId接口
参考示例:
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 28 29 30 31 32 33 34 35 |
/* ghw_user_create 创角事件 事件描述 : 玩家创建角色 事件作用 : 记录玩家创建角色的动作,后台根据该事件统计创角数 建议触发点 : 玩家创建角色成功后 调用前提 : 需要先调用setServerId、setGameUserId、setLevel接口 必填字段 : nickname 昵称 registerTime 注册时间戳 单位为毫秒(1970以后) 可选字段 : roleType、gender、vip、bindGameGold、gameGold、fighting、status 具体参考博客 */ // 调用前,需要先设置setServerId、setGameUserId、setLevel WACoreProxy.setServerId(服务器id); //设置用户选择的服务器id WACoreProxy.setGameUserId(游戏的用户id);// 设置游戏的用户id WACoreProxy.setLevel(1); // 设置用户等级 WAEvent event = new WAEvent.Builder() .setDefaultEventName(WAEventType.USER_CREATED) //必填字段 .addDefaultEventValue(WAEventParameterName.NICKNAME, "总裁女友1222") //昵称 .addDefaultEventValue(WAEventParameterName.REGISTER_TIME, System.currentTimeMillis())// 注册时间戳,单位为毫秒(1970以后) //可选 // .addDefaultEventValue(WAEventParameterName.ROLE_TYPE, 1) // .addDefaultEventValue(WAEventParameterName.GENDER, 1) // .addDefaultEventValue(WAEventParameterName.VIP, 1) // .addDefaultEventValue(WAEventParameterName.BINDED_GAME_GOLD, 10000) // .addDefaultEventValue(WAEventParameterName.GAME_GOLD, 100) // .addDefaultEventValue(WAEventParameterName.FIGHTING, 1230020) // .addDefaultEventValue(WAEventParameterName.STATUS, 1) .build(); WATrackProxy.trackEvent(MainActivity.this, event); |
说明:新手完成新手任务时调用
无参数
参考示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
/* ghw_self_tutorial_completed 完成新手任务 事件描述 : 完成新手任务 事件作用 : 统计 建议触发点 : 新手完成新手任务时调用 调用前提 : 无 必填字段 : 无 */ WAEvent event = new WAEvent.Builder() .setDefaultEventName("tutorial_completed") .build(); WATrackProxy.trackEvent(MainActivity.this, event); |
说明:完成关键等级时调用,如ghw_self_lv_1、ghw_self_lv_3
参考示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* ghw_self_lv_x 关键等级 事件描述 : 关键等级 事件作用 : 统计 建议触发点 : 到达关键等级时 调用前提 : 无 必填字段 : 无 */ int level = 10; WAEvent event = new WAEvent.Builder() .setDefaultEventName("lv_"+level) .build(); WATrackProxy.trackEvent(MainActivity.this, event); |
无参数
参数名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
roleType | String | 角色类型 | N | |
nickname | String | 昵称 | Y | 无昵称时,可填写空字符串 |
vip | int | 等级 | N | |
status | int | 状态 | N | 状态标识,-1:锁定,1:未锁定 |
代码示例:
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 28 29 30 31 32 |
/* ghw_user_info_update 更新用户信息 事件描述 : 更新用户信息 事件作用 : 更新用户信 建议触发点 : 玩家信息更新时 调用前提 : 需要先调用setServerId、setGameUserId、setNickname接口 必填字段 : nickname String 昵称 可选字段 : roleType String 角色类型 vip int 等级 status int 状态 状态标识,-1:锁定,1:未锁定 */ WACoreProxy.setServerId(服务器id); //设置用户选择的服务器id WACoreProxy.setGameUserId(游戏的用户id);// 设置游戏的用户id WACoreProxy.setNickname(用户昵称); // 设置昵称 WAEvent event = new WAEvent.Builder() .setDefaultEventName(WAEventType.USER_INFO_UPDATE) //必选字段 .addDefaultEventValue(WAEventParameterName.NICKNAME, "总裁女友") //可选字段 // .addDefaultEventValue(WAEventParameterName.ROLE_TYPE, 1) // .addDefaultEventValue(WAEventParameterName.STATUS, 1) // .addDefaultEventValue(WAEventParameterName.VIP, 1) .build(); WATrackProxy.trackEvent(MainActivity.this, event); |
说明:支持自定义事件的统计
例如:
1 2 3 4 5 6 7 |
WAEvent event = new WAEvent.Builder() .setDefaultEventName(“custom_event_name”) .setDefaultValue(50) .build(); event.track(context); |
如果CP对接的登录方式是接口登录方式,则可以使用以下几个接口来实现隐私政策流程,具体流程可参考下图。
WINGSDK有自己的隐私政策,调用以下接口获取到隐私政策url(隐私政策内容为html页面):
1 2 |
WACoreProxy.getPrivacyUrl(Context context); |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | context | Y | 上下文 |
返回值说明:
类型 | 必填 | 说明 | 备注 |
---|---|---|---|
String | Y | 隐私政策html页面对应的url |
隐私政策更新需要重新显示时可以调用以下接口获取最新隐私政策更新时间,和上一次保存的时间戳作对比,从而确定是否需要展示:
1 2 |
WACoreProxy.getPrivacyUpdateTime(Context context); |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | context | Y | 上下文 |
返回值说明:
类型 | 必填 | 说明 | 备注 |
---|---|---|---|
String | Y | 最新隐私政策更新的时间戳 |
当需要显示隐私政策详情时,可以调用以下接口显示出隐私政策详情界面:
1 2 |
WACoreProxy.showPrivacyUI(Context context, WACallback<WAResult> callback); |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | context | Y | 上下文 | |
callback | WACallback |
N | 回调方法,窗口关闭时可以在onCancel中得知结果 |
调用示例,当窗口关闭时会回调onCancel接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
WACoreProxy.showPrivacyUI(this, new WACallback<WAResult>() { @Override public void onSuccess(int code, String message, WAResult result) {} @Override public void onCancel() { showLongToast("关闭窗口"); } @Override public void onError(int code, String message, WAResult result, Throwable throwable) { } }); |
打包apk混淆代码配置中增加以下配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-keepattributes SourceFile,LineNumberTable # WingA -dontwarn com.google.** -dontwarn android.support.** -dontwarn com.squareup.** -keep class com.wa.sdk.** { *; } -keep class android.support.** { *; } -keep class com.squareup.** { *; } -keep class * extends android.app.Activity { *; } -keep class * extends android.content.BroadcastReceiver { *; } -keep class **.R$* { *; } # glide -keep class com.bumptech.glide.** {*;} |
WINGSDK包括serverId等公共参数,这些参数主要用于数据跟踪和统计。
公共参数必须严格按照文档进行设置,在后续的接口中会使用到这些公共的参数,没有按照要求配置会导致部分接口调用失败。
当用户的服务器ID发生改变时,需要调用设置服务器ID接口设置新的服务器ID,例如每次进入服务器
1 2 |
WACoreProxy.setServerId(String serverId) |
注意:设置服务器id的操作在每次选服后都需要进行,必须在调用其他接口前设置。
当gameUserId发生改变时,需要调用设置gameUserId接口设置新的gameUserId,例如成功登录账号后、切换账号成功后
1 2 |
WACoreProxy.setGameUserId(String gameUserId) |
注意:必须在调用其他接口前设置。
当用户角色等级发生改变时,需要调用设置等级接口设置新的等级,例如开始进入游戏、等级提升等。
1 2 |
WACoreProxy.setLevel(int level) |
注意:第一次进服获取玩家等级或玩家等级变更后,需要及时调用这个接口设置玩家等级,必须在调用其他接口前设置。
设置游戏玩家的昵称,调用接口:
1 2 |
WACoreProxy.setNickname(String nickname); |
注意:
1.当玩家登录、登出游戏,或修改昵称时,需要及时调用这个接口设置玩家昵称。
2.调用该接口设置昵称后,玩家进行购买时会自动记录昵称到订单信息中。
SDK默认是关闭调试模式的,开启调试模式可以在IDE的Logcat中查看到程序的Log信息,方便调试和测试。开启/关闭调试模式调用以下接口。
1 2 |
WACoreProxy.setDebugMode(true); |
说明:调用此接口后即可显示Log悬浮窗按钮,不用再另外调用enableLogcat接口,同时如果需要,也可以调用disableLogcat接口隐藏Log按钮。
SDK提供了调试信息显示的Logcat工具,使用这个工具测试人员不需要IDE环境就可以查看调试信息,工具可以看到应用的调试Log信息(不包含系统打印)。使用前必须确保手机的安全软件没有拦截该程序的悬浮窗口权限,使用调用以下接口:
1 2 |
WACommonProxy.enableLogcat(Activity activity) |
说明:如果已经开启了调试模式,不需要调用该接口就可以显示Logcat入口悬浮窗。
1 2 |
WACommonProxy. disableLogcat(Activity activity) |
通过以下接口,开发者可以向Logcat工具中增加一条开发日志,日志会在Logcat工具的Log标签中显示。
1 2 |
WACommonProxy.log(String tag, String msg) |
打开调试模式后,显示Logcat工具,点击-设备信息-clientid,点击获取
使用该接口需注意以下两点:
1)一般来说,如果应用登录的时候有登录方式选择界面,就不需要使用此接口,此接口默认是这种方式(取值为1)。
2)这个接口主要是用来满足以下需求:用户第一次登录是以游客方式进行登录,进到应用里面可以切换其它登录方式,下次登录会直接以切换后的账户进行登录(取值为2)。
1 2 |
WAUserProxy.setLoginFlowType(int flowType) |
登录流程有两种模式,在WAConstants类中定义,取值如下表:
名称 | 取值 | 备注 |
---|---|---|
LOGIN_FLOW_TYPE_DEFAULT | 1 | 适用于有登录界面的场景,登录的时候不会重新绑定设备 |
LOGIN_FLOW_TYPE_REBIND | 2 | 适用于无登录界面的场景,登录时重新将新账号与当前设备绑定,如在游戏中切换账户,切换以后的匿名登录是以切换后的账户进行登录。 |
SDK平台应用内登录,是指CP本身有自己登录系统,先登录CP后台拿到用户信息后登录SDK后台,应用内登录调用接口2.4.2 使用接口登录,登录平台取值WINGA(CHANNEL_WA),需要将CP后台返回的用户信息按照规定格式(JSON字符串)通过extInfo字段传入。
应用内登录extInfo格式(标准JSON格式字符串)
1 2 3 4 5 6 7 |
{ "appSelfLogin": true, "puserId": "12345", "accessToken": "o1akkfjia81FMvFSO8kxC96TgQYlheEr", "extInfo": "extInfo String" } |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 |
JSONObject extObject = new JSONObject(); try { extObject.putOpt("appSelfLogin", true); extObject.putOpt("puserId", "12345"); extObject.putOpt("accessToken", "o1akkfjia81FMvFSO8kxC96TgQYlhEEr"); extObject.putOpt("extInfo", "extInfo String"); } catch (JSONException e) { e.printStackTrace(); } showLoadingDialog("应用内登录", null); WAUserProxy.login(this, WAConstants.CHANNEL_WA, mLoginCallback, extObject.toString()); |
字段说明:
字段名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
appSelfLogin | boolean | 应用内登录固定值true | Y | |
puserId | String | CP用户id | Y | |
accessToken | String | CP用户Token | Y | |
extInfo | String | 额外信息 | N | CP 扩展信息字段,限长512,WING服务器到CP服务器验证登录时原样返回给CP。CP可以添加任意自定义的字段(JSON格式),用于检验登录或扩展其它功能,不超过长度限制即可。 |
Facebook平台登录默认权限是public_profile,如果需要自定义登录获取的权限,可以调用接口2.4.2 使用接口登录,将需要获取的权限声明按照规定格式(JSON字符串)通过extra字段传入。
Facebook自定义权限登录extra格式(标准JSON格式字符串)
1 2 3 4 5 6 7 8 |
{ "permissionType": "read", "permissions": [ "public_profile", "user_friends" ] } |
字段说明:
字段名 | 类型 | 说明 | 必填 | 备注 |
---|---|---|---|---|
permissionType | String | 权限类型 | Y | read 或write,登录类型只能选一种 |
permissions | JSONArray | 权限列表 | Y | 列表中的权限类型必须跟权限类型声明的类型一致且都是同一类型,否则会登录失败。4.2.3 Facebook登录权限对照表 |
SDK内置了账户管理界面,在这个界面可以对账户进行管理操作,包括账号绑定、解绑、切换账户、新建账户。
1 2 |
WAUserProxy.openAccountManager(Activity activity, WAAccountCallback callback) |
注意:使用内置账户管理界面之前必须先登录
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | Activity对象 | |
callback | WAAccountCallback | N | 回调 | onLoginAccountChanged(WALoginResult currentAccount)回调方法,在新建账号、账号切换时会回调这个方法,返回当前登录的账号信息. onBoundAccountChanged(boolean binding, WABindResult result)回调方法,在绑定账户信息发生变更时会回调这个方法,每次变更都调用一次,CP可根据需要实现相应功能。 |
onBoundAccountChang方法参数说明:
参数名 | 类型 | 取值 | 备注 |
---|---|---|---|
binding | boolean | true或false | true说明本次回调是账号绑定操作,false说明本次回调是账号解绑操作 |
WABindResult | WABindResult | WABindResult | 绑定或解绑结果,具体包含属性参考下方WABindResult字段说明 |
WABindResult方法参数说明:
参数名 | 类型 | 取值 | 备注 |
---|---|---|---|
code | int | 状态码 | 200为成功,其他为错误码 |
message | String | 状态消息 | |
platform | String | 平台 | 在WAConstants类中定义,详情请看5.1.2 平台取值 |
accessToken | String | 平台token | |
platformUserId | String | 平台user id |
绑定第三方平台账户,不但可以使用第三方平台账户登录,而且可以防止账户信息丢失,调用以下接口绑定平台账户
1 2 |
WAUserProxy.bindingAccount(Activity activity, String platform, String extInfo,WABindCallback callback) |
参数说明
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用接口的Activity | |
platform | String | Y | 绑定第三方平台账号的平台类型 | 取值参考5.1.2 平台取值 |
extInfo | String | N | 额外信息 | 预留字段 |
callback | WABindCallback | N | 回调,用来返回绑定结果 |
查询当前的账户已经绑定的第三方平台账户列表,调用接口
1 2 |
WAUserProxy.queryBoundAccount(WACallback<WAAccountResult> callback) |
WAAccountResult字段说明
字段名 | 类型 | 说明 | 备注 |
---|---|---|---|
code | int | 结果码 | 5.1.1 状态码说明 |
message | String | 结果消息 | |
accounts | List<WAAccount> | ||
platform | String | 绑定的平台类型 | 取值参考5.1.2 平台取值 |
platformUserId | String | 平台用户id |
WAAccount字段说明
字段名 | 类型 | 说明 | 备注 |
---|---|---|---|
platform | String | 绑定的平台类型 | 取值参考5.1.2 平台取值 |
platformUserId | String | 平台用户id |
解绑已经绑定的第三方平台账户,调用接口
1 2 |
WAUserProxy.unBindAccount(String platform, String platformUserId, WACallback<WAResult> callback) |
注意:有以下情况之一者,不可解绑
1.解绑的账户为SDK平台的;
2.用户没有绑定第三方平台账户的;
3.用户只绑定一个第三方平台账户,且用户没有与当前设备绑定的
切换账户可以一键切换登录账户,调用接口
1 2 |
WAUserProxy.switchAccount(Activity activity, String platform, final WACallback<WALoginResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | ||
platform | String | Y | 需要切换的账号类型 | 取值参考5.1.2 平台取值 |
callback | WACallback<WALoginResult> | N | 回调 | 用来返回结果 |
新建账户可以新建一个全新的玩家账户。
1 2 |
WAUserProxy.createNewAccount(WACallback<WALoginResult> callback) |
注意:新建账户后,新的账户会跟当前设备绑定,如果之前的账户没有绑定第三方平台账户,数据将会丢失。
获取账户信息接口可以获取指定平台的账户信息,调用接口
1 2 |
WAUserProxy.getAccountInfo(String platform, WACallback<WAUser> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
platform | String | Y | 平台名称 | 取值参考5.1.2 平台取值 |
callback | WACallback<WAUser> | N | 回调 | 结果中包含平台用户的id,名称,头像等信息 |
分享内容到社交平台,支持分享链接、图片、视频,调用接口
1 2 |
WASocialProxy.share(Activity activity, String platform, WAShareContent shareContent boolean shareWithAPI, String extInfo, WACallback<WAShareResult> callback) |
参数说明
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用的Activity | |
platform | String | Y | 分享的平台 | 分享到哪个平台 |
shareContent | WAShareContent | Y | 分享内容 | |
shareWithAPI | boolean | Y | 是否通过API分享 | 如果所选平台支持API分享,设置为true时直接通过API层分享,没有界面。注意:目前不支持这种方式,相关权限已被facebook收回,此值只能为false |
extInfo | String | N | 额外信息 | 预留字段 |
callback | WACallback<WAResult> | N | 回调方法,结果返回 |
分享链接shareContent参数传入WAShareLinkContent类型实体类对象。
WAShareLinkContent字段说明
字段名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
contentUri | Uri | Y | 链接 | |
peopleIds | List<String> | N | 分享好友ID | |
placeId | String | N | 地址id | |
ref | String | N | 添加到引用链接中的参数值 | |
contentTitle | String | N | 连接标题 | |
contentDescription | String | N | 链接描述 | |
imageUri | Uri | N | 配图 |
示例
1 2 3 4 5 6 7 8 9 |
WAShareLinkContent shareLinkContent = new WAShareLinkContent.Builder() .setContentTitle("Test share") // 分享标题 .setContentDescription("Test Ghw share with facebook") // 分享文本内容 .setImageUri(Uri.parse("http://assets.bmob.cn/images/2014-data-service-icon.png")) // 缩略图地址 .setContentUri(Uri.parse("http://www.bmob.cn/")) // 分享的链接 .build(); WASocialProxy.share(this, WAConstants.CHANNEL_FACEBOOK, shareLinkContent, mShareWithApi, null, mShareCallback); |
分享图片shareContent参数传入WASharePhotoContent类型实体类对象。
WASharePhotoContent字段说明
字段名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
contentUri | Uri | N | 内容Uri | |
peopleIds | List<String> | N | 分享好友ID | |
placeId | String | N | 地址id | |
ref | String | N | 添加到引用链接中的参数值 | |
photos | List<WASharePhoto> | Y | 图片列表 | 不能超过12MB,而且列表不能为空,至少一张图片 |
WASharePhoto字段说明
字段名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
bitmap | Bitmap | Y | 图片Bitmap对象 | 和imageUri两个必选一个 |
imageUri | Uri | Y | 图片Uri | 和bitmap两个必选一个 |
userGenerated | String | N | 未使用 | |
caption | String | N | 图片描述 |
示例
1 2 3 4 5 6 7 8 9 10 |
WASharePhoto photo = new WASharePhoto.Builder() .setImageUri(uri) // 图片本地Uri .build(); // 构造分享图片对象 WASharePhotoContent sharePhotoContent = new WASharePhotoContent.Builder() .addPhoto(photo) .build(); WASocialProxy.share(FBShareActivity.this, WAConstants.CHANNEL_FACEBOOK, sharePhotoContent, mShareWithApi, null, mShareCallback); |
分享视频shareContent参数传入WAShareVideoContent类型实体类对象。
WAShareVideoContent字段说明
字段名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
contentUri | Uri | N | 内容Uri | |
peopleIds | List<String> | N | 分享好友ID | |
placeId | String | N | 地址id | |
ref | String | N | 添加到引用链接中的参数值 | |
contentDescription | String | N | 视频描述 | |
contentTitle | String | N | 视频标题 | |
previewPhoto | WASharePhoto | N | 视频缩略图 | |
video | WAShareVideo | Y | 视频 | 不能超过12MB |
WAShareVideo字段说明
字段名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
localUri | Uri | Y | 视频Uri |
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// 构建视频内容对象 WAShareVideo video = new WAShareVideo.Builder() .setLocalUri(uri) .build(); // 构建缩略图内容对象 WASharePhoto photo = new WASharePhoto.Builder() .setBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher)) .build(); // 构建分享视频对象 WAShareVideoContent shareVideoContent = new WAShareVideoContent.Builder() .setContentTitle("TestVideo") // 标题 .setContentDescription("Test share video to facebook") // 文本内容描述 .setVideo(video) // 视频内容 .setPreviewPhoto(photo) // 缩略图内容 .build(); WASocialProxy.share(FBShareActivity.this, WAConstants.CHANNEL_FACEBOOK, shareVideoContent, mShareWithApi, null, mShareCallback); |
向平台的好友发送请求,请求类型包括普通请求、游戏邀请,发送请求调用接口
1 2 |
WASocialProxy.sendRequest(Activity activity, String platform, String requestType, String title, String message, String objectId, List<String> receiptIds, WACallback<WARequestSendResult> callback, String extInfo) |
参数说明
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用Activity对象 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义5.1.2 平台取值 |
requestType | String | Y | 请求类型 | 请求类型默认的在WAConstants下有定义,请参考5.1.3 请求类型说明 |
title | String | Y | 标题 | 部分平台需要显示 |
message | String | Y | 说明文字 | 部分平台需要显示 |
objectId | String | N | 对象id | 部分请求类型必填 |
receiptIds | List<String> | Y | 接收者id | 根据平台而定,有些平台支持一次发送请求给多个用户,有些平台一次只能发送给一个用户。VK平台一次只能发送一个用户;Facebook平台发送邀请请求此字段传空。 |
callback | WACallback<WARequestSendResult> | N | 回调 | 结果返回 |
extInfo | String | N | 额外数据信息 | 扩展字段,根据各个平台需要定义 |
WARequestSendResult字段说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
requestId | String | Y | 平台生成的请求id | 部分平台会为空或只是网络请求id |
recipients | String | Y | 接收者id列表 | 返回一个或者多个 |
发送游戏邀请请求接口请参照章节3.5.2 发送请求
游戏邀请只能邀请没有玩过当前游戏的好友,称为可邀请好友,查询可邀请的好友调用以下接口:
1 2 |
WASocialProxy.queryInvitableFriends(Activity activity, String platform, long duration, WACallback<WAFriendsResult> callback) |
参数说明
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用的Activity | |
platform | String | Y | 平台名称 | 所查询的平台 |
duration | long | Y | 过滤时间间隔 | 当过滤时间间隔大于0时,在这个时间间隔内不会出现已经发出邀请的好友 |
callback | WACallback<WAFriendsResult> | N | 回调方法,结果返回 |
成功邀请好友后,调用以下接口向服务器记录邀请信息:
1 2 |
WASocialProxy.createInviteRecord(Context context, String platform, String requestId, Collection<String> recipients, WACallback<WAResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | Context | Y | 上下文 | |
platform | String | Y | 平台名称 | 发出邀请的平台 |
requestId | String | Y | 邀请请求id | 没有的渠道可以传空字符(如VK) |
recipients | Collection<String> | Y | 邀请成功好友的id列表 | |
callback | WACallback<WAResult> | N | 回调方法,结果返回 |
通过邀请安装使用的用户,安装后需要通知服务器对邀请人进行奖励,需要在游戏启动后登录并且选服后调用以下接口:
1 2 |
WASocialProxy.inviteInstallReward(Activity activity, String platform, WACallback<WAResult> callback) |
注意:这个接口必须在用户登录并且选服后调用。采用platform指定平台方式登录或者绑定platform指定的平台后,均可以调用该接口。
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用的Activity | |
platform | String | Y | 平台名称 | 邀请的平台 |
callback | WACallback<WAResult> | N | 回调方法,结果返回 |
通过邀请安装使用的用户,在触发定义的特定事件,需要通知服务器奖励邀请人,比如等级达成、充值等,调用以下接口
1 2 |
WASocialProxy.inviteEventReward(Activity activity, String platform, String eventName, WACallback<WAResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用的Activity | |
platform | String | Y | 平台名称 | 邀请的平台 |
eventName | String | Y | 事件名称 | 事件名称必须后台已经定义 |
callback | WACallback<WAResult> | N | 回调方法,结果返回 |
查询指定平台正在玩游戏的好友列表,调用以下接口:
1 2 |
WASocialProxy.queryFriends(Activity activity, String platform, WACallback<WAFriendsResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用的Activity | |
platform | String | Y | 平台名称 | 查询好友的平台 |
callback | WACallback<WAFriendsResult> | N | 回调方法,结果返回 |
登录Game Service调用接口:
1 2 |
WASocialProxy.signInGame(Activity activity, String platform, WACallback<WAPlayer> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用的Activity | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持Google平台 |
callback | WACallback<WAPlayer> | N | 回调方法,结果返回 | WAPlayer是平台返回的玩家 |
登出Game Service调用以下接口:
1 2 |
WASocialProxy.signOutGame (String platform) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
platform | String | Y | 要登出的平台 | 平台类型在WAConstants类中定义,目前支持Google平台 |
标准类型的成就是一次性解锁,解锁调用以下接口:
1 2 |
WASocialProxy.unlockAchievement(Context context, String platform, String id, WACallback<WAUpdateAchievementResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | Context | Y | Context上下文 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持Google平台 |
id | String | Y | 成就id | |
callback | WACallback<WAUpdateAchievementResult> | N | 回调方法,结果返回 |
分步类型成就是可以分步进行解锁的,进度增加会在原来的进度上完成递增,无需知道当前的进度,进度递增调用以下接口:
1 2 |
WASocialProxy.increaseAchievement(Context context, String platform, String id, int numSteps, WACallback<WAUpdateAchievementResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | Context | Y | Context上下文 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持Google平台 |
id | String | Y | 成就id | |
numSteps | int | Y | 递增的步数 | 0<numSteps<成就总分步数 |
callback | WACallback<WAUpdateAchievementResult> | N | 回调方法,结果返回 |
分步类型成就除了可以使用3.5.6.4 分步成就进度增加实现进度递增外,也可以使用以下接口直接设置进度:
1 2 |
WASocialProxy.increaseAchievement(Context context, String platform, String id, int numSteps, WACallback<WAUpdateAchievementResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | Context | Y | Context上下文 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持Google平台 |
id | String | Y | 成就id | |
numSteps | int | Y | 成就步数 | 当且仅当:已完成进度<numSteps<成就总分步数 是有效 |
callback | WACallback<WAUpdateAchievementResult> | N | 回调方法,结果返回 |
隐藏状态下的成就不能解锁,需要显示后才能解锁操作,显示隐藏的成就调用以下接口:
1 2 |
WASocialProxy.revealAchievement(Context context, String platform, String id,WACallback<WAUpdateAchievementResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | Context | Y | Context上下文 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持Google平台 |
id | String | Y | 成就id | |
callback | WACallback<WAUpdateAchievementResult> | N | 回调方法,结果返回 |
展示成就列表是打开自带的页面,调用以下接口:
1 2 |
WASocialProxy.displayAchievement(Activity activity, String platform, WACallback<WAResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | 调用Activity | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持Google平台 |
callback | WACallback<WAResult> | N | 回调 | 成就页面登出账号后,会在onError中得到一个code值为CODE_GAME_NEED_SIGN=-605的错误回调,在这里可以更新UI |
通过以下接口,可以加载所有成就的列表:
1 2 |
WASocialProxy.loadAchievements(Context context, String platform, boolean forceReload, WACallback<WALoadAchievementResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | Context | Y | Context上下文 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持Google平台 |
forceReload | boolean | Y | 是否强制重新加载 | |
callback | WACallback<WALoadAchievementResult> | N | 回调方法,结果返回 | 结果实体类WALoadAchievementResult中含有成就数据List对象,成就数据实体类为WAAchievement |
WAAchievement字段说明:
参数名 | 类型 | 说明 | 备注 |
---|---|---|---|
achievementId | String | 成就id | |
name | boolean | 成就名称 | |
type | int | 成就类型 | 类型取值为WAAchievement定义的静态变量,只能是 TYPE_STANDARD或 TYPE_INCREMENTAL |
state | int | 成就状态 | 状态取值为WAAchievement定义的静态变量,只能是STATE_UNLOCKED, STATE_REVEALED, 或 STATE_HIDDEN |
currentSteps | int | 当前进度 | 仅对分步成就有意义,即type取值为TYPE_INCREMENTAL时 |
description | String | 成就详细描述 | |
formattedCurrentSteps | String | 用户解锁成就已经完成的步数 | 格式化为当地语言的字符串 |
formattedTotalSteps | String | 解锁成就还需要完成的步数 | 格式化为当地语言的字符串 |
lastUpdatedTimestamp | long | 上一次更新时间 | |
player | WAPlayer | 玩家信息 | |
revealedImageUri | Uri | 隐藏图标 | |
totalSteps | int | 总步数 | 仅对分步成就有意义,即type取值为TYPE_INCREMENTAL时 |
unlockedImageUri | Uri | 未解锁图标 | |
xpValue | long | XP值 |
判断当前是否已经登录了Game Service,调用以下接口,接口返回boolean类型结果,true为已登录,false为未登录
1 2 |
WASocialProxy.isGameSingedIn(Context context, String platform) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
context | Context | Y | Context上下文 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持VK平台 |
通过Group id查询Group详情,调用以下接口
1 2 |
WASocialProxy.getGroupByGid(Activity activity, String platform, String [] gids, String extInfo, WACallback<WAGroupResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | Activity对象 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持VK平台 |
gids | String[] | Y | 需要查询的group id列表 | |
callback | WACallback<WAGroupResult> | N | 回调方法,结果返回 | 结果实体类WAGroupResult中含有Group数据Map对象,Group数据实体类为WAGroup |
WAGroup字段说明:
参数名 | 类型 | 说明 | 备注 |
---|---|---|---|
gid | String | group id | |
name | String | group名称 | |
screen_name | String | group screen_name | |
is_closed | int | 是否封闭 | 0 – 开放 1 – 封闭 2 – 私有 |
is_admin | int | 当前用户是否管理员 | 0 – 非管理员 1 – 管理员 |
admin_level | int | 管理员级别 | 1 – 主席 2 – 编辑 3 – 管理员 |
is_member | int | 当前用户是否该group成员 | 0 – 不是group的成员 1 – 是group的成员 |
type | String | 类型 | group — group, page — public page event — event |
photo | String | group图片 | |
photo_medium | String | group图片,中尺寸 | |
photo_big | String | group图片,大尺寸 | |
city | WAPlace | 城市 | |
country | WAPlace | 国家 | |
place | WAPlace | 地址 | |
description | String | group描述 | |
wiki_page | String | wiki地址 | |
members_count | int | 成员数 | |
can_post | int | 是否可以发布文章 | 0 – 不可以发布 1 – 可以发布 |
can_see_all_post | int | 是否可见所有文章 | 0 – 不可见 1 – 可见 |
activity | String | Activity | |
status | String | 状态 | |
contacts | String | 联系信息 | |
platform | String | 平台 |
一个应用只能关联一个Group,通过以下接口可以查询当前应用关联的Group详细信息:
1 2 |
WASocialProxy.getCurrentAppLinkedGroup(Activity activity, String platform, String extInfo, WACallback<WAGroupResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | Activity对象 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持VK平台 |
extInfo | String | N | 额外数据信息 | 扩展字段,根据各个平台需要定义 |
callback | WACallback<WAGroupResult> | N | 回调方法,结果返回 | 结果实体类WAGroupResult中含有Group数据Map对象,Group数据实体类为WAGroup |
查询当前用户加入的Group详细信息调用以下接口:
1 2 |
WASocialProxy.getCurrentUserGroup(Activity activity, String platform, String extInfo, WACallback<WAGroupResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | Activity对象 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持VK平台 |
extInfo | String | N | 额外数据信息 | 扩展字段,根据各个平台需要定义 |
callback | WACallback<WAGroupResult> | N | 回调方法,结果返回 | 结果实体类WAGroupResult中含有Group数据Map对象,Group数据实体类为WAGroup |
查询当前的用户是否为指定的某个Group的成员,调用以下接口:
1 2 |
WASocialProxy.isCurrentUserGroupMember(Activity activity, String platform, String groupId, String extInfo, WACallback<Boolean> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | Activity对象 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持VK平台 |
groupId | String | Y | Group id | |
extInfo | String | N | 额外数据信息 | 扩展字段,根据各个平台需要定义 |
callback | WACallback<WAGroupResult> | N | 回调方法,结果返回 | 结果实体类WAGroupResult中含有Group数据Map对象,Group数据实体类为WAGroup |
加入指定的某个Group,调用以下接口:
1 2 |
WASocialProxy.joinGroup(Activity activity, String platform, String groupId, String extInfo, WACallback<WAResult> callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | Activity对象 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持VK平台 |
groupId | String | Y | Group id | |
extInfo | String | N | 额外数据信息 | 扩展字段,根据各个平台需要定义 |
callback | WACallback<WAResult> | N | 回调方法,结果返回 | 返回成功的结果只代表请求发送成功,但是未必加入成功,对于封闭的和私有的Group是不能加入的 |
进入Group的详情页面,调用以下接口:
1 2 |
WASocialProxy.openGroupPage(Activity activity, String platform, String groupUri, String extInfo) |
如果客户端已经安装platform指定平台的app客户端,将会进入到app客户端详情页面,如果没有安装,则打开网页详情页。
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | Activity对象 | |
platform | String | Y | 平台类型 | 平台类型在WAConstants类中定义,目前支持VK平台 |
groupUri | String | Y | 打开Group的uri | VK平台为screen_name字段值 |
extInfo | String | N | 额外数据信息 | 扩展字段,根据各个平台需要定义 |
注意:此模块会对应用商店上架造成一定的风险,请酌情使用。
WINGSKD应用墙包含了应用推荐等功能。使用前必须确保手机的安全软件没有拦截该程序的悬浮窗口权限,使用调用以下接口:
1 2 |
WAApwProxy.showEntryFlowIcon(Activity activity) |
1 2 |
WAApwProxy.hideEntryFlowIcon(Activity activity) |
注意:
1)应用墙入口悬浮按钮的生命周期依赖显示它的Activity,多个Activity中显示,需要在每个Activity中都调用一次显示悬浮按钮接口;
2)在Activity创建后只需要显示一次,Activity销毁后自动销毁在当前Activity创建的悬浮按钮,但其他Activity中显示的悬浮按钮不会消失。
原来的push模块更改为Firebase模块。Firebase为3.9.3及之后版本必须接入的模块。
Firebase包含推送通知及统计分析(包括事件跟踪)功能。
温馨提示:WINGSDK当前版本的推送是基于Firebase实现,国内环境需要VPN才能使用。
在Firebase后台配置后,会得到两个文件,一个是google-services.json,需要研发配置到游戏中去;另一个是Firebase服务器秘钥,需要配置到SDK后台,游戏内无需操作
如果您还没有 Firebase 项目,请在Firebase控制台中创建一个。 如果已经有一个与您的移动应用关联的现有 Google 项目,请点击导入项目(Import Google Project)。 否则,请点击新建项目(Create New Project)。
进入项目,新建应用,输入应用的包名称,新建应用后下载一个 google-services.json 配置文件。可以随时重新下载此文件,如果包名改变必须重新配置并且重新下载google-services.json。将下载的配置文件复制到项目模块文件夹,通常为 app/。
注:如果您有多个CPS渠道包含有已定义的不同包名称,则必须在 Firebase console 中将每个应用添加到您的项目。
在WINGSDK后台应用配置中,添加Firebase服务器秘钥,打开Firebase控制台,进入项目,进入关联的应用,打开设置页面,打开云消息传递标签页面可以找到服务器秘钥。
添加推送模块依赖方法参考2.2 集成SDK到项目
添加依赖后,在项目(Project)的build.gradle文件中添加依赖
1 2 3 4 5 6 7 |
buildscript { dependencies { // 提示: 不要替换原来的dependencies,将下面的内容放进原有的下面即可 classpath 'com.google.gms:google-services:4.3.10' } } |
在项目模块(Module)的build.gradle文件中添加插件声明(将这一句添加到build.gradle文件的最低端, 没有添加推送模块的依赖,不要添加这句 )
1 2 3 |
// 将这一句添加到build.gradle文件的最底端, 没有添加推送模块的依赖,不要添加这句 apply plugin: 'com.google.gms.google-services' |
在AndroidManifest.xml中配置Firebase的事件记录开关
1 2 3 4 5 |
<!-- 开启/关闭 Firebase事件记录功能,默认开启,使用默认配置可不配置此项 --> <meta-data android:name="com.wa.sdk.track.ENABLE_FIREBASE" android:value="true" /> |
收到推送消息后,WINGSDK将在设备通知栏显示通知,用户点击通知后打开应用程序,会将消息的数据传递给应用(例如自定义的数据),如果在应用中需要接收数据,需要实现一个BroadcastReceiver子类,并且在AndroidManifest.xml配置。当BroadcastReceiver接收到一个Action值为com.wa.sdk.push.intent.NOTIFICATION_OPENED的广播时,即收到了打开的推送消息包含的数据,数据为存放在Intent的Extras中。
说明:推送消息数据的处理非必要,如果推送消息中没有数据需要处理,可以不用配置。
数据接收BroadcastReceiver实现示例
实现一个类继承BroadcastReceiver,在onReceive方法中处理数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class PushReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(null == intent || !WAPushConstants.ACTION_NOTIFICATION_OPENED.equals(intent.getAction())) { return; } Bundle bundle = intent.getExtras(); if(null == bundle) { LogUtil.e("PushReceiver", "通知打开,没有数据"); } else { LogUtil.e("PushReceiver", "通知打开,包含的数据"); for(String key : bundle.keySet()) { LogUtil.e("PushReceiver", key + " -- " + bundle.get(key)); } } } } |
在AndroidManifest.xml中配置Receiver,注意action值必须一致。
1 2 3 4 5 6 7 |
<receiver android:name=".receiver.PushReceiver" android:exported="false"> <intent-filter> <action android:name="com.wa.sdk.push.intent.NOTIFICATION_OPENED" /> </intent-filter> </receiver> |
进入WINGSDK后台消息推送页面,填写推送消息的内容,发送到已注册的设备。
说明:
1. 应用启动时Logcat日志中会打印出token,在SDK的Logcat工具的设备信息中也有token信息,如果token不为空,即说明程序已向服务器注册成功,可以接收推送消息了(SDK初始化时自动注册,无需手动调用接口)。
2. 程序卸载后,需要重新注册,覆盖安装不需要重新注册,但是有可能会出现token更新的情况。
3. 推送服务使用Firebase服务,必要时可能需要VPN。
该项为可选配置,但是为了更好的通知显示效果,建议配置。
若不使用自定义图标,通知会默认以白色渲染的应用图标作为通知图标来显示,效果参考下方图示。
a、自定义通知图标
在res/drawable文件夹下添加通知图标的图片文件。
通知图标要求:
1.文件名ic_wa_push_notification.png
2.图片格式png
3.图标尺寸参考应用桌面图标。
4.尽量带透明效果,体现图标易于辨认的核心形状。不要有圆形,圆角,方形等不透明背景,保证轮廓辨识度,因为Android系统默认会把该图标统一渲染颜色。若是核心形状辨识度不足,会影响视觉体验。下方有相应效果示例。
b、自定义通知图标背景颜色
1.在AndroidManifest.xml清单中添加下面内容
1 2 3 4 |
<meta-data android:name="com.google.firebase.messaging.default_notification_color" android:resource="@color/color_wa_push_notification" /> |
2.在res/values/colors.xml中添加 color_wa_push_notification 颜色声明,其中色值修改为项目要求的颜色
1 2 |
<color name="color_wa_push_notification">#3F51B5</color> |
效果展现
Demo应用图标原图:
通知显示效果:
自定义通知图标增加透明效果,及设置通知图标背景颜色为红色:
自定义后通知显示效果:
以Android 13为目标的应用项目,需要在恰当的时机(比如进入游戏时,或勾选开启通知按钮)申请通知权限,否则新安装应用无法接收Firebase通知,以下为申请通知权限逻辑示例:
1 2 3 4 5 6 7 |
if (Build.VERSION.SDK_INT >= 33) { //向用户申请通知权限 Manifest.permission.POST_NOTIFICATIONS //可以使用SDK的权限接口 WACommonProxy.checkSelfPermission() 进行申请,具体使用请查看 3.12 章节 Android6.0 权限管理 }else { //系统低于 Android 13 无需授权通知权限 } |
WINGSDK广告功能可以向玩家展示视频广告,可实现对观看视频广告的玩家进行奖励,提高广告的点击播放数。通过简单几步配置即可使用。
使用广告系统,必须先登录SDK,登录成功后SDK自动同步广告数据,当有新的广告数据缓存完成时,会在此回调中收到通知。
1 2 |
void WAAdProxy.setAdCachedCallback(WAAdCachedCallback callback) |
WAAdCachedCallback回调说明:
回调方法 | 说明 | 参数说明 |
---|---|---|
onVideoCached(int validVideoCount) | 广告缓存成功回调 | 当前可展示广告数 |
这个接口返回当前可展示的广告数量,当返回值大于1时,才能展示视频广告
1 2 |
int WAAdProxy.checkRewardedVideo() |
当用户登录SDK后,SDK自动同步广告并且缓存,缓存成功后广告才可用,有可展示广告时调用接口打开广告页面,无可用广告时返回错误。
1 2 |
void WAAdProxy.displayRewardedVideo(Activity activity, WAAdCallback callback, String extra) |
说明:extra参数是CP自定义数据,在展示视频的回调中和通知CP后台发放奖励时,会原样返回。
WAAdCallback回调说明:
回调方法 | 说明 | 参数说明(从左往右) |
---|---|---|
onPreDisplayRewardedVideo(String campaignId, String adSetId, int rewardAmount, String rewardType, String extra) | 显示视频前页面成功时回调回调 | 1、活动id 2、广告id 3、奖励数量 4、奖励类型(物品单位:例如金币、钻石) 5、额外数据(CP调用展示广告接口传入的自定义数据) |
onDisplayRewardedVideo(String campaignId, String adSetId, int rewardAmount, String rewardType, String extra) | 播放视频结束回调 | 1、活动id 2、广告id 3、奖励数量 4、奖励类型(物品单位:例如金币、钻石) 5、额外数据(CP调用展示广告接口传入的自定义数据) |
onCancelRewardedVideo(int process, String campaignId, String adSetId, String extra) | 点击关闭按钮退出后回调 | 1、关闭位置(0-播放视频前,1-播放视频过程中,,2-播放结束后页面) 2、活动id 3、广告id 4、额外数据 |
onLoadRewardedVideoFail(String campaignId, String adSetId, String extra) | 加载视频失败回调(视频文件错误或者丢失) | 1、活动id 2、广告id 3、额外数据(CP调用展示广告接口传入的自定义数据) |
onClickRewardedVideo(String campaignId, String adSetId, int rewardAmount, String rewardType, String extra) | 播放完视频点击推广信息回调 | 1、活动id 2、广告id 3、奖励数量 4、奖励类型(物品单位:例如金币、钻石) 5、额外数据(CP调用展示广告接口传入的自定义数据) |
1 2 |
WACscProxy.isOpenAiHelp(); |
说明:该接口返回布尔值,true表示已开启,false表示未开启。在使用其他AIHELP接口前请先判断这个接口,在返回true的情况下使用。示例如下:
1 2 3 4 5 |
if (WACscProxy.isOpenAiHelp()) { WACscProxy.openAiHelpV2(); } |
1 2 3 |
WACscProxy.openAiHelpV2(); |
说明:该接口受WING后台中”SDK客服开关V2”控制。如果后台未开启开关,此接口不生效。
1 2 |
WACscProxy.setSDKLanguage(String language); |
示例代码:
1 2 3 |
String language = "zh_CN"; WACscProxy.setSDKLanguage(language); |
语言支持列表图:
sdk版本3.9.7及以后版本,废弃原来的设置名称(WACscProxy.setName(game_name))方法,及机器人或人工客服头像的项目本地资源配置方式。统一在AiHelp后台进行配置,设置路径为APP-设置-SDK自定义设置,详情参考《第三方后台配置—Android版》的AiHelp模块的自定义SDK配置章节。
1 2 |
WAUserProxy.getUserCenterNotice(Activity activity,WACallback<WAShortUrlResult> callback) |
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
WAUserProxy.getUserCenterNotice(activity,new WACallback<WAShortUrlResult>() { @Override public void onSuccess(int code, String message, WAShortUrlResult result) { //通过 result.getCharacterId() 获取充值中心Character ID,其他数据查看 WAShortUrlResult类说明 showShortToast(result.getCharacterId()); } @Override public void onCancel() { } @Override public void onError(int code, String message, WAShortUrlResult result, Throwable throwable) { showShortToast(message); } }); |
1 2 |
WAUserProxy. showUserCenterNoticeUI(Activity activity,, WACallback<WAUserCenterResult> callback) |
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
WAUserProxy.showUserCenterNoticeUI(activity, new WACallback<WAShortUrlResult>() { @Override public void onSuccess(int code, String message, WAShortUrlResult result) { // 此方法不会被调用 } @Override public void onCancel() { showShortToast("窗口关闭"); } @Override public void onError(int code, String message, WAShortUrlResult result, Throwable throwable) { showShortToast(message); } }); |
结果通过传入的回调返回,数据封装在WAShortUrlResult类中。
WAShortUrlResult字段说明
字段名 | 类型 | 说明 | 备注 |
---|---|---|---|
code | int | 登录结果码 | 登录结果码 |
message | String | 错误信息 | |
info | String | 用户中心文字内容 | |
characterId | String | 充值中心Character ID | |
uid | String | 用户ID |
Android会出现需要分包的情况,分不同的cps channel包,不同的包会有不同的更新链接地址(分包请参阅分包相关文档),获取当前的包的更新链接调用以下接口:
1 2 |
WACommonProxy.getAppUpdateLink(WACallback<String> callback) |
结果在Callback中返回,如果后台配置了渠道的更新地址,将会返回相应渠道的更新链接地址,返回的结果可能为null或者空字符,需要判断处理。
buildVersion 在23以下版本,只需要在AndroidManifest.xml中配置权限即可,buildVersion 在23及以上版本,在AndroidManifest.xml中配置的敏感权限声明,当程序运行在API 23(android6.0)及以上的系统时,授权声明是无效的,敏感权限需要在程序运行时授权。
SDK提供了运行时权限的检查与授权接口,在程序运行时,调用以下接口进行权限自检:
1 2 |
WACommonProxy.checkSelfPermission(@NonNull ctivity activity, @NonNull String permission, boolean forceRequest, String denyConfirmMsg, String permissionSettingMsg, WAPermissionCallback callback) |
参数说明:
参数名 | 类型 | 必填 | 说明 | 备注 |
---|---|---|---|---|
activity | Activity | Y | Activity对象 | |
permission | String | Y | 权限名称 | 权限全称字符串,参考android.Manifest.permission |
forceRequest | boolean | Y | 是否强制申请权限 | true 强制申请 false非强制申请 这个参数决定权限申请流程。强制申请权限时,拒绝后会弹出确认对话框,如果拒绝且勾选不再询问时,调用接口检查权限时会要求到设置中打开权限;非强制申请权限时,拒绝授权不再弹任何对话框,下一次调用接口权限继续弹出授权对话框 |
denyConfirmMsg | String | N | 拒绝授权确认对话框的消息文字 | 拒绝授权后弹出确认对话框的消息文字 |
permissionSettingMsg | String | N | 提示跳转到设置页面打开权限对话框的消息文字 | 拒绝且勾选不再询问时,调用接口检查权限时弹出要求到设置中打开权限对话框中显示的消息文字 |
callback | WAPermissionCallback | N | 回调 | 接收返回的授权结果,CP根据授权结果做相应操作 |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WACommonProxy.checkSelfPermission(this, Manifest.permission.GET_ACCOUNTS, false, "如果您不允许WASdkDemo访问你的账户信息,您将无法使用Google登录", "WASdkDemo需要获取您的联系人信息来登录您的Google账号", new W APermissionCallback() { @Override public void onCancel() { // TODO 取消授权 } @Override public void onRequestPermissionResult(String[] permissions, boolean[] grantedResults) { // TODO 处理授权结果,判断是否通过授权 } } }); } |
在调用上面权限自检接口的Activity中的onRequestPermissionsResult()方法中调用已下接口,完成权限自检和授权的传递。
1 2 |
WACommonProxy.onRequestPermissionsResult(Activity activity, int requestCode, String[] permissions, int[] grantResults) |
示例:
1 2 3 4 5 6 |
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); WACommonProxy.onRequestPermissionsResult(this, requestCode, permissions, grantResults); } |
Google 应用内评分参考:
https://developer.android.com/guide/playcore/in-app-review
通过此接口,可以在应用内调起应用内评分
1 2 |
WAUserProxy.openReview(Activity activity,WACallback<Boolean> callback) |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
WAUserProxy.openReview( this, new WACallback<Boolean>() { @Override public void onSuccess(int code, String message, Boolean result) { showShortToast("api调用流程已经完成,无法获取用户是否评分,是否弹出评分框,请继续下一步操作"+message); } @Override public void onCancel() { } @Override public void onError(int code, String message, Boolean result, Throwable throwable) { } } ); |
备注:
评分回调onSuccess后,并不能知道用户是否已经评分,是否弹出评分界面,这是调用google 评分的api流程完成,不能作为用户已经完成评分的依据
谷歌商店评分页面的显示逻辑是完全由谷歌内部控制的,会根据用户是否弹过,评分接口调用频率等等一些逻辑去控制显示或者不显示,这个规则也不对外公开。
如果希望百分百观察到评分页面弹出及操作,需要按照谷歌文档进行操作,建议使用内部测试轨道进行测试。
Google测试说明:
https://developer.android.com/guide/playcore/in-app-review/test?hl=zh-cn
如果发现调不起评分界面,请查看问题排查:
https://developer.android.com/guide/playcore/in-app-review/test?hl=zh-cn#troubleshooting
游戏评价窗口用于向用户展示评分提示窗口,弹出后用户可以选择提交好评(即拉起Google评分),或我要提意见(即打开AiHelp),或不谢谢(即关闭窗口,手势返回关闭同这个操作一样),具体UI可以查看后面的效果图。
1 2 |
WAUserProxy.openGameReview(Activity activity, WAGameReviewCallback callback) |
注意:
1.如果需要评价完成给用户发放奖励,可以在onReviewComplete回调中进行处理
2.该功能受WingSDK后台开关控制,需要打开游戏评价开关
3.评分功能是无法获得具体评分内容和分值的,Google评分机制设计如此
4.关于Google评分的详情及测试 google 应用内评分
示例代码:
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 |
WAUserProxy.openGameReview(this, new WAGameReviewCallback() { @Override public void onError(int code, String message) { String text = "打开游戏评价失败:" + code + "," + message; Log.d(WAConstants.TAG,text); } @Override public void onReject() { String text = "游戏评价结果:不,谢谢!"; Log.d(WAConstants.TAG,text); } @Override public void onOpenAiHelp() { String text = "游戏评价结果:我要提意见"; Log.d(WAConstants.TAG,text); } @Override public void onReviewComplete() { String text = "游戏评价结果:提交好评"; Log.d(WAConstants.TAG,text); // 如果需要评价完成给用户发放奖励,可以在这里进行处理 } }); |
界面效果:
游戏如需使用Google账号进行登录、Google商店进行支付,需要进行以下配置。 如果不需要使用Google相关功能,请忽略此章节
后台配置请参考第三方后台配置—Android版公共配置流程。
在values/strings.xml中添加公钥字符串资源:
在values/strings.xml中添加服务器OAuth client ID(即Google后台Web application 类型的OAuth client ID):
1 2 3 |
<!-- Google Web application type OAuth 2.0 client ID --> <string name="google_server_client_id">YOUR_SERVER_OAUTH_CLIENT_ID</string> |
游戏如需使用Google game service相关功能,需要进行以下配置。 如果不需要相关功能,请忽略此章节
使用Google Game Service服务,还需要在AndroidManifest.xml.xml中application标签下添加以下配置:
1 2 3 4 |
<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="YOUR_APP_ID" /> |
说明:字符资源的值是Google Game Service的APP ID,需要Google开发者控制台创建游戏服务获得。请参考第三方后台配置—Android版添加Google Game Service支持。
1 2 3 4 5 6 7 |
-dontwarn com.google.** -keep class com.google.android.gms.** { *; } -keep class com.google.firebase.** { *; } -keep class com.android.vending.billing.** { *; } |
获取程序签名文件SHA-1命令如下:
1 2 |
keytool -exportcert -alias <release_key_alias> -keystore <path-to-production-keystore> -list -v |
其中<release_key_alias>是证书别名,<path-to-production-keystore>是证书的地址。
游戏如需使用Facebook相关登录、社交、数据收集功能,需要进行以下配置。如果不需要相关功能,请忽略此章节
在strings.xml中添加Facebook APP ID、Client Token、login protocol scheme声明::
1 2 3 4 5 |
<string name="facebook_app_id">YOUR_FACEBOOK_APP_ID</string> <string ame="fb_login_protocol_scheme">fb+YOUR_FACEBOOK_APP_ID</string> <string ame="facebook_client_token">YOUR_FACEBOOK_CLIENT_TOKEN</string> |
在AndroidManifest.xml中添加配置
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 |
<!-- Facebook Start --> <provider android:name="com.facebook.FacebookContentProvider" android:authorities="com.facebook.app.FacebookContentProvider${YOUR_FACEBOOK_APP_ID}" android:exported="true" /> <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/> <meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token" /> <!-- 开启/关闭 Facebook数据收集功能,默认关闭,使用默认配置可不配置此项 --> <meta-data android:name="com.wa.sdk.track.ENABLE_FACEBOOK" android:value="true" /> <activity android:name="com.facebook.CustomTabActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="@string/fb_login_protocol_scheme" /> </intent-filter> </activity> <!-- Facebook End --> |
注意:
1、string的name必须为facebook_app_id,不可更改,值为Facebook app id
2、fb_login_protocol_scheme格式为fb+ YOUR_FACEBOOK_APP_ID,如facebookkid为2929419560408279,则fb_login_protocol_scheme为 fb2929419560408279
3、将FacebookContentProvider后面的${YOUR_FACEBOOK_APP_ID}替换成你的Facebook app id。获取方式请参考第三方后台配置—Android版2.1 Facebook基础配置。
4、client token 获取方式: 获取方式参考
1 2 3 4 |
-keep class com.facebook.** { *; } -keep class bolts.** { *; } |
权限 | WAConstants中定义 | 类型 | 权限取值 | 说明 |
---|---|---|---|---|
读取用户配置 | FB_PERMISSION_PUBLIC_PROFILE | read | public_profile | |
读取好友列表 | FB_PERMISSION_USER_FRIENDS | read | user_friends |
游戏如需使用Appsflyer相关数据收集功能,需要进行以下配置。如果不需要相关功能,请忽略此章节
在AndroidManifest.xml中添加以下声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!-- AppsFlyer SDK START --> <!-- AppsFlyer AppKey(需要自己申请) --> <meta-data android:name="com.wa.sdk.track.APPSFLYER_APP_KEY" android:value="922wXRJwEns6Qj4MfMt4Gg" /> <!-- AppsFlyer Channel --> <meta-data android:name="CHANNEL" android:value="GOOGLE" /> <!-- 开启/关闭 AppsFlyer数据收集功能,默认开启,使用默认配置可不配置此项 --> <meta-data android:name="com.wa.sdk.track.ENABLE_APPSFLYER" android:value="true" /> <!-- AppsFlyer SDK END --> |
1 2 3 4 5 6 7 8 |
-dontwarn com.google.android.gms.** -dontwarn com.appsflyer.** # 排除AppsFlyer本身的Lib -keep class com.appsflyer.** { *; } -keep class android.support.** { *; } |
a)官方说明:官方说明
b)集成Firebase,参考3.7.2 集成配置
c)从Firebase 控制台获取 服务器密钥,填入AppsFlyer的卸载配置中
游戏如需使用Chartboost相关数据收集功能,需要进行以下配置。如果不需要相关功能,请忽略此章节
在AndroidManifest.xml中application标签下添加声明
1 2 3 4 5 6 7 8 9 10 11 |
<!-- Chartboost SDK START --> <!-- Chartboost app id --> <meta-data android:name="com.wa.sdk.track.CHARTBOOST_APP_ID" android:value="55b74c74c909a66b8af388a7" /> <!-- Chartboost app signature --> <meta-data android:name="com.wa.sdk.track.CHARTBOOST_APP_SIGNATURE" android:value="2b7b5cbc8c5d0429c9498dd3484d84fb4974a206" /> <!-- 开启/关闭 Chartboost数据收集功能,默认关闭,使用默认配置可不配置此项--> <meta-data android:name="com.wa.sdk.track.ENABLE_CHARTBOOST" android:value="true" /> <!-- Chartboost SDK END --> |
特别提醒:以上所有配置的android:name字段值都必须和文档一致,android:vlaue值由各应用申请的资源而定。
1 2 3 4 5 |
-keepattributes SourceFile,LineNumberTable -dontwarn com.google.android.gms.** -keep class com.chartboost.sdk.** |
游戏如需使用VK相关登录、社交功能,需要进行以下配置。如果不需要相关功能,请忽略此章节
在values/strings.xml中添加加以下字符串资源:
1 2 3 |
<!-- VK app id --> <integer name="com_vk_sdk_AppId">YOUR_APP_ID</integer> |
说明:APP_ID需要在VK的开发者管理后台创建应用后获得。
1 2 |
-keep class com.vk.sdk.** { *; } |
游戏如需使用Twitter账号登录游戏,需要进行以下配置。如果不需要相关功能,请忽略此章节
在AndroidManifest.xml的application标签下中添加以下配置
1 2 3 4 5 6 7 8 9 10 11 |
<!-- Twitter Start --> <!-- Twitter consumer key,需要到Twitter后台申请 --> <meta-data android:name="com.wa.sdk.TWITTER_CONSUMER_KEY" android:value="YOUR_TWITTER_CONSUMER_KEY" /> <!-- Twitter consumer secret,需要到Twitter后台申请 --> <meta-data android:name="com.wa.sdk.TWITTER_CONSUMER_SECRET" android:value="YOUR_TWITTER_CONSUMER_SECRET" /> <!-- Twitter End --> |
1 2 |
-keep class com.twitter.sdk.android.** { *; } |
游戏如需使用Instagram账号登录游戏,需要进行以下配置。如果不需要相关功能,请忽略此章节
在AndroidManifest.xml文件的application标签下中添加以下配置
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!-- Instagram Start --> <!-- Instagram client id,需要到Instagram后台申请 --> <meta-data android:name="com.ghw.sdk.INSTAGRAM_CLIENT_ID" android:value="YOUR_INSTAGRAM_CLIENT_ID" /> <!-- Instagram client secret,需要到Instagram后台申请 --> <meta-data android:name="com.ghw.sdk.INSTAGRAM_CLIENT_SECRET" android:value="YOUR_INSTAGRAM_CLIENT_SECRET" /> <meta-data android:name="com.ghw.sdk.INSTAGRAM_REDIRECT_URI" android:value="http://blog.wing-analytics.com/" /> <!-- Instagram End --> |
需要注意的是com.ghw.sdk.INSTAGRAM_REDIRECT_URI的值可以自己定义,但是需要和Instagram后台配置的一致。如下图所示:
游戏如需使用智能客服 AIHelp客服系统,需要进行以下配置。如果不需要相关功能,请忽略此章节
在AndroidManifest.xml文件的application标签下中添加以下配置
1 2 3 4 5 6 7 8 9 10 |
<meta-data android:name="com.wa.sdk.AIHelp_appKey" android:value="YOUR_AIHelp_appKey" /> <meta-data android:name="com.wa.sdk.AIHelp_domain" android:value="YOUR_AIHelp_domain" /> <meta-data android:name="com.wa.sdk.AIHelp_appId" android:value="YOUR_AIHelp_appId" /> |
注意事项:AIHelp_domain配置必须使用三级域名的形式。例如原gamehollywoodhk@aihelp.net需要改为 gamehollywoodhk.aihelp.net。
打包apk混淆代码配置中增加以下配置
1 2 3 |
-keep class net.aihelp.** {*;} |
1)在项目级别根build.gradle中配置华为仓库地址和依赖插件,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
buildscript { repositories { maven {url 'https://developer.huawei.com/repo/'} } dependencies { classpath 'com.huawei.agconnect:agcp:1.6.1.300' classpath 'com.huawei.agconnect:agconnect-core:1.6.1.300' } } allprojects { repositories { maven {url 'https://developer.huawei.com/repo/'} } } |
2)在应用级别的根目录中添加agconnect-services.json文件,如下图所示:
agconnect-services.json的生成请参考《WINGSDK第三方后台配置.docx》中添加华为HMS后台配置章节。
3)在应用级别的build.gradle中,添加华为插件,如下:
apply plugin: ‘com.huawei.agconnect’
如果使用性能监测,则需要添加APMS开关代码,如下:
agcp{
enableAPMS true
}
4)在应用级别的build.gradle中,添加华为多语种支持,配置如下:
android {
defaultConfig {
//华为多语种设置,由CP配置
resConfigs “en”, “zh-rCN”, “pt”
}
}
支持语言参考:
https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/support-language-0000001050040564-V5
5)在AndroidManifest.xml中添加配置:
1 2 3 4 5 6 |
<!-- 开启/关闭 HUAWEI_HMS数据收集功能,默认关闭,如需使用数据收集功能,需配置开启状态 --> <meta-data android:name="com.wa.sdk.track.ENABLE_HUAWEIHMS" android:value="true" /> |
1)proguard-rules.pro文件配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
-ignorewarnings -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.huawei.updatesdk.**{*;} -keep class com.huawei.hms.**{*;} -keep class com.hianalytics.android.**{*;} -keep class com.huawei.agconnect.**{*;} -dontwarn com.huawei.agconnect.** -keep interface com.huawei.hms.analytics.type.HAEventType{*;} -keep interface com.huawei.hms.analytics.type.HAParamType{*;} -keepattributes Exceptions, Signature, InnerClasses, LineNumberTable -keep class com.huawei.hianalytics.**{*;} |
2)AndResGuard配置方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
"R.string.hms*", "R.string.connect_server_fail_prompt_toast", "R.string.getting_message_fail_prompt_toast", "R.string.no_available_network_prompt_toast", "R.string.third_app_*", "R.string.upsdk_*", "R.layout.hms*", "R.layout.upsdk_*", "R.drawable.upsdk*", "R.color.upsdk*", "R.dimen.upsdk*", "R.style.upsdk*", "R.string.agc*" |
说明:如果应用无相关混淆可不配置。
1 2 3 4 5 6 7 8 9 10 11 12 |
<!--HMS-SDK need network permission while check if upgrade is neccessary--> <uses-permission android:name="android.permission.INTERNET" /> <!--chek network permissions--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!--check wifi state--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- running after lock screen --> <uses-permission android:name="android.permission.WAKE_LOCK" /> |
说明:SDK已经集成权限,如果危险权限需要CP动态申请权限。
在项目app目录层级下的res/values/strings.xml中添加wa_custom_tab_scheme声明
1 2 3 |
<string name="wa_custom_tab_scheme">wa+YOUR_SDK_APPID</string> |
注意:
1.string的name必须为wa_custom_tab_scheme,不可更改
2.格式为wa+YOUR_SDK_APPID。比如SDK的appid为f7f9a9d18da611e5a0be000d3a906774,则wa_custom_tab_scheme的对应内容为waf7f9a9d18da611e5a0be000d3a906774
3.这里SDK的appid为wingsdk的appid
SDK中的状态码统一以静态变量方式封装在WACallback接口里面,如果使用到状态码,强烈建议采用静态变量的方式调用,不要直接使用数值。
名称 | 取值 | 说明 |
---|---|---|
CODE_SUCCESS | 200 | 成功 |
CODE_ERROR | 400 | 错误 |
CODE_UNAUTHERIZED | 401 | 请求未认证:访问受限资源是缺少认证信息,或者认证未通过 |
CODE_FORBIDEN | 403 | 禁止访问:由于应用上下文原因或请求端上下文的原因被禁止访问资源,例如IP限制等 |
CODE_NOT_FOUND | 404 | 找不到被访问资源:接口不存在、页面不存在或对应的业务实体找不到 |
CODE_SERVER_ERROR | 500 | 服务器内部故障 |
CODE_API_INVALID | 501 | 所请求接口或页面未实现 |
CODE_SDK_APPID_INVALID | 4010 | 无效appId: appId不存在或未开启 |
CODE_SIGN_ERROR | 4011 | 无效osign:osign校验失败 |
CODE_REQUEST_TIME_OUT | 4012 | 请求已过期:ots校验失败 |
CODE_PLATFORM_VERIFY_ERROR | 4013 | 第三方平台验证失败 |
CODE_ACCOUNT_VERIFY_ERROR | 4014 | 访客登录验证失败,登录验证失败 |
CODE_PLATFORM_BOUND_ALREADY | 4015 | 用户已经绑定了这个平台的其他账户 |
CODE_PRE_PLATFORM_VERIFY_ERROR | 4016 | prePlatform验证失败 |
CODE_USER_NOT_FOUND | 4017 | 用户不存在(没有找到) |
CODE_ACCOUNT_BOUND_BY_OTHERS | 4018 | 账户已经被其他用户绑定 |
CODE_ORDER_ID_INVALID | 4019 | 无效orderId |
CODE_ORDER_VERIFY_ERROR | 4020 | 订单验证失败 |
CODE_REWARD_NOT_FOUND | 4021 | FB邀请奖励事件未找到奖励政策 |
CODE_REPEAT_CRASH_REPORT | 4022 | 闪退发送报告重复 |
CODE_CHENNEL_NOT_FOUND | 4023 | 未找到渠道信息 |
CODE_UNABLE_DISBAND | 4024 | 不可以执行解绑操作 |
CODE_PAY_PLATFORM_CLOSED | 4026 | 支付渠道已关闭 |
CODE_LOGIN_PLATFORM_CLOSED | 4029 | 登录渠道已关闭 |
CODE_AD_NOT_CONFIG | 4044 | CP关闭广告开关或未配置广告奖励信息 |
CODE_AD_NOT_FOUND | 4045 | 查找不到广告展示信息 |
CODE_CHANNEL_BALANCE_INSUFFICIENT | 4046 | 第三方平台余额不足 |
CODE_CHANNEL_LOGIN_INVALID | 4047 | 第三方平台登录过期 |
CODE_ACCOUNT_BIND_DISABLED | 4048 | 账号绑定关闭(不允许绑定账号) |
CODE_ACCOUNT_UNBIND_DISABLED | 4049 | 账号解绑关闭(不允许解绑账号) |
CODE_USER_CENTER_CLOSED | 4059 | 用户中心未开启 |
CODE_CANCELED | -100 | 取消操作 |
CODE_FILE_NOT_FOUND | -101 | 文件找不到 |
CODE_API_NOT_SUPPORTED | -102 | API不支持 |
CODE_SDK_UNINITIALIZED | -200 | SDK没有初始化 |
CODE_CONTENT_CAN_NOT_BE_SHARED | -201 | 内容不可分享,一般是传入的内容为空,或者其他 |
CODE_NOT_LOGIN | -202 | 没有登录 |
CODE_LOGIN_FAILURE | -203 | 登录失败 |
CODE_NO_PERMISSION | -204 | 登录没有获取到相应的权限 |
CODE_EXCEPTION | -205 | Facebook内部定义的错误,异常信息 |
CODE_FILE_SIZE_LIMIT | -206 | 文件大小超出限制 |
CODE_NOT_LOGIN_WITH_PLATFORM | -207 | 没有以平台登录 |
CODE_SERVER_ID_NOT_FOUND | -208 | ServerId没有设置 |
CODE_ACCOUNT_NOT_FOUND | -209 | 账户不存在 |
CODE_ACCOUNT_NOT_ALLOW_UNBIND | -210 | 账户不允许解绑 |
CODE_PLATFORM_ACCOUNT_NOT_MATCH | -211 | 登录的平台账户和当前用户不匹配 |
CODE_GAME_USER_ID_NOT_FOUND | -212 | Game user id没有设置 |
CODE_GOOGLE_SERVICE_MISSING | -301 | 没有安装Google服务 |
CODE_GOOGLE_SERVICE_UPDATING | -302 | Google服务正在更新中 |
CODE_GOOGLE_SERVICE_VERSION_UPDATE_REQUIRED | -303 | Google服务版本过低,需要更新 |
CODE_GOOGLE_SERVICE_DISABLED | -304 | Google服务被禁用 |
CODE_GOOGLE_SERVICE_INVALID | -305 | Google服务不可用 |
CODE_DEVICE_NO_SUPPORTED | -401 | 设备不支持 |
CODE_NETWORK_UNAVAILABLE | -402 | 网络不可用 |
CODE_PAY_SERVICE_DISCONNECTED | -501 | 支付:服务连接中断 |
CODE_PAY_SERVICE_UNUSABLE | -502 | 支付:服务不可用 |
CODE_PAY_ITEM_UNAVAILABLE | -503 | 支付: 商品不可用 |
CODE_PAY_DEVELOPER_ERROR | -504 | 支付:开发者错误 |
CODE_PAY_ITEM_ALREADY_OWNED | -505 | 支付:已经拥有该商品(没有消耗) |
CODE_PAY_ITEM_NOT_OWNED | -506 | 支付:没有拥有该商品 |
CODE_PAY_WITHOUT_REPORT | -507 | 支付:支付成功但是没有上报或者上报失败了 |
CODE_PAY_CHECKING_FAILED | -508 | 支付:支付成功,但是通知后台的时候校验失败了 |
CODE_PAY_REORDER_TIME_LIMIT | -509 | 支付:订单时间间隔限制(在特定的时间内重复下订单) |
CODE_ACHIEVEMENT_NOT_INCREMENTAL | -601 | 成就不是分步成就(非分不成就进行递增或设置步数时) |
CODE_ACHIEVEMENT_UNKNOWN | -602 | 成就id不存在,找不到指定成就 |
CODE_ACHIEVEMENT_UNLOCKED | -603 | 成就已经解锁(尝试解锁已经被解锁的成就时) |
CODE_ACHIEVEMENT_UNLOCK_FAILURE | -604 | 成就解锁失败(解锁隐藏成就时) |
CODE_GAME_NEED_SIGN | -605 | 游戏服务已登出,需要重新登录 |
名称 | 取值 | 备注 |
---|---|---|
CHANNEL_WA | WINGA | WA平台,分匿名登录和应用内登录 |
CHANNEL_GOOGLE | Google平台 | |
CHANNEL_FACEBOOK | Facebook平台 | |
CHANNEL_VK | VK | VK平台 |
CHANNEL_TWITTER | Twitter平台 | |
CHANNEL_INSTAGRAM | Instagram平台 | |
CHANNEL_HUAWEI_HMS | 华为海外 | 华为平台 |
CHANNEL_GHG | GHG_INTEGRATION | Game Hollywood Games平台 |
CHANNEL_R2 | R2_INTEGRATION | R2Games平台 |
变量名 | 取值值 | 说明 | 备注 |
---|---|---|---|
REQUEST_INVITE | INVITE | 邀请 | |
REQUEST_REQUEST | REQUEST | 普通请求 |
说明:vk平台测试游戏邀请功能需要申请权限,可以把请求类型设置成REQUEST_REQUEST来测试普通邀请,待申请权限通过后改成REQUEST_INVITE来测试。关于vk邀请功能的业务流程图如下:
在WAEventType接口中定义
静态变量名称 | 事件名称 | 说明 |
---|---|---|
INITIATED_PURCHASE | ghw_initiated_purchase | 点击购买 |
COMPLETE_PURCHASE | ghw_purchase | 购买完成 |
WAEventUserInfoUpdate | ghw_user_info_update | 更新用户信息 |
USER_CREATED | ghw_user_create | 创建角色 |
IMPORT_USER | ghw_user_import | 导入用户 |
LEVEL_ACHIEVED | ghw_level_achieved | 等级或分数 |
在WAEventParameterName接口中定义
静态变量名称 | 参数名称 | 数据类型 | 说明 |
---|---|---|---|
ACCOUNT_TYPE | accountType | String | 账户类型 |
GENDER | gender | int | 性别 |
AGE | age | int | 年龄 |
SUCCESS | success | boolean | 是否成功 |
TRANSACTION_ID | transactionId | String | 交易的流水号 |
PAYMENT_TYPE | paymentType | String | 支付类型 |
CURRENCY_TYPE | currencyType | String | 货币类型 |
CURRENCY_AMOUNT | currencyAmount | float | 现金额 |
VERTUAL_COIN_AMOUNT | virtualCoinAmount | int | 虚拟货币数量 |
VERTUAL_COIN_CURRENCY | virtualCurrency | String | 虚拟货币类型 |
IAP_ID | iapId | String | 道具ID |
IAP_NAME | iapName | String | 道具名称 |
IAP_AMOUNT | iapAmount | int | 道具数量 |
ITEM_NAME | itemName | String | 游戏内虚拟物品的名称/ID |
ITEM_AMOUNT | itemAmount | int | 交易的数量 |
SCORE | score | int | 得分数 |
PRICE | price | float | 价格 |
CONTENT_TYPE | contentType | String | 内容类型 |
CONTENT_ID | contentId | String | 内容ID |
QUANTITY | quantity | int | 数量 |
SEARCH_STRING | searchString | String | 搜索关键字 |
DESCRIPTION | description | String | 描述 |
NICKNAME | nickname | String | 昵称 |
VIP | vip | int | 等级 |
ROLE_TYPE | roleType | String | 角色类型 |
BINDED_GAME_GOLD | bindGameGold | int | 绑定钻石 |
GAME_GOLD | gameGold | int | 用户钻石数 |
FIGHTING | fighting | int | 战斗力 |
REGISTER_TIME | registerTime | long | 注册时间 |
TASK_ID | taskId | String | 任务Id |
TASK_NAME | taskName | String | 任务名称 |
TASK_TYPE | taskType | String | 任务类型 |
TASK_STATUS | taskStatus | int | 任务状态:状态标识:1→领取任务, 2→开始任务, 3→待领奖(任务完成), 4→已领奖 |
GOLD_TYPE | goldType | int | 货币类型 |
AMOUNT | amount | int | 变更货币数 |
APPROACH | approach | String | 变更途径 |
IS_FIRST_ENTER | isFirstEnter | int | 是否第一次导入用户, 默认为0, 是为1 |
STATUS | status | int | 状态 |
Facebook SDK更新到4.26.0后,打包apk或直接运行项目时失败,出现OutOfMemoryError:GC overhead limit exceeded的异常信息,如下图(可在AndroidStudio的“Messages”标签或者“Gradle Console”标签看到)
这个问题是升级Facebook SDK到4.26.0后,导致开发工具打包是出现内存不足的问题,解决方法如下:
在程序模块下面的build.gradle文件中,在android里面添加下面配置:
1 2 3 4 |
dexOptions { javaMaxHeapSize "4g" } |
google控制台地址:https://console.developers.google.com
Google后台配置简要流程如下:
上图中的所涉及到的流程在后续章节中都有详细指引。
简要流程:
1.API控制台创建一个公共项目用于Play 控制台关联(如果已经有关联的项目则不需要再创建,一个主开发者帐号只能关联一个项目)
2.Play控制台关联API控制台的公共项目
3.API控制台中在公共项目中创建服务者账号,下载P12证书文件
4.Play控制台中为服务者帐号开放权限,目前只需要查看财务权限
5.将P12证书文件和服务者帐号保存至WA后台
打开Google API控制台,创建一个新的控制台项目
注册账号后,开Google API 控制台,创建一个新的公共项目,
注意:如果使用现有的公共项目(Google Play Console已关联的项目),可以不新建。
点击”新建项目”
在”新建项目页面”输入项目名称,点击“创建”新建即可完成新项目创建
项目名称需要保存记录,对应windsdk后台中,添加google支付平台的需要填写的应用名称栏目
打开Google Play开发者控制台,在设置->API权限->关联项目中,关联前面创建的公共项目。如果已关联,则下一步在已关联的项目中创建“服务者账号”即可。:
服务帐号是SDK后台验证支付订单时候使用,运营人员需要将服务帐号和证书保存至SDK后台。SDK后台的操作请参考《WINGSDK后台基础设置》 。不同的应用,不要使用相同的服务帐号。
打开Google API控制台,选择公共项目,进入项目“API和服务”中的“凭据”页面
在“凭据”页面,点击“创建凭据”,选择“服务账号”
进入“创建服务账号”页面,第一步填入“服务账号名称”
第二步选择服务账号“角色”,分配“Editor”角色,然后点击“继续”
第三步中直接点击“完成”即可
接下来在公共项目的“凭据”中“服务账号”列表找到刚创建的“服务账号”
点击进入该“服务账号”的编辑界面,选中“密钥”标签,点击“添加密钥”并选择“创建新密钥”
在弹出框中选择“P12”类型私钥,点击“创建”
点击“创建”后,浏览器会自动下载“P12”私钥文件
“P12″私钥文件需要妥善保管,在WingSDK后台中添加Google支付平台时会要求上传该文件。
创建“服务账号”完毕后,在Google Play控制台,设置->API权限的页面的“服务账号”列表中,可以找到新创建的“服务账号”查看并修改权限
选中“账号权限”标签,只勾选“查看财务”权限即可
选中“应用权限”标签,添加该“服务账号”对应的游戏,点击“应用”
在弹出框中确认已勾选“查询财务数据”权限,点击“应用”完成添加
完成“应用权限”和“账号权限”配置后,点击“邀请用户”发送邀请
之后可以在“API权限”的“服务账号列表”中看到该“服务账号”已经是“有效”的状态
进行完上述操作之后,将“服务帐号”(即邮箱)和“P12”私钥文件保存至WA后台即可。
简要流程:
1.创建专用于游戏的新项目
2.在游戏项目中新建Web类型ClientID,用于WA后台Google登录配置
3.在游戏项目中新建Android类型ClientID,需要研发提供包名(PackageName)和应用签名jks文件的SHA-1信息
同上面公共项目创建一样,新建一个专用于游戏的项目
在游戏项目中,选择进入“API和服务”中的“已启用的API和服务
在“已启用的API和服务”界面,选择“+启用API和服务”,进入“API库”界面
在“API库”中,搜索“Google+”,选择并进入“Google+ API”
在“Google+ API”产品详情页面中,点击“启用”
在添加OAuth Client ID之前,必须先完成“同意屏幕”配置。“同意屏幕”会影响用户授权是看到的界面,如下:
首先在前面新建的专用于游戏的“项目”中,进入“同意屏幕”界面,操作如下
在“同意屏幕”配置界面,UserType选择“外部”,然后点击“创建”
第一步,填入“应用名称”和“用户支持电子邮件”,以及“开发者联系信息”,这几项都是必填项目。
其中“应用名称”将会是用户授权登陆时看到的应用名称,其他可选项根据实际情况决定是否填写,下面是可选项的影响及要求:
1.应用的徽标和名称:建议使用徽标,但不强制要求使用
2.用户可以用来与您联系的电子邮件地址以及范围列表:范围是您的应用对访问用户的 Google 帐号以及会共享哪些数据的具体请求。您将在下一步中添加范围。
3.指向应用隐私权政策和服务条款的链接
此部分内应包含:
一个描述用户可以如何管理对其 Google 帐号的访问权限的句子
一个指向 Google 文章的链接,其中介绍了 Google 如何帮助用户安全地共享其数据
第二步数据访问“范围”配置,这一步无需处理,直接下一步即可
第三步“测试用户”配置,这一步也无需配置,直接下一步
第四步“摘要”,到这一步已经完成“同意屏幕”配置,可以在“摘要”界面审查自己的配置,也可以直接返回。
进入游戏“项目”的“凭据”界面,点击“创建凭据”选择“OAuth客户端ID”
在“应用类型”中选择“Web应用”类型
填写“名称”,然后点击“创建”即可完成创建
在创建完成提示界面中,可以直接 复制刚创建的“Web客户端ID”保存,后续将需要提供给研发和WA后台Google登录配置。
跟创建Web应用“OAuth 客户端 ID”类似,在游戏“项目”的“凭据”界面中创建“OAuth客户端ID”,但是类型选择“Android”
填写“名称”,“包名”,“SHA-1证书指纹”,其中“包名”和“SHA-1”都由研发提供,获取指引如下:
包名:Android项目的applicationId,在“应用层级”的build.gradle文件中的android->defaultConfig->applicationId找到,具体参考下图
SHA-1证书指纹:首先需要研发创建游戏的“正式应用签名jks文件”,然后使用下方命令输出“SHA-1证书指纹”信息,输出结果参考下图
命令:keytool -keystore path-to-debug-or-production-keystore -list -v
创建完成之后,一般“隔天”会生效,生效后就可以正常进行Google登录
为了确保由研发生成的“正式应用签名jks文件”在GooglePlay中正常生效,需要在Play控制台更改应用签名密钥。
Play控制台中选择游戏应用,在“内部测试”轨道中选择“创建新的发布版本”或“修改发布版本”
不需要上传应用,直接点击“更改应用签名密钥”,在弹出的确认框中点击“使用其他密钥”
接着在“应用签名偏好设置”界面中,选择“从Java密钥库导出并上传密钥”,在这里按照指示完成“zip文件”上传,最后点击保存。具体指示说明参考下图
保存完成之后,可以在游戏应用的“设置”->“应用完整性”中找到Play中已生效的“SHA-1”信息,把这个跟前面研发提供的“SHA-1”进行比对,一致则说明配置正确,否则需要重新配置,同样是从“内部测试”的“更改应用签名密钥”开始。
添加应用内商品前,按要求需要先上传有BILLING 权限(接入WingSDK的Google模块默认带有该权限)的应用包,建议在“内部测试”完成上传,上传应用包即可达成条件,无需发布。
在游戏应用的“应用内商品”界面,可以“创建商品”
按照提示填写完成对应项,最后点击“保存”,其中“设置价格”和“税费和法规遵从设置”界面如下图
注意:商品ID是唯一的,即使被删除后也依然占用原ID。
保存之后,商品默认是“无效”状态,需要点击“启动”改为“有效”状态
“启用”商品之后,在应用内对应商品详情界面,可以进行停用及删除
GooglePlay后台目前支持批量导入,因为csv模板可能会变更,所以建议先创建一个商品,再导出,根据导出的最新csv模板样式,添加商品,再保存csv文件上传导入。
同样是在“应用内商品”界面,先根据上一步操作创建一个商品,然后点击“创建商品”旁边的选项“图标”,选择“导出”
导出的商品csv文件内容如下图,再参考已有的导出商品,按照相同方式补充完剩下的商品,保存商品csv文件
同样是“应用内商品”界面,点击选项“图标”,选择“导入”
导入最新的商品csv文件。注意:批量导入,如果csv商品文件中包含已有商品则会修改对应商品内容。
导入完成之后就可以在列表中看到所有已导入的商品
注意:如果文件内容中有中文,那么csv文件可能存在乱码问题,如果有这种情况,需要把csv的编码改为utf-8,确认中文字符正常,再保存上传。
在应用未正式发布前,Google支付可以在Google Play添加测试用户才能进行沙盒测试。
详细的GooglePlay应用测试说明和方法可参考下方官方文档:
https://support.google.com/googleplay/android-developer/answer/9845334
“封闭式测试”和“内部测试”:
进入游戏应用的“内部测试”轨道(“封闭式测试”也相似),在“测试用户数量”标签中,如果勾选“已有测试列表”,如果没有则“创建电子邮件列表”再勾选(创建界面截图如下),然后保存。保存之后可以复制“测试邀请链接”,发给测试人员。
测试人员在浏览器上登录被邀请的Google账号,然后打开“测试邀请链接”,点击“接受邀请”
“接收邀请”之后,测试人员根据指示下载测试版应用安装测试
2.正式发布阶段
将测试者的email添加到google控制台的测试者账户中,具体可参考:
http://developer.android.com/google/play/billing/billing_admin.html#billing-testing-setup
具体以官方说明为准,截图可能会过期。
在开发者管理者控制台左侧菜单打开“游戏服务”菜单,在列表中选中需要新建成就的游戏服务。
如看不到Play 游戏服务,则在顶部搜索栏中搜索”Play游戏服务设置”,然后选中
选中“是,我的游戏已经使用了Google API”,此时在下方选择要关联的项目。选择项目,下一步即可完成创建。(如没有创建Google API项目,则参考 1.3.子项目中配置应用的OAuth Client Id* 流程先创建子项目)
在游戏服务中添加新游戏之后自动生成了Google Game Service App Id,此值需提供给开发人员,如下图所示:
如提示配置OAuth同意屏幕,按照要求操作同意接口,同意完后,点击添加凭证,选择Android类型,输入名称等基本信息,选择OAuth客户端即可,然后保存。(默认情况下选择OAuth客户端只有一个,如若多个,可以选择后,查看包名和指纹是否和应用的一致进行确认)
创建完游戏服务之后就可以创建成就和排行榜了,创建完的游戏服务,必须要发布才能够使用。
在goolge应用控制台为某一个应用添加Google Game Service成就,请参考以下官方文档:
https://developers.google.com/games/services/common/concepts/achievements
在左侧菜单选择“成就”,点击页面“添加成就”可以添加新的成就。
1)打开Google Play后台,确认登录的账号是已经或者将要发布应用的账号
2)点击所有应用->选择应用->点击获利->获利设置
3)在“服务和API”页面的“许可和应用内结算”部分,就可以找到public licensing key
如图:
参考地址:https://developer.android.com/google/play/billing/promo
登录Google Play后台,选择对应应用进入详情,选择获利—产品—促销代码,点击创建促销代码
输入 促销活动名称、开始时间、结束时间,促销类型选择应用内商品,然后选择需要参与促销的商品,输入促销代码数量,保存即可。
当到达输入当开始日期时间后,促销码就可以使用。在您的应用中:用户可以点击 Google Play 购买屏幕中付款方式旁边的向下箭头,然后点击兑换链接以输入代码,由此发起购买交易
选择兑换代码,输入对应兑换代码
注:创建促销商品的商品id为google_001,在应用内兑换时,需要点击相对应的商品(对应google商品id为google_001)弹出支付界面,然后输入兑换码才能正常兑换。
Google Play控制台的签名密钥有两种,一种是应用签名密钥,一种是上传签名密钥,他们对应的实体文件是keystore/jks文件。
上传签名密钥:上传Google Play 的aab或apk包必须使用该签名秘钥进行签名,不能使用应用签名秘钥或者其他签名秘钥,否则会提示签名错误,无法上传。
应用签名密钥:是应用最终所使用的签名密钥。虽然上传Play使用的是上传签名秘钥签名,但是正式上架对外时,Google Play会抹去原来的签名,并使用应用签名秘钥签名。无论对外发布,或者给一些平台配置如Google和Facebook,或者用于应用调试测试,都应该使用应用签名密钥
为了方便管理,建议“应用签名密钥”和“上传签名密钥”使用相同的签名密钥jks文件
说明:使用下面步骤,不包含“上传签名密钥”的配置,因为Google不允许两个签名一致,但是“更改签名密钥”时不进行“创建新的上传密钥”即可让两个签名保持一致。
首次创建应用版本会要求加入谷歌签名计划,在加入谷歌签名计划时候,默认由谷歌自行创建签名密钥,它会保存在谷歌服务器,无法访问和下载。默认方式的签名密钥文件不可访问,无法控制,不利于管理签名密钥文件和调试测试,所以建议上传自己的签名密钥。
为了方便管理,建议“应用签名密钥”和“上传签名密钥”使用相同的签名密钥jks文件
说明:使用下面步骤,不包含“上传签名密钥”的配置,因为Google不允许两个签名一致,但是“更改签名密钥”时不进行“创建新的上传密钥”即可让两个签名保持一致。
创建应用版本会默认加入Google签名计划,该计划实际内容是:由Google自行创建签名密钥,并保存在谷歌服务器,无法访问和下载,最终向用户分发应用时再由Google进行签名。默认方式的签名密钥文件不可访问,无法控制,不利于管理签名密钥文件和调试测试,所以建议上传自己的签名密钥。
注意:这一步,是应用未正式上架时可以重复操作修改的,但是正式上架后不可用再从这里修改,需要参考下一章节执行“升级密钥”操作才可更改。
具体操作同《Play控制台更改应用签名密钥》一致,最终验证“应用签名密钥证书”和“上传密钥证书”保持一致即说明配置正确。
1.研发在命令终端通过输入keytool命令获取签名密钥jks文件的证书指纹。
命令:keytool -list -v -alias ALIAS_NAME -keystore KEYSTORE_PATH
2.在Google Play控制台的,设置->应用完整性,中找到当前生效的密钥证书信息
适用应用:已上架,并且之前执行过“更改应用签名密钥”,把默认的Google签名改为自己签名文件的应用
不适用应用:
1.未上架,无需升级也可在“内部测试”中选择“更改应用签名密钥”进行更改
2.已上架,但是之前默认由Google签名(未执行过“更改应用签名密钥”)操作,界面参考下图
使用“Google生成的签名”的应用,会没有“请求升级密钥”按钮
升级注意:“请求升级密钥”操作,一年只有一次机会,无法撤销,请谨慎操作
同样是“应用完整性”页面,在“应用签名”标签里面找到“请求升级密钥”按钮,并点击
在弹出框中,【关键】首先展开“隐藏选项”,选择“所有Android版本的所有安装”选项。然后升级方式选择“从Java密钥库上传新的应用签名密钥”
按照“从Java密钥库上传新的应用签名密钥”的指示,下载PEPK文件给研发使用,研发使用指示命令生成zip文件,其中命令的黑体参数需要替换为本地对应参数,具体参考如下,最后完成“上传zip文件”,选择“升级原因”,点击“升级”。
foo.keystore:新的应用签名密钥jks文件
foo:foo.keystore文件使用的别名
upload.keystore:原应用签名密钥jks文件
upload-key-alias:upload.keystore文件使用的别名
注意:若upload.keystore使用的不是原应用签名密钥jks文件,会升级失败
在弹出框中确认升级影响目标必须是“所有Android版本上的新安装”,若不是则需要修改前面“隐藏选项”的选择。
确认升级影响目标正确后,点击“确认”完成升级。
升级之后可以在“应用完整性”的“应用签名”标签中,确认最新生效的“证书指纹”信息,也可以查看“曾用密钥”的证书指纹信息。另外升级后“请求升级密钥”按钮变为不可用状态,并且旁边会有显示上一次的升级日期
更多内容可以查看Google文档了解:
https://support.google.com/googleplay/android-developer/answer/9842756
无论是“上传自己的签名密钥”或者“升级应用签名密钥”,都会影响应用的验证,比如Google登录,Facebook登录等三方功能,所以修改后确认同步修改对应平台相关内容。
如果是未上架应用“上传自己的应用签名密钥”,更改原有对应配置即可。
如果是已上架应用“升级应用签名密钥”,为了保证旧的“应用签名密钥”用户也可以暂时使用,保留“原应用签名密钥”证书指纹相关配置,并添加新的“新应用签名密钥”证书指纹相关配置。
下面罗列一些平台需要用到签名信息的相关配置指南:
Google:Google Cloud Platform(https://console.cloud.google.com/)控制台,API和服务 -> 凭据中,添加Android类型的OAuth 2.0 客户端 ID,输入包名和新的应用签名的SHA-1证书指纹。子项目中配置应用的OAuth Client Id
Facebook:Facebook登录的“密钥散列”与应用签名有关,需要添加新的“密钥散列”。
添加签名密钥散列
Fireabse:关联应用有用到应用签名的SHA-1和SHA-256证书指纹,需要添加
手动关联GooglePlay应用
Huawei:华为应用需要配置证书指纹。
生成签名证书指纹
1.打包的时候该使用哪个签名密钥?
上传签名密钥,只有在给需要上传到Google Play任意轨道(测试或正式等)的应用包打包时使用。
其他任意时候,比如想在本地运行调试,或者本地打包测试,只要不需要上传到Google Play的,都使用应用签名密钥进行打包。
2.MD5,SHA-1,SHA-256这些证书指纹该用哪个签名密钥的?
上传签名密钥只有在上传Google Play任意轨道时候打包应用包时使用,其他任何情况都以应用签名密钥为准。所以给Google,Firebase,Facebook,Huawei等平台提供的SHA-1,SHA-256证书指纹都需要使用应用签名密钥的证书指纹。
3.什么是keystore/jks文件,怎么生成的?
二者是同一个东西,都是Android签名密钥文件,用来打包Android应用的,当前常用的是jks文件。该文件用于确保应用的唯一性及合法性,非常重要,请务必保管好该文件及相关的密码,并确保不会泄漏。
虽然可以使用JDK的keytool工具生成这两种文件,但常用的方式是开发者使用Android Studio生成jks文件,而keystore文件一般使用Eclipse生成。
4.Google Play上的应用签名密钥keystore/jks文件找不到了,能否重新生成一个跟上面相同证书指纹的签名密钥文件?如果不能又该如何处理?
不能生成指定证书指纹的签名密钥文件。Google Play上也无法下载签名密钥文件。
处理方法:
1)上传应用到任意轨道(正式或测试),从Play Store的应用页面下载应用,上面下载的应用都会使用应用签名密钥打包签名过。
2)如果想自己重新掌握keystore/jks文件,并且Play控制台中该应用未升级过应用签名密钥(每个应用只有一次升级机会),可以进行密钥升级,更换为新的keystore/jks文件信息。升级的时候务必选择“上传自己的签名密钥”,不要选择默认的“由Google Play生成。。。”,升级成功后也务必对一些平台上的配置做出相依的配置改动,否则会影响这些平台的API使用,如Google登录,Facebook登录等,具体升级请参考“升级应用签名密钥”章节操作。
5.应用打包运行之后的签名密钥,和Play上的应用签名密钥不一致会有什么后果?
通常会影响所有配置了与应用签名密钥有关信息的平台API。比如Google的Android类型OAuth ClientID使用了SHA-1,会影响谷歌登录,导致谷歌登录直接返回取消。Facebook使用的散列秘钥,影响Facebook登录。其他的还有Firebase的应用关联,Huawei的应用配置。
准备应用包:
使用上传签名密钥打包签名好应用包apk或aab。若使用应用签名密钥或其他签名密钥,会提示错误。关于签名密钥可以参考上一章节说明。
注意:推荐aab,2021年8份起新应用必须使用aab包发布应用。Play发布的apk大小限制为100MB,aab大小限制为150MB,若超出大小限制,apk包需要使用APK拓展文件obb功能,aab需要使用Play Asset Delivery功能,对应用或游戏资源进行配置,才能上传成功。
登录Google Play 控制台,选择并进入需要发布的应用。
1.选择发布的版本,根据需要可以选择内部测试,封闭测试,开放性测试,正式版。
2、若是测试轨道,可以选择测试人员并保存
3.若是开放性测试,或正式版,需要设置发布的国家。
4.创建新版本,上传应用包,保存。若之前已上传过该应用包,可以直接从内容库中选择。保存之后,点击检查发布版本。
5.在检查发布版本页面,查看所有错误警告消息,若是错误,必须按照指引完成修改。完成所有错误的修改后,回到该页面,点击 开始发布,即可完成操作,等谷歌审核通过后,即是正式完成发布。
其他说明:发布前错误提示,信息中心需要完成步骤,主要是设置应用部分,按照指引完成任务即可。
选择应用》应用内容》广告 ID进入声明设置
使用广告ID项选择 “是”,使用方式选择,“分析”,“广告或营销”,点击保存。
Facebook控制台地址:https://developers.facebook.com/
一共有五种可选的应用类型:公司、游戏、小游戏、消费者或无。当您选择应用类型后,系统会为应用提供仅适用于该应用类型的产品(如登录,分析等产品)、权限(访问用户生日性别照片等数据权限)和功能,精简应用创建流程。
1、公司类型适用于可帮助公司和组织管理公共主页、小组、活动、广告以及和广告相关素材的应用。
2、游戏类型适用于可以在 Facebook 开放平台上游玩的游戏应用。
3、小游戏类型适用于可以在 Facebook 开放平台上游玩的游戏应用。
4、消费者类型适用于整合 Facebook 登录等消费者相关产品以便为用户提供更多帐户关联体验的应用程式。
根据说明,上面的“游戏类型”是适用Facebook游戏平台上的游戏。我们推荐创建应用类型时,选择“消费者”类型,该类型包含Facebook登录,分析,应用事件,应用链接,Instagram基本显示API,分享,社交等常用的产品。
想了解所有应用类型对应可使用的产品、权限和功能,可以查看Facebook官方文档: https://developers.facebook.com/docs/apps/app-types/
进入应用控制台,点击“创建应用”。
点选择用途“打造关联体验”(对应消费者应用类型),点击“继续”。
填写“应用显示名”,和“应用联系邮箱”,点击“创建应用”。
“创建应用”完成以后会立即进入到该应用的控制台页面。
如果选择应用类型之后,在产品添加中没有找到自己需要的产品,或者当前应用类型提供的权限或功能无法满足需求,可以移除该应用的应用类型,或者重新创建新的应用类型的应用。移除应用类型之后,就是无指定类型的应用了,可以选择添加任何产品和申请任意权限及功能。
注意:移除类型后是无法再次指定应用类型的。
下面介绍如何移除应用类型:
进入目标应用控制台页面,点击“产品 +”,往下滑,找到“想找其他产品和权限?”卡片,点击“移除应用类型”按钮。
输入该账号的密码,点击“提交”
操作完成之后,在应用控制台中可以看到,已经不再显示应用类型了,并且可添加产品中,显示了所有的产品,权限页面也可以看到显示所有权限。
创建完应用编号后,需要添加产品。点击左侧菜单栏中的“产品+”按钮,找到所需的产品,点击该产品卡片的“设置”按钮进行添加。(接下来以必接的登录功能为示例,另外在这里只需要对产品进行设置,所以会忽略其他非设置步骤)。
点击“设置”进入产品添加的向导(菜单栏“快速启动”方式设置),选择添加的产品支持的平台(此处以Android平台为例)
图:选择产品支持的平台
选择平台后,进入平台的设置页面,在这个页面可以在上面的tab中切换不同的平台进行设置,第1、2步是SDK集成,由开发人员完成,进入第三步设置项目信息。
输入应用包名,和默认活动类的完整路径(如果使用DeepLink功能,需要填入DeepLink功能响应的Activity类路径,否则可以填入首个启动的Activity,例如MainActivity即可),点击“Save”保存。
图:填写Android项目信息
点击保存,如果你的应用在Google Play没有上架,会弹出下图“Google Play包名校验遇到困难”的对话框,点击“使用此包名”即可。
图:Google Play包名验证出现困难
签名秘钥散列需要开发技术同事协助获取,获取到的字符串是包含 28 个字符的唯一密钥散列,获取方式参考Facebook官方文档。将生成的秘钥散列添加到“秘钥散列”下面的文本框,如果测试环境和正式环境不一样的签名文件,这里可以添加多个。添加后点击“Save”保存。
具体操作过程可以参考以下任何一种方式,他们都是相同的指引,然后按指引生成“发布密钥散列”进行添加:
1.Facebook控制台 -> 产品 -> Facebook登录 -> 快速启动 -> Android平台 -> 添加开发和发布密钥散列
2.Facebook登录接入文档,第6节-为应用提供开发和发布密钥散列:
https://developers.facebook.com/docs/facebook-login/android#6
根据需求,如果需要启用单点登录,打开单点登录,保存进入下一步。
图:启用单点登录
Facebook的基础配置已经完成,接下来的6、7、8、9、10是开发人员的集成步骤,集成参考文档《WING SDK使用指南(Android).doc》,如果需要进行其他设置,请参考后续章节。
在左侧菜单点开“设置->基本”,将应用编号(Facebook App id)提供给技术配置到项目中,如果需要礼物功能,需要将应用密钥(App Secret配置到SDK后台,关于礼物的配置参考后续章节。如果需要使用游戏邀请功能,必须在设置中设置应用的类别为“游戏”
往下滑动,可以看到上面添加的Android平台的配置,可以在这里修改配置。如果需要添加其他平台,可以点击“+ 添加平台”按钮添加(如果添加产品的时候,针对某个平台进行了配置,会自动添加了该平台)。
如果需要修改相关产品的配置,在左侧菜单中的“产品”中找到相应的产品,“设置”展示所有设置,“快速启动”是包含了向导的设置。
图:产品配置修改
添加步骤如下:
在Facebook控制台页面,在左侧“用户身份”菜单展开,下面有两个,“用户身份”和“测试用户”。“用户身份”是配置哪些用户拥有编辑和查看应用的权限;“测试用户”用来测试不同应用功能的临时性的 Facebook 帐户。
图:用户身份配置
切换到线上模式,必须提供“隐私权政策网址”和“数据删除信息”。
“隐私权政策网址”必须提供有效的地址,在Facebook登录页面和应用详情页面会显示该入口。
“数据删除信息”,Facebook为了符合通用数据保护条例 (GDPR),可获取用户数据的应用程序必须执行以下某项操作:
1.执行数据删除请求回调。
2.为用户提供含有明确说明的网址,介绍如何使用第三方网站或工具删除数据。第三方网站可能是应用程序隐私政策的相关部分。
用户在Facebook设置中移除应用时候,会有提醒用户移除数据的相关说明。
第一种方式需要按照官方文档要求提供接口给Facebook调用。我们建议选择第二种方式,提供数据删除说明地址,介绍如何删除数据。
图:切换线上模式提示框
图:选择 数据删除说明网址
图:选择 数据删除说明网址
VK目前必接的功能包括登录,登出,显示用户名称以及头像,group和邀请。
创建VK应用,创建地址如下(如果还没注册,需要先注册):https://new.vk.com/editapp?act=create
title中填入应用的名称, 点击Connect Application按钮,并按照提示创建应用。填写关键信息,主要是填写Information和Settings部分:
上图的SDK settings中安卓部分需要填写应用的包名和指纹,指纹的获取方式请参考1.1 配置应用程序证书指纹(去掉冒号),也可以参考:https://new.vk.com/dev/android_sdk,或者与开发人员联系获取。
获取vk app id提供给开发人员并且注意设置应用状态为可见
VK的邀请功能是对接VK渠道官方要求必须接入的,而邀请功能只能在审核通过的应用中使用,所以需要将配置好的应用提审。
这里需要注意的是:
VK的应用审核比较严格,首先必须是游戏应用,并且需要全部翻译成俄文,不能是demo,有人工审核。
如果需要测试邀请,原则需要审核过的应用,在应用审核通过之前,使用apps.sendRequest接口,type为request来测试,测试者需要双方是好友,都是管理员并且都已经安装过该应用。
对接VK邀请功能业务流程图如下:
控制台提审大致步骤如下:
在Firebase后台配置后,会得到两个文件,一个是google-services.json,需要给研发配置到游戏中去;另一个是Firebase服务器秘钥,需要配置到SDK后台
在浏览器中打开Firebase控制台点击添加已经在Google API存在的项目
点击输入项目名称输入框时,会弹出已经存在Google Api的项目列表,选择对应项目并继续
选择配置Google Analytics账号,点击添加Firebase按钮
点击继续,则项目创建完成。
进入项目,点击对应应用类型
输入软件包名、应用名、SHA-1指纹,点击注册应用
注册应用,进入下一步,下载google-services.json。将下载的配置文件复制到项目模块文件夹,通常为 app/。
google-services.json文件可以随时重新下载,可以在设置,常规,选中项目后,下载某个项目的google-services.json文件,如果包名改变,或者其他配置更新,则需要重新下载google-services.json文件,然后更新到项目中去。
在项目详情左侧菜单中点击设置按钮进入设置页面,选中云消息传递标签,在页面上可以找到服务器秘钥(请使用新版的服务器秘钥)。
1、登录到Firebase
2、单击设置图标,然后选择项目设置
3、单击集成 选项卡
4、在Google Play卡上,点击链接,如果您的项目已被链接,则会看到“ 管理”,如果您没有Google Play开发者帐户,则可以点击升级和链接以创建一个新帐户。
说明:必须链接到Google Play账号才能查看Android应用的in_app_purchase和订阅事件。需使用主账号进行关联
已关联Google Play账号的的项目,如若继续添加应用,则需要手动关联Google Play应用
然后点击添加SHA-1 、SHA-256指纹查找方式为:在googleplay后台–设置–应用签名—-应用签名密钥证书,SHA-1、SHA-256指纹。
然后需要重新下载最新的google-services.json配置文件,给到研发进行更新
注:应用不需要上架正式版,但是需要至少上架一个内测版本才能关联成功
参考:https://firebase.google.com/docs/analytics/debugview?authuser=0
要在 Android 设备上启用 Analytics“调试”模式,请执行以下命令:
1 2 |
adb shell setprop debug.firebase.analytics.app package_name |
例如:adb shell setprop debug.firebase.analytics.app com.ghw.sdk2
“调试”模式将保持启用状态,直至您通过执行以下命令明确停用“调试”模式:
1 2 |
adb shell setprop debug.firebase.analytics.app .none. |
开启调试后,打开管理后台,选择项目–分析–DebugView,能够看到目前正在调试的设备,以及上传的事件。
注意:为了防止测试和开发影响测量值,在调试模式下记录的事件将从总体 Analytics 数据中排除,并且不会包含在每日 BigQuery 导出报告中。
注册一个Twitter账号,打开Twitter开发者页面,如果您的Twitter账号不是开发者账号,还需要将Twitter账号注册成为开发者账号。进入My Apps页面,可管理应用。如果还没有应用,点击“Create New App”进入创建应用界面,填写相关信息新建应用。
新建应用后,点击应用列表中的应用,可以查看应用的详情。
点开“Keys and Access Tokens”标签可以看到ConsumerKey和ConsumerSecret
将Twitter中新建应用的consumeKey和ConsumeSecret配置到WINGSDK后台。选中应用→设置→登录平台→添加Twitter登录平台,在“平台应用ID”中填写consumeKey,在“公钥”中填写consumeSecret。
打开Instagram开发者页面,注册账号并登陆。点击“Manage Clients”标签打开应用列表,点击“Register a New Client”新建一个客户端。
在新建客户端的页面填写相关信息提交即可完成创建。
回到“Manage Clients”页面,点击刚刚新建的客户端可以查看详情,在这里可以看到Client ID和Client Secret。
新建的客户端的状态是“Sandbox”,在这种状态下,所有参与测试的人员都需要添加到“Sandbox”才能参与测试,添加用户到“Sandbox”的方法如下:打开“Sandbox”标签页面,输入邀请的用户名,用户名不是邮箱,一般用户名是注册邮箱@符号的前部分。注意,添加后一定要保存才能生效。保存后通知被邀请人接受邀请,可在“Sandbox Invites”看到邀请记录,接受邀请后的用户可以测试登录。
应用如果完成了测试要准备上线,需要将应用发布为正式状态,在“permissions”标签下,点击“Start a submission”进行权限申请。
在下一步选择“My app allows people to login with Instagram and share their own content.”,填写相关信息,这一步需要一个视频演示链接,完成提交后等待审核即可。
AiHelp官方支持地址:
https://aihelp.net/elva/FAQ/FAQList.aspx?l=zh_CN&SectionID=0&pf_app_id=5
AiHelp 官方后台配置文档地址(页面内有下载链接介绍文档pdf):
https://aihelp.net/elva/FAQ/FAQList.aspx?SectionID=3392&LanguageID=5&pf_app_id=5&kmContentId=122760
已下是常用功能配置说明,需更多更详细请到官方下载最新pdf文档
弹出界面,输入应用名称,点击“Add”完成新建 如下图
选择中刚刚新建应用,会切换到应用下内容。
如果不在需要app下,需按照 7.1.2 切换app
左侧“设置”-> “应用”-> “+”如下图位置
设置语言后app应用Aihelp部分功能支持多语言。
左侧“设置”-> “语言”-> “添加语言”如下图位置
点击设置后,弹出语言列表,可以增加需要语言
此功能配置是在app 应用中FAQ相关功能
左侧“机器人”->“常见问题”-> “[分类]”-> “新增分类+” 如下图位置
弹出新增页面,输入名称和顺序编号后保存
分类列表会出现新建分类,左侧栏也会出现对应分类
在分类列表中,点击如下图按钮
弹出详情页面,可做对应修改。其中中文,英文对应aihelp sdk显示的语言内容。
在左侧栏选择FAQ分类->“新增FAQ”,如下图
弹出新增页面
在FAQ列表中,点击如下图按钮
弹出详情页面,其中语言对应aihelp sdk显示的语言内容。
如,在热门问题分类下,创建了一个信息,然后发布流程 左侧“机器人”-> “常见问题”-> “发布” 如下图位置
此功能是app应用中运营界面功能
左侧“运营支持”-> “运营模块”-> “[Tab设置]”-> “新增Tab” 如下图位置
弹出新增页面
左侧“运营支持”-> “运营模块”-> “[Tab设置]”-> 编辑,如下图
左侧“运营支持”-> “运营模块”-> “[Tab列表]”,选择刚才创建的tab1,点击新建,如下图
弹出新增页面
在文章列表中,点击如下按钮
弹出详情页面,其中语言对应aihelp sdk显示的语言内容。
Tab要在app应用中显示需要发布,每次修改都需要发布。
左部“运营支撑”-> “运营模块”-> 需要发布的Tab -> “发布” 如下图位置
选择平台、语言后发布
发布后,效果图如下
另外还包含欢迎语设置,主题设置等等功能。
详情请参考:
https://aihelp.net/FAQ/#/AIhelp%20Support/app/zh_CN/EB5AE263D8AB85A4/35E3B9E6396692FE/396CD31FF6A33A5D
1、登录流程
参考:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/dev-process-0000001050443773
2、支付流程
参考:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/dev-process-0000001050033070
1)注册成为开发者
2)在 AppGallery Connect创建项目、创建应用
A、 如果没有项目,则创建项目,我的项目—添加项目,输入项目名称,确认,则项目创建成功。
点击确定完成后,点击添加应用,跳转添加应用界面
注:需要集成支付能力,包名后缀必须为.HUAWEI或者.huawei
B、如果已存在项目,则可在项目下,创建具体的应用,一个项目下可创建多个应用
3)生成签名证书指纹
keytool -list -v -keystore C:\TestApp.jks
执行结果如下:
说明:C:\TestApp.jks表示应用签名文件,CP替换成自己的签名文件即可。
4)在“我的项目”中找到刚创建的项目项目,找到对应的应用,配置SHA256证书,如下图所示
5)打开相关服务
5.1)打开API权限服务,在“项目设置”->“API管理”菜单中,开启相应服务,如下图所示:
登录服务为 Auth Service,支付服务为 In-App Purchases,其他权限为创建应用默认开启的权限,可以忽略。
此操作为项目级别操作,操作完后,项目下所有应用都会有此权限。
5.2)配置支付参数
① 在我的项目中,选择具体某个应用,在左侧导航栏选择“盈利 > 应用内支付服务”,点击“设置”。
说明:如果首次配置会弹出签署协议弹框,其中订阅通知地址,可不填写
1)获取agconnect-services.json文件
1)打开“ AppGallery Connect”->“我的应用”->“运营”菜单,如下:
2)点击“添加商品”,如下图所示:
填写商品相关的商品信息,点击保存即可,这里选择“消耗型”商品。
3)创建商品后,默认状态为失效状态,需要点击激活按钮:
点击后,提示此商品将被开放购买,点击确认。
参考:https://developer.huawei.com/consumer/cn/doc/distribution/app/agc-tester_account_mgt
接入完支付sdk后,华为提供沙盒支付测试模式。打开华为AppGallery Connect管理后台,选择用户与访问,选择左侧沙盒测试栏目下的测试账号,点击新增,输入华为账号即可
注:测试帐号必须填写已注册、真实的华为帐号。
添加完成后,使用此沙盒测试账号,支付时,可以直接进行沙盒支付测试
1)接入流程
2)后台开启分析服务
a、如果没有华为开发者联盟帐号,需要先注册帐号并通过实名认证。详细操作请参见帐号注册认证。
b、参见创建项目和在项目中添加应用完成应用的创建。
c、登录AppGallery Connect网站,点击“我的项目”图标
d、选择需要查看分析数据的应用。
e、点击“华为分析”下的任意菜单,并点击“启动分析服务”按钮可开通分析服务。(注:需拥有产品管理权限才可开通服务)
f、进入“项目接入设置”页面,设置数据存储位置、数据共享设置、支持行业分析、标识用户、时区、货币、设置用户数据留存时间、设置自然周定义后,点击“完成”,即完成Analytics Kit 服务开通。对于支持行业分析,如果您已经设置应用的分类情况,则默认开启
g、开启后,选择项目设置–我的项目–应用,下载最新的配置文件,给到研发进行更新
3)调试
1、开启/停用调试模式
1 2 |
adb shell setprop debug.huawei.hms.analytics.app package_name |
调试模式打开后,所有事件将实时上报,在应用调试界面可实时查看上报的数据。
说明:请将命令行中的“package_name”字段替换为您的应用包名
数据成功上报后,“华为分析 > 应用调试”页面会展示出数据,如下图
2、您可执行如下命令行,停用调试模式
1 2 |
adb shell setprop debug.huawei.hms.analytics.app .none. |
参考:https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-apms-viewdata
进入“质量->性能管理”,如果APM服务未开通,请点击“立即开通”按钮,开通APM服务
说明:
由于开通服务时可能需要设置数据存储位置,设置数据存储位置后会刷新agconnect-services.json文件里的配置。如果您开通服务时设置了数据存储位置,在开通完成后您需要重新下载agconnect-services.json文件并集成到您的工程中。