美文网首页
手游海外SDK实战——Android客户端之接口调用

手游海外SDK实战——Android客户端之接口调用

作者: U8SDK | 来源:发表于2021-02-23 18:48 被阅读0次

一、前言

随着国内手游版号申请难度的增加,以及防沉迷等一系列政策的影响,很多国内开发者纷纷开始寻求海外发行之路。那么手游出海首要的是需要一套适合海外发行和运营的手游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接口。

相关文章

网友评论

      本文标题:手游海外SDK实战——Android客户端之接口调用

      本文链接:https://www.haomeiwen.com/subject/kddfxltx.html