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
//--------------------------------------------------
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值