您的位置:首页 > 移动开发 > Cocos引擎

cocos2d-x集成短信验证sdk

2015-12-28 20:23 435 查看
许多游戏在注册的时候都会绑定手机号码,我这里就选择了一个比较简单的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
//--------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x android sdk ios