许多游戏在注册的时候都会绑定手机号码,我这里就选择了一个比较简单的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
//--------------------------------------------------