【iOS和Android端】Cocos2d-x集成微信分享功能实现详解

来源:互联网 发布:论网络诈骗的法律规范 编辑:程序博客网 时间:2024/05/16 17:10
<div class="ad_1">                                                                        </div>                                                                                        <p>(一)集成微信:<br/><br/></p><p>1、先到微信官网下载iOS和Android最新的SDK:<a href="https://open.weixin.qq.com/cgi-bin/frame?t=resource/res_main_tmpl&verify=1&lang=zh_CN&target=res/app_download_android" target="_blank">iOS和Android的微信SDK下载地址</a><br/><br/></p><p>2、前期准备工作和配置环境:<br/><br/></p><p>以下引用自官网: <a href="https://open.weixin.qq.com/cgi-bin/frame?t=resource/res_main_tmpl&verify=1&lang=zh_CN&target=res/app_download_android" target="_blank">iOS和Android微信环境配置</a><br/><br/></p><p>【iOS的环境配置】<br/><br/></p><p>1)向微信注册你的应用程序id<br/><br/></p><p>请到开发者应用登记页面进行登记,登记并选择移动应用进行设置后,将获得AppID,可立即用于开发。但应用登记完成后还需要提交审核,只有审核通过的应用才能正式发布使用。<br/><br/></p><p>2)下载微信终端SDK文件<br/><br/></p><p>SDK文件包括 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个。<br/><br/></p><p>请前往“资源下载页”下载最新SDK包<br/><br/></p><p>3)搭建开发环境<br/><br/></p><ul><li>在Xcode中建立你的工程。</li><li>将SDK文件中包含的 libWeChatSDK.a,WXApi.h,WXApiObject.h 三个文件添加到你所建的工程中(如下图所示,建立了一个名为Test 的工程,并把以上三个文件添加到Test文件夹下)。</li></ul><p>(注:请使用Xcode4.5及以上版本)<br/><br/></p><p><a href="http://www.9ria.com/uploads/caiji/20141111/www.yxkfw.com-167.png" data-lightbox="image_lg"><img title="【iOS和Android端】Cocos2d-x集成微信分享功能实现详解 - 第1张  | 游戏开发网-最好的游戏编程开发技术网站!" alt="【iOS和Android端】Cocos2d-x集成微信分享功能实现详解 - 第1张  | 游戏开发网-最好的游戏编程开发技术网站!"  class="alignnone size-full wp-image-13412"  src="http://www.9ria.com/uploads/caiji/20141111/www.yxkfw.com-167.png" width="256" height="292" /></a><br/><br/></p><ul><li>在你的工程文件中选择Build Setting,在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h 三个文件所在位置(如下图所示)。</li></ul><p>(注:请使用Xcode4.5及以上版本)<br/><br/></p><p><a href="http://www.9ria.com/uploads/caiji/20141111/www.yxkfw.com-251.png" data-lightbox="image_lg"><img title="【iOS和Android端】Cocos2d-x集成微信分享功能实现详解 - 第2张  | 游戏开发网-最好的游戏编程开发技术网站!" alt="【iOS和Android端】Cocos2d-x集成微信分享功能实现详解 - 第2张  | 游戏开发网-最好的游戏编程开发技术网站!"  class="alignnone size-full wp-image-13413"  src="http://www.9ria.com/uploads/caiji/20141111/www.yxkfw.com-251.png" width="1138" height="323" /></a><br/><br/></p><ul><li>在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id(如下图所示)。</li></ul><p><a href="http://www.9ria.com/uploads/caiji/20141111/www.yxkfw.com-325.jpg" data-lightbox="image_lg"><img title="【iOS和Android端】Cocos2d-x集成微信分享功能实现详解 - 第3张  | 游戏开发网-最好的游戏编程开发技术网站!" alt="【iOS和Android端】Cocos2d-x集成微信分享功能实现详解 - 第3张  | 游戏开发网-最好的游戏编程开发技术网站!"  class="alignnone size-full wp-image-13414"  src="http://www.9ria.com/uploads/caiji/20141111/www.yxkfw.com-325.jpg" width="1330" height="545" /></a><br/><br/></p><p>Xcode设置URL scheme<br/><br/></p><p>微信SDK Sample Demo源码下载:<a title="WeChatSDK_sample_iOS_1.4.2.1.zip" href="http://cn.cocos2d-x.org/uploads/20141104/1415086882955714.zip">WeChatSDK_sample_iOS_1.4.2.1.zip</a><br/><br/></p><p>【Android的环境配置】<br/><br/></p><p>1)申请你的AppID<br/><br/></p><p>请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。<br/><br/></p><p>2)下载微信终端开发工具包<br/><br/></p><p>开发工具包主要包含3部分内容:(其中,只有libammsdk.jar是必须的)<br/><br/></p><p>– libammsdk.jar(每个第三方应用必须要导入该sdk库,用于实现与微信的通信)<br/><br/></p><p>– API文档(供开发者查阅使用)<br/><br/></p><p>– 界面小工具源码(封装了界面表现的工具类,以及一些界面风格)<br/><br/></p><p>请前往“资源下载页”下载最新SDK包<br/><br/></p><p>3)搭建开发环境<br/><br/></p><ul><li>在Eclipse中建立你的工程。</li><li>在工程中新建一个libs目录,将开发工具包中libs目录下的libammsdk.jar复制到该目录中(如下图所示,建立了一个名为SDK_Sample 的工程,并把jar包复制到libs目录下)。</li></ul><p><a href="http://www.9ria.com/uploads/caiji/20141111/www.yxkfw.com-4.bmp" data-lightbox="image_lg"><img title="【iOS和Android端】Cocos2d-x集成微信分享功能实现详解 - 第4张  | 游戏开发网-最好的游戏编程开发技术网站!" alt="【iOS和Android端】Cocos2d-x集成微信分享功能实现详解 - 第4张  | 游戏开发网-最好的游戏编程开发技术网站!"  class="alignnone size-full wp-image-13415"  src="http://www.9ria.com/uploads/caiji/20141111/www.yxkfw.com-4.bmp" width="250" height="239" /></a><br/><br/></p><ul><li>右键单击工程,选择Build Path中的Configure Build Path…,选中Libraries这个tab,并通过Add Jars…导入工程libs目录下的libammsdk.jar文件。(如下图所示)。</li></ul><p><a href="http://www.9ria.com/uploads/caiji/20141111/www.yxkfw.com-58.png" data-lightbox="image_lg"><img title="【iOS和Android端】Cocos2d-x集成微信分享功能实现详解 - 第5张  | 游戏开发网-最好的游戏编程开发技术网站!" alt="【iOS和Android端】Cocos2d-x集成微信分享功能实现详解 - 第5张  | 游戏开发网-最好的游戏编程开发技术网站!"  class="alignnone size-full wp-image-13416"  src="http://www.9ria.com/uploads/caiji/20141111/www.yxkfw.com-58.png" width="250" height="307" /></a><br/><br/></p><p>在你需要使用微信终端API的文件中导入相应的类。<br/><br/></p><blockquote><div>import com.tencent.mm.sdk.openapi.WXTextObject;</div></blockquote><div><p>注意<br/><br/></p><p>如果需要混淆代码,为了保证sdk的正常使用,需要在proguard.cfg加上下面两行配置:<br/><br/></p><blockquote><div><div>keep classcom.tencent.mm.sdk.openapi.WXMediaMessage {*;}</div><div>keep classcom.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}</div></div></blockquote><div><div><p>3、接口实现:<br/><br/></p><p>由于要实现跨平台的需要(Android和iOS),所以接口定义如下:<br/><br/></p><p>SocialUtils.h头文件<br/><br/></p><blockquote><div><div>// 一定要先引入”cocos2d.h”头文件,不然会包找不到<jni.h></div><div>#include “cocos2d.h”</div><div>#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)</div><div>#include <jni.h></div><div>#include “platform/android/jni/JniHelper.h”</div><div>#include <android/log.h></div><div>#endif</div><div>// 一定要加上这个命名空间不然在Android工程里编译的时候会编译不通过,</div><div>// 因为像JniMethodInfo、JniHelper这些类是在cocos2d这个命名空间里</div><div>USING_NS_CC;</div><div>classSocialUtils {</div><div></div><div>public:</div><div>    staticvoidregisterWeixin(char* appID); // 注册微信</div><div>    staticvoidshareToWeixin();// 分享内容到微信</div><div>    staticvoidshareToFacebook();// 分享内容到Facebook</div><div>    staticvoiddestroy();// 释放资源</div><div></div><div>public:</div><div>#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) // 判断如果是Android系统才会有这几个方法</div><div>    // Android</div><div>    staticvoidregisterWeixinForAndroid(char* appID);</div><div>    staticvoidshareToWeixinForAndroid();</div><div>    staticvoidshareToFacebookForAndroid();</div><div>    staticvoiddestroyForAndroid();</div><div>#endif</div><div></div><div>#if(CC_TARGET_PLATFORM == CC_PLATFORM_IOS)// 判断如果是IOS系统才会有这几个方法</div><div>    // IOS</div><div>    staticvoidregisterWeixinForIOS(char* appID);</div><div>    staticvoidshareToWeixinForIOS();</div><div>    staticvoidshareToFacebookforIOS();</div><div>    staticvoiddestroyForIOS();</div><div></div><div>public:</div><div>    staticvoidsetUIViewController(void* viewController);</div><div></div><div>#endif</div><div>};</div></div></blockquote><div><div><p>看到这里可以发现,有三套基本一样的接口,这个主要是本人为了方便而做的一个妥协。用过Cocos2d-x开发的童鞋应该都知道,如果想用C++写一套统一的接口去调用Android和iOS的相同功能的接口(比如往游戏里面加广告或者分享功能),那么就必须写两套实现,不过头文件可以用同一个。一般的做法是:在Xcode里面的proj.IOS目录下新建一个.mm文件来实现接口;然后在Eclipse的相应工程的jni目录下新建一个.cpp的文件来另外做一个实现,接着还要修改Anroid.mk文件,把这个.cpp文件的路径加到编译路径上面去。这种方法本人觉得很麻烦,加上要改动的地方比较多且不统一,经常会出现修改了这个就忘记了另外一个,所以就有上面那种方法。<br/><br/></p><p>说一下大致的思路:在C++层开放一个统一的接口,比如:registerWeixin(char* appID),然后再针对不同的平台编写一个接口,比如:如果是Android平台,那么就相对应的接口是:registerWeixinForAndroid(char* appID)。需要调用的时候,直接就调用统一的接口registerWeixin(char* appID)就可以了,因为程序中已经会根据不同的平台然后调用相应不同的接口。这样子,iOS的接口实现和Android调用的接口实现都基本可以在xcode里面完成了,也不用每次都要在Eclipse下面新建一个接口实现文件和修改Android.mk文件了。这种做法的缺点也是有:要为不同平台都提供一个类似的接口方法,一个开放接口要写3个(开放调用一个,android一个,iOS一个),有点累赘。<br/><br/></p><p>好!现在说一下Android和iOS分别的实现代码。<br/><br/></p><p>首先是公共接口以及Android接口的实现,如下:<br/><br/></p><p>SocialUtils.cpp头文件<br/><br/></p><blockquote><div><div>#include “SocialUtils.h”</div><div>#include “Utils.h”</div><div>// ============================公开调用的统一接口============================</div><div>voidSocialUtils::registerWeixin(char* appID){</div><div>#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)</div><div>    // Android</div><div>    SocialUtils::registerWeixinForAndroid(appID);</div><div>#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)</div><div>    // IOS</div><div>    SocialUtils::registerWeixinForIOS(appID);</div><div>#endif</div><div>}</div><div>voidSocialUtils::shareToWeixin(){</div><div>#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)</div><div>    // Android</div><div>    SocialUtils::shareToWeixinForAndroid();</div><div>#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)</div><div>    // IOS</div><div>    SocialUtils::shareToWeixinForIOS();</div><div>#endif</div><div>}</div><div>voidSocialUtils::shareToFacebook(){</div><div>#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)</div><div>    // Android</div><div>    SocialUtils::shareToFacebookForAndroid();</div><div>#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)</div><div>    // IOS</div><div>    SocialUtils::shareToFacebookforIOS();</div><div>#endif</div><div>}</div><div>voidSocialUtils::destroy(){</div><div>#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)</div><div>    // Android</div><div>    SocialUtils::destroyForAndroid();</div><div>#elif (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)</div><div>    // IOS</div><div>    SocialUtils::destroyForIOS();</div><div>#endif</div><div>}</div><div>// ============================【微信】Android通过Jni调用java层接口============================</div><div>// 说明:其中的Utils::getAndroidPackageInfo()返回的是java完整的类包名。</div><div>#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)</div><div>voidSocialUtils::registerWeixinForAndroid(char*appID){</div><div>    JniMethodInfo jmi;</div><div>    boolishave = JniHelper::getStaticMethodInfo(jmi,Utils::getAndroidPackageInfo(),”registerWeixin”,”(Ljava/lang/String;)V”);</div><div></div><div>    if(ishave)</div><div>    {</div><div>        // 将C++的char*转换成java的jstring</div><div>        jstring str_id = jmi.env->NewStringUTF(appID);</div><div>        jmi.env->CallStaticVoidMethod(jmi.classID,jmi.methodID,str_id);</div><div>    }</div><div>}</div><div>voidSocialUtils::shareToWeixinForAndroid(){</div><div>    JniMethodInfo jmi;</div><div>    boolishave = JniHelper::getStaticMethodInfo(jmi,Utils::getAndroidPackageInfo(),”shareToWeixin”,”()V”);</div><div></div><div>    if(ishave)</div><div>    {</div><div>        jmi.env->CallStaticVoidMethod(jmi.classID,jmi.methodID);</div><div>    }</div><div>}</div><div>// ============================【Facebook】Android通过Jni调用java层接口============================</div><div>voidSocialUtils::shareToFacebookForAndroid(){</div><div>    JniMethodInfo jmi;</div><div>    boolishave = JniHelper::getStaticMethodInfo(jmi,Utils::getAndroidPackageInfo(),”shareToFacebook”,”()V”);</div><div></div><div>    if(ishave)</div><div>    {</div><div>        jmi.env->CallStaticVoidMethod(jmi.classID,jmi.methodID);</div><div>    }</div><div>}</div><div>voidSocialUtils::destroyForAndroid(){</div><div>    JniMethodInfo jmi;</div><div>    boolishave = JniHelper::getStaticMethodInfo(jmi,Utils::getAndroidPackageInfo(),”onDestroy”,”()V”);</div><div></div><div>    if(ishave)</div><div>    {</div><div>        jmi.env->CallStaticVoidMethod(jmi.classID,jmi.methodID);</div><div>    }</div><div>}</div><div>#endif</div></div></blockquote><div><div>上面Android接口实现其实只是利用了Cocos2d-x为我们提供的方便的Jni接口调用了Android本地的java方法,具体的java方法代码如下:</div><blockquote><div><div><div>// ===========================分享功能======================================</div><div>// 分别是分享需要的内容:应用名字、标题、描述、图片链接地址、应用链接地址。</div><div>privatestaticfinal String SHARE_APP_NAME = mActivity.getString(R.string.app_name);</div><div>privatestaticfinal String SHARE_CAPTION = mActivity.getString(R.string.share_caption);</div><div>privatestaticfinal String SHARE_DESCRIPTION = mActivity.getString(R.string.share_description);</div><div>privatestaticfinal String SHARE_PICTURE_URL = “”;</div><div>privatestaticfinal String SHARE_LINK = “<a href="http://www.baidu.com/">http://www.baidu.com</a>“;</div><div>privatestaticIWXAPI weixinAPI;</div><div></div><div>    /**</div><div>     * 注册微信</div><div>     * @param appID 微信应用ID</div><div>     */</div><div>    publicstaticvoidregisterWeixin(String appID){</div><div>        weixinAPI = WXAPIFactory.createWXAPI(mActivity, appID, true);</div><div>        if(weixinAPI != null){</div><div>            // 将应用注册到微信</div><div>            weixinAPI.registerApp(appID);</div><div>        }</div><div>    }</div><div></div><div>    /**</div><div>     * 分享到微信朋友圈</div><div>     */</div><div>    publicstaticvoidshareToWeixin(){</div><div>        WXWebpageObject webpage = newWXWebpageObject();</div><div>        webpage.webpageUrl = SHARE_LINK;</div><div>        WXMediaMessage msg = newWXMediaMessage(webpage);</div><div>        msg.title = SHARE_CAPTION;</div><div>        msg.description = SHARE_DESCRIPTION;</div><div>        SendMessageToWX.Req req = newSendMessageToWX.Req();</div><div>        req.scene = SendMessageToWX.Req.WXSceneTimeline; // 如果想分享到回话那么就改成:WXSceneSession</div><div>        req.transaction = String.valueOf(System.currentTimeMillis());</div><div>        req.message = msg;</div><div></div><div>        if(weixinAPI != null){</div><div>            weixinAPI.sendReq(req);</div><div>        }</div><div>    }</div></div></div></blockquote><div><div><div><p>至此Android端微信分享功能就集成好了!<br/><br/></p><p>接着说一下iOS端的实现,到xcode对应的工程里面的ios目录下新建一个SocialUtils_ios.mm文件,然后写上以下代码:<br/><br/></p><blockquote><div><div>#include “SocialUtils.h”</div><div>#import “WXApi.h”</div><div>#import <FacebookSDK/FacebookSDK.h></div><div>staticWXScene _scene = WXSceneTimeline; // 发送到微信朋友圈</div><div>staticUIViewController* m_viewController;</div><div>// 分享的内容,包括:应用名、标题、描述、链接</div><div>staticNSString* SHARE_APP_NAME;</div><div>staticNSString* SHARE_CAPTION;</div><div>staticNSString* SHARE_DESCRIPTION;</div><div>staticNSString* SHARE_LINK = @”<a href="https://www.baidu.com/">https://www.baidu.com</a>“;</div><div>// 获取设备语言环境</div><div>constchar* SocialUtils::getDeviceLanguage(){</div><div>    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];</div><div>    NSArray * allLanguages = [defaults objectForKey"AppleLanguages"];</div><div>    NSString * preferredLang = [allLanguages objectAtIndex:0];</div><div>    return[preferredLang UTF8String];</div><div>}</div><div>voidSocialUtils::setShareContent(){</div><div>    NSString* lan = [NSString stringWithUTF8String:getDeviceLanguage()];</div><div>    if([lan isEqualToString"zh-Hans"]) { // 如果是简体中文</div><div>        SHARE_APP_NAME = @”测试分享功能APP”;</div><div>        SHARE_CAPTION = @”测试分享功能APP</div><div>        SHARE_DESCRIPTION = @”我是用来测试分享功能的!”;</div><div>    }elseif([lan isEqualToString"zh-Hant"]) { // 如果是繁体中文</div><div>        SHARE_APP_NAME = @”測試分享功能的APP”;</div><div>        SHARE_CAPTION = @”測試分享功能的APP”;</div><div>        SHARE_DESCRIPTION = @”我是用來測試的!”;</div><div>    }else{ // 默认是英语</div><div>        SHARE_APP_NAME = @”For Test”;</div><div>        SHARE_CAPTION = @”For Test”;</div><div>        SHARE_DESCRIPTION = @”I born for test!”;</div><div>    }</div><div>}</div><div>voidSocialUtils::setUIViewController(void* viewController){</div><div>    m_viewController = (UIViewController*)viewController;</div><div>}</div><div>// 注册微信</div><div>voidSocialUtils::registerWeixinForIOS(char*appID){</div><div>    [WXApi registerApp:[NSString stringWithUTF8String:appID] withDescription:nil];</div><div>}<pre name=”code”class=”objc”>voidSocialUtils::setUIViewController(void* viewController){</div><div>    m_viewController = (UIViewController*)viewController;</div><div>    // 设置分享内容(国际化)</div><div>    setShareContent();</div><div>}</div><div>// 注册微信</div><div>voidSocialUtils::registerWeixinForIOS(char*appID){</div><div>    [WXApi registerApp:[NSString stringWithUTF8String:appID] withDescription:nil];</div><div>}</div><div>voidSocialUtils::shareToWeixinForIOS(){</div><div>    // 设置分享内容</div><div>    setShareContent();</div><div></div><div>    WXMediaMessage *message = [WXMediaMessage message];</div><div>    message.title = SHARE_DESCRIPTION;</div><div>    message.description = SHARE_DESCRIPTION;</div><div>    [message setThumbImage:[UIImage imageNamed"Icon-152.png"]];</div><div></div><div>    WXWebpageObject *ext = [WXWebpageObject object];</div><div>    ext.webpageUrl = SHARE_LINK;</div><div></div><div>    message.mediaObject = ext;</div><div></div><div>    SendMessageToWXReq* req = [[[SendMessageToWXReq alloc] init]autorelease];</div><div>    req.bText = NO;</div><div>    req.message = message;</div><div>    req.scene = _scene;</div><div></div><div>    [WXApi sendReq:req];</div><div>}</div></div></blockquote><div><div><p>至此iOS端的实现也完成了!<br/><br/></p><p>下面来看看如何在Cocos2d-x调用分享功能:<br/><br/></p><p>首先要先注册微信,调用:<br/><br/></p><blockquote><div>SocialUtils::registerWeixin(“微信appID”);</div></blockquote><div>具体的调用时机可以自己决定。然后就可以在需要分享的地方调用:</div><blockquote><div><div>SocialUtils::shareToWeixin();</div></div></blockquote><div><div>就可以了。</div></div></div></div></div></div></div></div></div></div></div></div></div>                                                                                                        <p>转自:<a href="http://www.yxkfw.com/?p=13411" target="_blank">http://www.yxkfw.com/?p=13411</a></p>

0 0