(一)集成微信:
1、先到微信官网下载IOS和Android最新的SDK:IOS和Android的微信SDK下载地址
2、前期准备工作和配置环境:
以下引用自官网: IOS和Android微信环境配置
1.向微信注册你的应用程序id
请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将获得AppID,可立即用于开发。但应用登记完成后还需要提交审核,只有审核通过的应用才能正式发布使用。
2.下载微信终端SDK文件
SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个。
请前往“资源下载页”下载最新SDK包
3.搭建开发环境
[1] 在XCode中建立你的工程。
[2] 将SDK文件中包含的 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个文件添加到你所建的工程中(如下图所示,建立了一个名为Test 的工程,并把以上三个文件添加到Test文件夹下)。
(注:请使用xCode4.5及以上版本)
[3] 在你的工程文件中选择Build Setting,在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h 三个文件所在位置(如下图所示)。
[4] 在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id(如下图所示)。
Xcode设置URL scheme
【Android的环境配置】
1.申请你的AppID
请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。
2.下载微信终端开发工具包
开发工具包主要包含3部分内容:(其中,只有libammsdk.jar是必须的)
- - libammsdk.jar(每个第三方应用必须要导入该sdk库,用于实现与微信的通信)
- - API文档(供开发者查阅使用)
- - 界面小工具源码(封装了界面表现的工具类,以及一些界面风格)
请前往“资源下载页”下载最新SDK包
3.搭建开发环境
[1] 在Eclipse中建立你的工程。
[2] 在工程中新建一个libs目录,将开发工具包中libs目录下的libammsdk.jar复制到该目录中(如下图所示,建立了一个名为SDK_Sample 的工程,并把jar包复制到libs目录下)。
[3] 右键单击工程,选择Build Path中的Configure Build Path...,选中Libraries这个tab,并通过Add Jars...导入工程libs目录下的libammsdk.jar文件。(如下图所示)。
在你需要使用微信终端API的文件中导入相应的类。
import com.tencent.mm.sdk.openapi.WXTextObject;
注意
如果需要混淆代码,为了保证sdk的正常使用,需要在proguard.cfg加上下面两行配置:
-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}
由于要实现跨平台的需要(Android和IOS),所以接口定义如下:
SocialUtils.h头文件
// 一定要先引入"cocos2d.h"头文件,不然会包找不到<jni.h> #include "cocos2d.h" #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include <jni.h> #include "platform/android/jni/JniHelper.h" #include <android/log.h> #endif // 一定要加上这个命名空间不然在Android工程里编译的时候会编译不通过, // 因为像JniMethodInfo、JniHelper这些类是在cocos2d这个命名空间里 USING_NS_CC; class SocialUtils { public: static void registerWeixin(char* appID); // 注册微信 static void shareToWeixin();// 分享内容到微信 static void shareToFacebook();// 分享内容到Facebook static void destroy();// 释放资源 public: #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // 判断如果是Android系统才会有这几个方法 // Android static void registerWeixinForAndroid(char* appID); static void shareToWeixinForAndroid(); static void shareToFacebookForAndroid(); static void destroyForAndroid(); #endif #if(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)// 判断如果是IOS系统才会有这几个方法 // IOS static void registerWeixinForIOS(char* appID); static void shareToWeixinForIOS(); static void shareToFacebookforIOS(); static void destroyForIOS(); public: static void setUIViewController(void* viewController); #endif };
看到这里可以发现,有三套基本一样的接口,这个主要是本人为了方便而做的一个妥协。用过Cocos2d-x开发的童鞋应该都知道,如果想用C++写一套统一的接口去调用Android和IOS的相同功能的接口(比如往游戏里面加广告或者分享功能),那么就必须写两套实现,不过头文件可以用同一个。一般的做法是:在Xcode里面的proj.ios目录下新建一个.mm文件来实现接口;然后在Eclipse的相应工程的jni目录下新建一个.cpp的文件来另外做一个实现,接着还要修改Anroid.mk文件,把这个.cpp文件的路径加到编译路径上面去。这种方法本人觉得很麻烦,加上要改动的地方比较多且不统一,经常会出现修改了这个就忘记了另外一个,所以就有上面那种方法。
好!现在说一下Android和IOS分别的实现代码:
首先是公共接口以及Android接口的实现,如下:
SocialUtils.cpp头文件
#include "SocialUtils.h" #include "Utils.h" // ============================公开调用的统一接口============================ void SocialUtils::registerWeixin(char* appID){ #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // Android SocialUtils::registerWeixinForAndroid(appID); #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) // IOS SocialUtils::registerWeixinForIOS(appID); #endif } void SocialUtils::shareToWeixin(){ #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // Android SocialUtils::shareToWeixinForAndroid(); #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) // IOS SocialUtils::shareToWeixinForIOS(); #endif } void SocialUtils::shareToFacebook(){ #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // Android SocialUtils::shareToFacebookForAndroid(); #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) // IOS SocialUtils::shareToFacebookforIOS(); #endif } void SocialUtils::destroy(){ #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // Android SocialUtils::destroyForAndroid(); #elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) // IOS SocialUtils::destroyForIOS(); #endif } // ============================【微信】Android通过Jni调用java层接口============================ // 说明:其中的Utils::getAndroidPackageInfo()返回的是java完整的类包名。具体涉及到Jni的知识,同学们可以参考:http://blog.csdn.net/lognic10/article/details/22269537 学习一下。 #if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) void SocialUtils::registerWeixinForAndroid(char *appID){ JniMethodInfo jmi; bool ishave = JniHelper::getStaticMethodInfo(jmi,Utils::getAndroidPackageInfo(),"registerWeixin","(Ljava/lang/String;)V"); if(ishave) { // 将C++的char*转换成java的jstring jstring str_id = jmi.env->NewStringUTF(appID); jmi.env->CallStaticVoidMethod(jmi.classID,jmi.methodID,str_id); } } void SocialUtils::shareToWeixinForAndroid(){ JniMethodInfo jmi; bool ishave = JniHelper::getStaticMethodInfo(jmi,"shareToWeixin","()V"); if(ishave) { jmi.env->CallStaticVoidMethod(jmi.classID,jmi.methodID); } } // ============================【Facebook】Android通过Jni调用java层接口============================ void SocialUtils::shareToFacebookForAndroid(){ JniMethodInfo jmi; bool ishave = JniHelper::getStaticMethodInfo(jmi,"shareToFacebook",jmi.methodID); } } void SocialUtils::destroyForAndroid(){ JniMethodInfo jmi; bool ishave = JniHelper::getStaticMethodInfo(jmi,"onDestroy",jmi.methodID); } } #endif
上面Android接口实现其实只是利用了Cocos2d-x为我们提供的方便的Jni接口调用了Android本地的java方法,具体的java方法代码如下:
// ===========================分享功能====================================== // 分别是分享需要的内容:应用名字、标题、描述、图片链接地址、应用链接地址。 private static final String SHARE_APP_NAME = mActivity.getString(R.string.app_name); private static final String SHARE_CAPTION = mActivity.getString(R.string.share_caption); private static final String SHARE_DESCRIPTION = mActivity.getString(R.string.share_description); private static final String SHARE_PICTURE_URL = ""; private static final String SHARE_LINK = "http://www.baidu.com"; private static IWXAPI weixinAPI; /** * 注册微信 * @param appID 微信应用ID */ public static void registerWeixin(String appID){ weixinAPI = WXAPIFactory.createWXAPI(mActivity,appID,true); if(weixinAPI != null){ // 将应用注册到微信 weixinAPI.registerApp(appID); } } /** * 分享到微信朋友圈 */ public static void shareToWeixin(){ WXWebpageObject webpage = new WXWebpageObject(); webpage.webpageUrl = SHARE_LINK; WXMediaMessage msg = new WXMediaMessage(webpage); msg.title = SHARE_CAPTION; msg.description = SHARE_DESCRIPTION; SendMessageToWX.Req req = new SendMessageToWX.Req(); req.scene = SendMessageToWX.Req.WXSceneTimeline; // 如果想分享到回话那么就改成:WXSceneSession req.transaction = String.valueOf(System.currentTimeMillis()); req.message = msg; if(weixinAPI != null){ weixinAPI.sendReq(req); } }
至此Android端微信分享功能就集成好了!
接着说一下IOS端的实现,到xcode对应的工程里面的ios目录下新建一个SocialUtils_ios.mm文件,然后写上以下代码:
#include "SocialUtils.h" #import "WXApi.h" #import <FacebookSDK/FacebookSDK.h> static WXScene _scene = WXSceneTimeline; // 发送到微信朋友圈 static UIViewController* m_viewController; // 分享的内容,包括:应用名、标题、描述、链接 static NSString* SHARE_APP_NAME; static NSString* SHARE_CAPTION; static NSString* SHARE_DESCRIPTION; static NSString* SHARE_LINK = @"https://www.baidu.com"; // 获取设备语言环境 const char* SocialUtils::getDeviceLanguage(){ NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; NSArray * allLanguages = [defaults objectForKey:@"AppleLanguages"]; NSString * preferredLang = [allLanguages objectAtIndex:0]; return [preferredLang UTF8String]; } void SocialUtils::setShareContent(){ NSString* lan = [NSString stringWithUTF8String:getDeviceLanguage()]; if ([lan isEqualToString:@"zh-Hans"]) { // 如果是简体中文 SHARE_APP_NAME = @"测试分享功能APP"; SHARE_CAPTION = @"测试分享功能APP SHARE_DESCRIPTION = @"我是用来测试分享功能的!"; }else if ([lan isEqualToString:@"zh-Hant"]) { // 如果是繁体中文 SHARE_APP_NAME = @"測試分享功能的APP"; SHARE_CAPTION = @"測試分享功能的APP"; SHARE_DESCRIPTION = @"我是用來測試的!"; }else { // 默认是英语 SHARE_APP_NAME = @"For Test"; SHARE_CAPTION = @"For Test"; SHARE_DESCRIPTION = @"I born for test!"; } } void SocialUtils::setUIViewController(void* viewController){ m_viewController = (UIViewController*)viewController; } // 注册微信 void SocialUtils::registerWeixinForIOS(char *appID){ [WXApi registerApp:[NSString stringWithUTF8String:appID] withDescription:nil]; }<pre name="code" class="objc">void SocialUtils::setUIViewController(void* viewController){ m_viewController = (UIViewController*)viewController; // 设置分享内容(国际化) setShareContent(); } // 注册微信 void SocialUtils::registerWeixinForIOS(char *appID){ [WXApi registerApp:[NSString stringWithUTF8String:appID] withDescription:nil]; } void SocialUtils::shareToWeixinForIOS(){ // 设置分享内容 setShareContent(); WXMediaMessage *message = [WXMediaMessage message]; message.title = SHARE_DESCRIPTION; message.description = SHARE_DESCRIPTION; [message setThumbImage:[UIImage imageNamed:@"Icon-152.png"]]; WXWebpageObject *ext = [WXWebpageObject object]; ext.webpageUrl = SHARE_LINK; message.mediaObject = ext; SendMessageToWXReq* req = [[[SendMessageToWXReq alloc] init]autorelease]; req.bText = NO; req.message = message; req.scene = _scene; [WXApi sendReq:req]; }
至此IOS端的实现也完成了!
SocialUtils::registerWeixin("微信appID");
具体的调用时机可以自己决定。然后就可以在需要分享的地方调用:
SocialUtils::shareToWeixin();
就可以了。