cocos2d-x集成短信驗證sdk

許多遊戲在註冊的時候都會綁定手機號碼,我這裏就選擇了一個比較簡單的sdk
一.SDK下載地址
android下載地址:http://www.mob.com/#/downloadDetail/SMS/android
ios下載地址:http://www.mob.com/#/downloadDetail/SMS/ios

二.ios環境搭建

1.下載下來解壓開以後
這裏寫圖片描述

 - SMSSDK:短信驗證碼SDK,包括靜態庫和本地化文件。使用時直接將這個文件夾拖入工程。

 - SMSSDKDemo:示例Demo 。

2.把SMS_SDK文件夾拖入到項目的ios目錄下
這裏寫圖片描述
3.添加依賴項
這裏寫圖片描述

  • 必要
    libz.dylib
    libicucore.dylib
    MessageUI.framework
    javascriptcore.framework
    libstdc++.dylib

  • 可選
    AddressBook.framework (通訊錄功能需要)
    AddressBookUI.framework(通訊錄功能需要)

三.android環境搭建

  • 下載下來解壓
    這裏寫圖片描述
    其中“SMSSDK”目錄存放的是短信SDK的全部內容,“SMSSDKSample”中保存了短信SDK的演示項目代碼,而“SMSSDKSample.apk”則是“SMSSDKSample”的可執行程序。
  • 把SMSSDK/libs文件夾拷貝到 proj.android,與原有的libs文件夾合併
  • 把項目導入到Eclipse
    然後分別右鍵這三個jar包->Build Path->
    這裏寫圖片描述

