許多遊戲在註冊的時候都會綁定手機號碼,我這裏就選擇了一個比較簡單的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
//--------------------------------------------------