一、前言
随着国内手游版号申请难度的增加,以及防沉迷等一系列政策的影响,很多国内开发者纷纷开始寻求海外发行之路。那么手游出海首要的是需要一套适合海外发行和运营的手游SDK联运系统。
本系列我们就来开发一套这样的SDK,我们暂且称这套SDK为UGSDK。
整个UGSDK项目,暂时可以分为三大部分——Android客户端SDK部分、iOS客户端SDK部分以及服务端部分(目前不考虑H5游戏部分)。
本篇主要介绍UGSDK项目中Android客户端部分中对外提供的统一API调用接口。
二、API调用接口设计
根据我们之前定的接口设置原则,不管我们SDK内部的功能有多繁杂, 我们对于游戏层提供的API接口调用都需要足够简单。
在UGSDK中, 我们封装了统一的API调用接口类:UGPlatform。
public class UGPlatform {
private static UGPlatform instance;
public static UGPlatform getInstance() {
if (instance == null) {
instance = new UGPlatform();
}
return instance;
}
/**
* 初始化, 需要在游戏启动的时候调用,一般在游戏Activity的onCreate中调用
* @param context
* @param params
* @param listener
*/
public void init(Activity context, UGInitParams params, UGSDKListener listener) {
SDKManager.getInstance().init(context, params, listener);
}
/**
* 登陆接口,调用之后, 弹出SDK的登陆界面
* @param activity
*/
public void login(Activity activity) {
SDKManager.getInstance().login(activity);
}
/**
* 登出接口, 调用之后, 清除当前登录状态
* @param activity
*/
public void logout(Activity activity) {
SDKManager.getInstance().logout(activity);
}
/**
* 支付接口, 调用之后,弹出Google支付界面
* @param activity
* @param order
*/
public void pay(Activity activity, UGOrder order) {
SDKManager.getInstance().pay(activity, order);
}
/**
* 数据上报,需要在创建角色、进入游戏、等级升级、退出游戏等几个地方调用
* @param activity
* @param roleData
*/
public void submit(Activity activity, UGRoleData roleData) {
SDKManager.getInstance().submitGameData(activity, roleData);
}
/**
* 在游戏Activity的onResume中调用
* @param activity
*/
public void onResume(Activity activity) {
SDKManager.getInstance().onResume(activity);
}
/**
* 在游戏Activity的onDestroy中调用
* @param context
*/
public void onDestroy(Context context) {
SDKManager.getInstance().onDestroy(context);
}
}
同时,我们对于每个调用事件的结果, 需要通知给游戏层, 我们抽象出一个UGSDKListener监听器接口,让游戏层来实现:
public interface UGSDKListener {
void onInitFailed(int code, String msg);
void onInitSuccess();
void onLogout();
void onLoginSuccess(UGUser user);
void onLoginFailed(int code, String msg);
void onUpgradeSuccess(UGUser user);
void onPaySuccess(UGOrder order);
void onPayFailed(int code, String msg);
void onExitSuccess();
}
三、游戏层调用示例
按上面的设计, 如果最终我们提供给游戏研发SDK包之后, 研发就可以按照如下方式快速接入了。 假如MainActivity是游戏的当前主Activity:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//
Button button_login = (Button) findViewById(R.id.button_login);
button_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clickLogin();
}
});
Button button_pay = (Button) findViewById(R.id.button_pay);
button_pay.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clickPay();
}
});
Button button_createRole = (Button)findViewById(R.id.button_createRole);
button_createRole.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
submitGameData(UGRoleData.TYPE_CREATE_ROLE);
}
});
Button button_enterGame = (Button)findViewById(R.id.button_enterGame);
button_enterGame.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
submitGameData(UGRoleData.TYPE_ENTER_GAME);
}
});
Button button_logout = (Button)findViewById(R.id.button_logout);
button_logout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
try{
UGPlatform.getInstance().logout(MainActivity.this);
}catch(Exception e){
e.printStackTrace();
}
}
});
}
private void initSDK() {
String appID = "1";
String appKey = "1111111";
UGPlatform.getInstance().init(this, new UGInitParams(appID, appKey, UGInitParams.ORIENTATION_LANDSCAPE), new UGSDKListener() {
@Override
public void onInitFailed(int code, String msg) {
}
@Override
public void onInitSuccess() {
}
@Override
public void onLogout() {
}
@Override
public void onLoginSuccess(UGUser user) {
Log.d("UGSDKDemo", "sdk login success."+user.getUid());
}
@Override
public void onLoginFailed(int code, String msg) {
Toast.makeText(MainActivity.this, "登陆失败", Toast.LENGTH_LONG).show();
}
@Override
public void onUpgradeSuccess(UGUser user) {
}
@Override
public void onPaySuccess(UGOrder order) {
}
@Override
public void onPayFailed(int code, String msg) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_LONG).show();
}
});
}
@Override
public void onExitSuccess() {
}
});
}
private void clickLogin() {
UGPlatform.getInstance().login(this);
}
private void clickPay() {
UGOrder order = new UGOrder();
order.setProductID("1");
order.setProductName("测试商品");
order.setProductDesc("测试商品描述");
order.setRoleID("1");
order.setRoleName("test_role_1");
order.setRoleLevel("1");
order.setVip("1");
order.setServerID("2");
order.setServerName("test_1");
order.setPrice(100);
order.setCurrency("CNY");
order.setCpOrderID(System.currentTimeMillis()+"");
order.setExtra("extra data");
UGPlatform.getInstance().pay(this, order);
}
private void submitGameData(int type) {
UGRoleData data = new UGRoleData();
data.setType(type);
data.setServerID("2");
data.setServerName("test_1");
data.setRoleID("1");
data.setRoleName("test_role_1");
data.setRoleLevel("1");
data.setVip("1");
data.setCreateTime(System.currentTimeMillis()/1000);
data.setLastLevelUpTime(data.getCreateTime());
UGPlatform.getInstance().submit(this, data);
}
protected void onResume() {
super.onResume();
UGPlatform.getInstance().onResume(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
UGPlatform.getInstance().onDestroy(this);
}
}
可见这样设计之后, 整个SDK接口对游戏来说,调用是及其简单的了。
好了,本篇我们介绍了在UGSDK中尽可能设计出简单的对外API接口。
网友评论