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.下载下来解压开以后
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文件在对应的地方添加以下代码(‘//’标记的是添加的代码)
配置AndroidManifest.xml
打开您项目的“AndroidManifest.xml”,在其中添加如下的权限:
然后打“Application.mk”下添加如下activity:
-
四.下面开始代码部分
创建一个类MobUtils(MobUtils.h/MobUtils.cpp/MobUtils.mm)
android 在src.org.cocos2dx.cpp目录下创建一个java类MobUtils.java
-IOS在MobUtils.mm中初始化sdk
IOS在MobUtils.mm中获取验证码
-IOS在MobUtils.mm中提交验证码
MobCallback的原型是:
验证的结果调用的回调函数
android 需要c++调java代码
一.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 //--------------------------------------------------
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件