【IOS和Android】Cocos2d-x 集成微信分享功能

(一)集成微信:

1、先到微信官网下载IOS和Android最新的SDK:IOS和Android的微信SDK下载地址


2、前期准备工作和配置环境:

以下引用自官网: IOS和Android微信环境配置

【IOS的环境配置】

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

微信SDK Sample Demo源码


【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 {*;}
3、接口实现:

由于要实现跨平台的需要(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文件的路径加到编译路径上面去。这种方法本人觉得很麻烦,加上要改动的地方比较多且不统一,经常会出现修改了这个就忘记了另外一个,所以就有上面那种方法。


说一下大致的思路:在C++层开放一个统一的接口,比如:registerWeixin(char* appID),然后再针对不同的平台编写一个接口,比如:如果是Android平台,那么就相对应的接口是registerWeixinForAndroid(char* appID)。需要调用的时候,直接就调用统一的接口registerWeixin(char* appID)就可以了,因为程序中已经会根据不同的平台然后调用相应不同的接口。这样子,IOS的接口实现和Android调用的接口实现都基本可以在xcode里面完成了,也不用每次都要在Eclipse下面新建一个接口实现文件和修改Android.mk文件了。这种做法的缺点也是有:要为不同平台都提供一个类似的接口方法,一个开放接口要写3个(开放调用一个,android一个,ios一个),有点累赘。


好!现在说一下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端的实现也完成了! 
 

下面来看看如何在Cocos2d-x调用分享功能:

首先要先注册微信,调用:

SocialUtils::registerWeixin("微信appID");

具体的调用时机可以自己决定。然后就可以在需要分享的地方调用:

SocialUtils::shareToWeixin();

就可以了。





转载请标明出处:http://www.jb51.cc/article/p-mlskzfpk-z.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是