這裏很重要,不然so包不能加載到apk中
打開Android.mk文件在對應的地方添加以下代碼(‘//’標記的是添加的代碼)

LOCAL_PATH := $(call my-dir)
LOCAL_LDLIBS += -llog

//include $(CLEAR_VARS)
//LOCAL_MODULE := mysmssdk
//LOCAL_SRC_FILES := ../libs/armeabi/libsmssdk.so 
//include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := cocos2dlua_shared
LOCAL_MODULE_FILENAME := libcocos2dlua

.....

hellolua/main.cpp

//LOCAL_SRC_FILES := $(LOCAL_LIST:$(LOCAL_PATH)/%=%)

LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/../../Classes \
$(LOCAL_PATH)/../../Classes/ide-support \

.....

# _COCOS_LIB_ANDROID_BEGIN
# _COCOS_LIB_ANDROID_END

//LOCAL_STATIC_LIBRARIES := mysmssdk

include $(BUILD_SHARED_LIBRARY)
  • 配置AndroidManifest.xml

    打開您項目的“AndroidManifest.xml”,在其中添加如下的權限:

<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  • 然後打“Application.mk”下添加如下activity:
<activity
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="stateHidden|adjustResize"/>
    -

四.下面開始代碼部分

  • 創建一個類MobUtils(MobUtils.h/MobUtils.cpp/MobUtils.mm)
    這裏寫圖片描述

    android 在src.org.cocos2dx.cpp目錄下創建一個java類MobUtils.java

package org.cocos2dx.cpp;

import cn.smssdk.EventHandler;
import cn.smssdk.SMSSDK;
import android.app.Activity;
import android.util.Log;

public class MobUtils {

    private static MobUtils instance = null;
    private static Activity activity = null;
    private static EventHandler eventHandler = null;

    public static native void onMobCodeSaved(int isOk);  // 0 or 1 (返回結果到c++層)

    public static MobUtils getInstance(){
            if(instance == null){
                instance = new MobUtils();
            }
            return instance;
        }
    // 初始化
    public void init(Activity activity){
        Log.e("SMSSDK", "---------->init");
        MobUtils.activity = activity;
        SMSSDK.initSDK(activity,"xxxx","xxxxx");

        if(MobUtils.eventHandler!=null){
            SMSSDK.unregisterEventHandler(eventHandler);    
        }
        MobUtils.eventHandler=new EventHandler(){
            @Override
            public void afterEvent(int event, int result, Object data) {
                if (result == SMSSDK.RESULT_COMPLETE) {
                //回調完成
                    if (event == SMSSDK.EVENT_SUBMIT_VERIFICATION_CODE) {
                        //提交驗證碼成功
                        Log.e("SMSSDK", "---------->commitMobCode 回調   提交驗證碼成功");
                        MobUtils.onMobCodeSaved(1);
                        return;
                    }else if (event == SMSSDK.EVENT_GET_VERIFICATION_CODE){
                        //獲取驗證碼成功
                        Log.e("SMSSDK", "---------->commitMobCode 回調   獲取驗證碼成功");
                    }else if (event ==SMSSDK.EVENT_GET_SUPPORTED_COUNTRIES){
                        //返回支持發送驗證碼的國家列表
                        Log.e("SMSSDK", "---------->commitMobCode 回調   返回支持發送驗證碼的國家列表");
                    } 
                }else{                                                                 
                    ((Throwable)data).printStackTrace(); 
                }
                Log.e("SMSSDK", "---------->commitMobCode 回調   驗證失敗");
                MobUtils.onMobCodeSaved(0);
            } 
        }; 
        SMSSDK.registerEventHandler(eventHandler); //註冊短信回調

    }
    static public void getMobCode(String country, String phone){
        SMSSDK.getVerificationCode(country,phone);
        Log.e("SMSSDK", "---------->getMobCode");
        Log.e("SMSSDK", country);
        Log.e("SMSSDK", phone);
    }
    static public void commitMobCode(String country, String phone, String code){
        Log.e("SMSSDK", "---------->commitMobCode");
        Log.e("SMSSDK", country);
        Log.e("SMSSDK", phone);
        Log.e("SMSSDK", code);
        SMSSDK.submitVerificationCode(country,phone,code);
    }
}

-IOS在MobUtils.mm中初始化sdk

void MobUtils::init(){
    [SMSSDK registerApp:@"xxxx" withSecret:@"xxxx"];
}
  • IOS在MobUtils.mm中獲取驗證碼
void MobUtils::getMobCode(const char * phoneNumber){
    [SMSSDK getVerificationCodeByMethod:SMSGetCodeMethodSMS phoneNumber:[NSString stringWithUTF8String:phoneNumber] zone:@"86" customIdentifier:@"" result:^(NSError *error) {
        //注意區號和手機號碼前面都不要加“+”號,有的開發者喜歡這樣寫,@“+86”,這種是錯誤的寫法
        if (!error) {
            NSLog(@"獲取驗證碼成功");
        } else {
            NSLog(@"錯誤嗎:%zi,錯誤描述:%@",error.code,error.debugDescription);
        }
    }];
}

-IOS在MobUtils.mm中提交驗證碼

bool MobUtils::commitMobCode(const char * code,const char * phoneNumber,MobCallback call){
    m_CallBackfunc = call;
    [SMSSDK commitVerificationCode:[NSString stringWithUTF8String:code] phoneNumber:[NSString stringWithUTF8String:phoneNumber] zone:@"86" result:^(NSError *error) {
        if (!error) {
            NSLog(@"驗證成功");
            m_CallBackfunc(true);
        } else{
            NSLog(@"驗證失敗");
            m_CallBackfunc(false);
        }
    }];
    return false;
}

MobCallback的原型是:

typedef std::function<void(bool)> MobCallback;

驗證的結果調用的回調函數

android 需要c++調java代碼


#include "MobUtils.h"

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "platform/android/jni/JniHelper.h"
#include <jni.h>
#define JAVA_CLASS              "org/cocos2dx/cpp/MobUtils"
#define JAVA_FUNC_GETMOBCODE   "getMobCode"
#define JAVA_FUNC_COMMITMOBCODE   "commitMobCode"
#endif

MobUtils * MobUtils::m_sInstance = NULL;

MobUtils::MobUtils(){
    m_func = nullptr;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    Director::getInstance()->getEventDispatcher()->addCustomEventListener("onMobCodeSaved", [=](EventCustom* eve)
    {
        int * isok = (int *)eve->getUserData();
        log("----->Mob onMobCodeSaved %d",*isok);
        if (m_func != nullptr)
        {
            m_func((bool)(*isok));
        }
    });
#endif
}
MobUtils::~MobUtils(){
    if (m_sInstance) {
        delete m_sInstance;
        m_sInstance = NULL;
    }
}
MobUtils * MobUtils::getInstance(){
    if (!m_sInstance) {
        m_sInstance = new MobUtils();
        m_sInstance->init();
    }
    return m_sInstance;
}
void MobUtils::getMobCode(const char * phoneNumber){
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    JniMethodInfo info;
    bool ret = JniHelper::getStaticMethodInfo(info, JAVA_CLASS, JAVA_FUNC_GETMOBCODE,"(Ljava/lang/String;Ljava/lang/String;)V");
    if (ret)
    {
        log("---->cell getMobCode succeed");
        jobject para1 = info.env->NewStringUTF("86");
        jobject para2 = info.env->NewStringUTF(phoneNumber);
        info.env->CallStaticVoidMethod(info.classID, info.methodID,para1,para2);
    }
#endif
}
bool MobUtils::commitMobCode(const char * code,const char * phoneNumber,MobCallback call){
    m_func = call;
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
    JniMethodInfo info;
    bool ret = JniHelper::getStaticMethodInfo(info, JAVA_CLASS, JAVA_FUNC_COMMITMOBCODE,"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
    if (ret)
    {
        log("---->cell commitMobCode succeed");
        jobject para1 = info.env->NewStringUTF("86");
        jobject para2 = info.env->NewStringUTF(phoneNumber);
        jobject para3 = info.env->NewStringUTF(code);
        info.env->CallStaticVoidMethod(info.classID, info.methodID,para1,para2,para3);
    }
#endif
    return false;
}
void MobUtils::init(){

}
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
extern "C"
{
    void Java_org_cocos2dx_cpp_MobUtils_onMobCodeSaved(JNIEnv* env, jobject thiz, jint isOk)
    {
        //std::string strPath = JniHelper::jstring2string(path);

        Director::getInstance()->getEventDispatcher()->dispatchCustomEvent("onMobCodeSaved", &isOk);
    }
}
#endif
//--------------------------------------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章