链接地址:http://blog.csdn.net/yeungxuguang/article/details/18227153

本文出自:http://www.iteye.com/topic/1130694

随着智能机的火速普及,现在市面上好多智能机的游戏(ios,android,wp,==),最近我也加入了手机游戏开发者的行列.选择cocos2d-x作为我们的游戏引擎…在研究其他手机游戏的过程中我发现,很多游戏都有微博分享的功能,当你在游戏里厮杀获得好成绩的时候,你是否想跟朋友一起分享呢…微博分享无疑是一个很好的选择。

我的要求是能够分享新浪微博,腾讯微博,QZone。如果是以前,你可能会下载各个平台提供的sdk进行相应的植入。对我等初接触微博分享开发的人来说,如果能有一套整合的框架,我的理想情况是,只需要写weibo.share,weibo.follow,==即可解决繁琐的解析,check等操作。经过朋友推荐,我遇到了ShareSDK。

ShareSDK是为iOS、Android、WP8的APP提供社会化功能的一个组件,开发者只需10分钟即可集成到自己的APP中,它不仅支持如QQ、微信、新浪微博、腾讯微博、开心网、人人网、豆瓣、网易微博、搜狐微博、facebook、twitter、google+等国内外主流社交平台,还有强大的统计分析管理后台,可以实时了解用户、信息流、回流率、传播效应等数据,有效的指导日常运营与推广,同时为APP引入更多的社会化流量。【我是拷贝官方的introduce,抱歉我的偷懒】,详细的介绍在http://sharesdk.cn/Index/production,感兴趣的朋友可以自行参阅。

根据ShareSDK提供的介绍我们可知他提供了若干view,自定义ui之类的方法和package,对于传统app,他提供了友好的界面和操作行为,但由于我们的项目是cocos2d-x的界面,so…我不打算使用官方提供的关于这部分的包。如果您不打算使用自己的ui,官方提供了自定义的方法,请参阅官方sdk提供的教程。

Sharesdk的申请流程

请登陆http://sharesdk.cn并注册帐号。 

注册成功后,在首页点击”我的应用” 

因为我之前已经创建过,无妨,点击添加按钮 

选中您需要的平台和应用名称,因为我需要支持android,ios,所以创建了两个应用,分别是PokerFaceAndroid, PokerFaceIOS用以区分。

选择一个应用,你将在”下载SDK”的底部发现Appkey的字样,这个就是将来你要用到的key。下载相应的SDK备用。

介绍一下新浪微博,腾讯微博,QZone这三个平台的appkey的申请方法

【新浪微博】

进入http://open.weibo.com/developers,进行开发者帐号的申请与身份认证,具体不再赘述。

验证过程可能需要点时间,请稍安勿躁,看下面的介绍

进入http://open.weibo.com/development/mobile

点击创建应用

输入您应用的相关信息,注意,选择您需要的平台,并创建。创建完成后可到管理界面查看应用的基本情况。

记下AppKey和AppSecret,接下来提供给sharesdk使用。

这里有个坑,如果你按照上面的步骤创建了应用,你在分享的时候会出现报错error:redirect_uri_mismatch。解决方法就是进入应用程序-高级信息里设置安全设置里的域名绑定。

至此,sina微博的app申请流程介绍完毕,sina微博的规则是自申请之日3天后才能开启审核,so,这段时间加油写代码吧。

【腾讯微博】

跟新浪微博一样,腾讯微博也要进行类似的操作,进入http://dev.t.qq.com/development/developer/

填写相关的资料进行审核和资质验证。

验证通过后点击“创建应用”

 

根据提示填写相关资料

提交后,进入“管理中心”可以看到我们应用的基本信息

Tencent微博也就这么happy的结束了

【QZone】

进入http://connect.qq.com/intro/login/,点击申请加入,经过一系列的申请,审核,验证的操作,进入管理中心

点击创建应用

这里,我们选择移动应用

补全相关信息。点击创建应用,我们就可以在“管理中心”内看到我们创建的应用了。

至此,这三个平台的注册,创建过程介绍完毕。

【集成概要】

Cocos2d-x支持多种平台,在这里就不赘述了,我们需要在andriod,ios版本里支持微博分享功能,当然为了兼容考虑,也得写win32的实现,不过win32是以空函数来实现的,代表不做任何操作。

微博分享,大约需要几个东西

分享 
关注 
授权 
取消授权 
获取用户id 
获取用户昵称 
另外还需要以上这些行为的回调函数进行自定义操作

头文件SocialShare.h

+ expand source 
定义了这样的一个头文件,就可以提供给win32(空函数),android和ios使用了

SocialShareWin32.cpp

+ expand source 
【android集成】

下载官方sharesdk(android版),解压后得到如下所示的文件列表

其中sample是一个比较全面的例子,里面讲解了各种用法,童鞋们可以自行研究,熟悉熟悉

Libs目录下有

其中Global-Dependences是全局依赖的一个包,名字叫ShareSDK-Core.jar

Platforms里的压缩包文件是各个平台要用到的sdk包

将其解压,copy到自己工程里即可使用

ShareSDK-GUI目录是给一键分享用的,我们目前用不到,so,感兴趣的童鞋可以自行查阅相关资料

添加

用以支持授权时候的逻辑

并添加相应的权限

设置完后,如果出现一些问题,请到http://bbs.sharesdk.cn/thread-45-1-1.html查询或者留言。

接下来修改“主activity.java”

+ expand source 
接下来,看看jni部分咋写

SocialShareAndroid.cpp

+ expand source 
Android集成sharesdk算是结束了

【xcode集成】

下载官方sharesdk(ios版),解压后得到如下所示的文件列表

详细集成过程请参考官方文档,我们使用的framework我提取了一下,list如下

添加依赖框架(Framework)

打开项目设置中的Build Phases页,在“Link Binary With Libraries”一栏中,点击左下角的“+”号;在弹出窗口里面分别以下库加入到项目中:

SystemConfiguration.framework

QuartzCore.framework

libicucore.dylib

libz.1.2.5.dylib

//下面的描述来自官方文档 BEGIN

打开*-Info.plist(*代表你的工程名字)。在配置文件中新增一项URL types

(如果存在可以不创建),展开URL types –URL Schemes,在URL Schemes下分别各新增一项用于新浪微博和Facebook授权的Scheme(如果不添加则会导致新浪微博或Facebook的SSO授权方式无法返回应用)。其中新浪填写格式为:sinaweibosso.2279784657,其中后面的数字段为你在新浪微博申请的AppKey。Facebook填写格式为:fb107704292745179,其中后面的数字段为你在Facebook申请的AppKey

//from官方文档 END

导入头文件ShareSDK.h并初始化社交平台的App信息。

打开AppController.mm文件,#import <ShareSDK/ShareSDK.h>

添加实现函数

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

{

return [ShareSDK handleOpenURL:url sourceApplication:sourceApplication annotation:annotation wxDelegate:self];

}

-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

{

return [ShareSDK handleOpenURL:url wxDelegate:self];

}

SocialShareIOS.mm文件

#include “SocialShare.h”

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)

#include

#import <ShareSDK/ShareSDK.h>

SocialShare *SocialShare::m_sShare = NULL;

typedef struct WeiboUserInfo

{

std::string userID;

std::string userName;

}WeiboUserInfo;

std::map<ShareType, WeiboUserInfo> g_mapUserInfo;

bool g_bSocialShareInited = false;

void SocialShare::init()

{

if (!g_bSocialShareInited)

{

SocialShare::m_sShare = new SocialShare();

g_mapUserInfo.clear();

[ShareSDK registerApp:@"xx"]; //你注册的sharesdk的appkey

[ShareSDK connectSinaWeiboWithAppKey:@"xx" appSecret:@"xx" redirectUri:@"xx"];

[ShareSDK connectTencentWeiboWithAppKey:@"xx" appSecret:@"xx" redirectUri:@"xx"];

[ShareSDK connectQZoneWithAppKey:@"xx" appSecret:@"xx"];

g_bSocialShareInited = true;

}

}

void SocialShare::end()

{

delete SocialShare::m_sShare;

SocialShare::m_sShare = NULL;

}

ShareType getWeiboType(const char* strWeiboName)

{

ShareType type = ShareTypeAny;

if (!strWeiboName || strlen(strWeiboName)==0)

{

CCLog(“SocialShare::getWeiboType strWeiboName is null!”);

return type;

}

if (strcmp(strWeiboName, SOCIALSHARE_SINAWEIBO_NAME) == 0)

{

type = ShareTypeSinaWeibo;

}

else if (strcmp(strWeiboName, SOCIALSHARE_TENCENTWEIBO_NAME) == 0)

{

type = ShareTypeTencentWeibo;

}

else if (strcmp(strWeiboName, SOCIALSHARE_QZONE_NAME) == 0)

{

type = ShareTypeQQSpace;

}

return type;

}

void updateWeiboInfo(const char* strWeiboName)

{

ShareType type = getWeiboType(strWeiboName);

if (type == ShareTypeAny)

{

return;

}

[ShareSDK getUserInfoWithType:type authOptions:nil result:^(BOOL result, id userInfo, id error) {

if (result)

{

WeiboUserInfo tmp;

tmp.userName = [[userInfo nickname] UTF8String];

tmp.userID = [[userInfo uid] UTF8String];

g_mapUserInfo[type] = tmp;

}

else

{

g_mapUserInfo.erase(type);

}

}];

}

void SocialShare::weiboShare(const char* strWeiboName,const char* strTitle,const char* strText,const char* strImageDir,const char* strTitleUrl,const char* strImageUrl,const char* strSiteUrl)

{

ShareType type = getWeiboType(strWeiboName);

if (type == ShareTypeAny)

{

return;

}

char _strTitleUrl[128] = “\0″;

if (strTitleUrl && strlen(strTitleUrl)>0)

{

strcpy(_strTitleUrl, strTitleUrl);

}

NSString *imagePath = [NSString stringWithUTF8String:strImageDir];

id publicContent = [ShareSDK content:[NSString stringWithUTF8String:strText]  defaultContent:@”" image:[ShareSDK imageWithPath:imagePath] title:[NSString stringWithUTF8String:strTitle] url:[NSString stringWithUTF8String:_strTitleUrl] description:[NSString stringWithUTF8String:strText] mediaType:SSPublishContentMediaTypeText];

[ShareSDK shareContent:publicContent type:type authOptions:nil statusBarTips:YES result:^(ShareType type, SSPublishContentState state, id statusInfo, id error, BOOL end) {

if (state == SSPublishContentStateFail)

{

NSLog(@"weiboShare %@", [NSString stringWithFormat:@"分享失败%@", [error errorDescription]]);

}

if (state != 0)

{

doWeiboResultFunc(strWeiboName, 1, (int)state);

updateWeiboInfo(strWeiboName);

}

}];

}

void SocialShare::weiboFollowFriend(const char* strWeiboName, const char *strAccount)

{

ShareType type = getWeiboType(strWeiboName);

if (type == ShareTypeAny)

{

return;

}

[ShareSDK followUserWithType:type field:[NSString stringWithUTF8String:strAccount] fieldType:SSUserFieldTypeName authOptions:nil viewDelegate:nil result:^(SSResponseState state, id userInfo, id error) {

if (state == SSResponseStateFail)

{

NSLog(@”weiboShare %@”, [NSString stringWithFormat:@"关注失败%@", [error errorDescription]]);

}

if (state != 0)

{

doWeiboResultFunc(strWeiboName, 1, (int)state);

updateWeiboInfo(strWeiboName);

}

}];

}

void SocialShare::weiboAuth(const char* strWeiboName)

{

ShareType type = getWeiboType(strWeiboName);

if (type == ShareTypeAny)

{

return;

}

[ShareSDK authWithType:type options:nil result:^(SSAuthState state, id error) {

if (state == SSAuthStateFail)

{

NSLog(@"weiboShare %@", [NSString stringWithFormat:@"授权失败%@", [error errorDescription]]);

}

if (state != 0)

{

doWeiboResultFunc(strWeiboName, 1, (int)state);

updateWeiboInfo(strWeiboName);

}

}];

}

void SocialShare::weiboRemoveAccount(const char* strWeiboName)

{

ShareType type = getWeiboType(strWeiboName);

if (type == ShareTypeAny)

{

return;

}

[ShareSDK cancelAuthWithType:type];

doWeiboResultFunc(strWeiboName, 4, 1);

updateWeiboInfo(strWeiboName);

}

std::string SocialShare::weiboGetUserId(const char* strWeiboName)

{

ShareType type = getWeiboType(strWeiboName);

std::map<ShareType, WeiboUserInfo>::iterator mi = g_mapUserInfo.find(type);

if (mi != g_mapUserInfo.end())

{

return mi->second.userID;

}

return “”;

}

std::string SocialShare::weiboGetUserName(const char* strWeiboName)

{

ShareType type = getWeiboType(strWeiboName);

std::map<ShareType, WeiboUserInfo>::iterator mi = g_mapUserInfo.find(type);

if (mi != g_mapUserInfo.end())

{

return mi->second.userName;

}

return “”;

}

#endif

至此,IOS部分的集成工作也完成了

我们得写点代码测试一下

在你项目里的项目名.cpp里的初始化里写

bool AppXXXXXX:applicationDidFinishLaunching()里添加

SocialShare::init();

void AppXXXXXX::exit()里添加

SocialShare::end();

//test weibo

SocialShare::shareSocialShare()->setWeiboResultNotifier(this, socialweibo_selector(MainMenuLayer::onweiboCallback));

CCMenuItemFont* weiboid              = CCMenuItemFont::create(a2u(“获取微博id”).c_str(), this, menu_selector(MainMenuLayer::onweiboid));

CCMenuItemFont* weiboname      = CCMenuItemFont::create(a2u(“获取微博名字”).c_str(), this, menu_selector(MainMenuLayer::onweiboname));

CCMenuItemFont* weiboauth        = CCMenuItemFont::create(a2u(“微博授权”).c_str(), this, menu_selector(MainMenuLayer::onweiboauth));

CCMenuItemFont* removecount = CCMenuItemFont::create(a2u(“删除帐号”).c_str(), this, menu_selector(MainMenuLayer::onremovecount));

CCMenuItemFont* weibofollow = CCMenuItemFont::create(a2u(“微博关注”).c_str(), this, menu_selector(MainMenuLayer::onweibofollow));

CCMenuItemFont* weiboshare      = CCMenuItemFont::create(a2u(“微博分享”).c_str(), this, menu_selector(MainMenuLayer::onweiboshare));

CCMenu* menu = CCMenu::create(weiboid, weiboname, weiboauth, removecount, weibofollow, weiboshare, NULL);

CCPoint menuPostion = menu->getPosition();

menu->setPosition(menuPostion.x, menuPostion.y + visibleSize.height * 0.1f);

menu->alignItemsVertically();

addChild(menu);

void MainMenuLayer::onweiboid(CCObject* sender)

{

CCLOG(“MainMenuLayer::onweiboid\t%s”, SocialShare::shareSocialShare()->weiboGetUserId(SOCIALSHARE_SINAWEIBO_NAME).c_str());

}

void MainMenuLayer::onweiboname(CCObject* sender)

{

CCLOG(“MainMenuLayer::onweiboname\t%s”, SocialShare::shareSocialShare()->weiboGetUserName(SOCIALSHARE_SINAWEIBO_NAME).c_str());

}

void MainMenuLayer::onweiboauth(CCObject* sender)

{

SocialShare::shareSocialShare()->weiboAuth(SOCIALSHARE_SINAWEIBO_NAME);

}

void MainMenuLayer::onremovecount(CCObject* sender)

{

SocialShare::shareSocialShare()->weiboRemoveAccount(SOCIALSHARE_SINAWEIBO_NAME);

}

void MainMenuLayer::onweibofollow(CCObject* sender)

{

SocialShare::shareSocialShare()->weiboFollowFriend(SOCIALSHARE_SINAWEIBO_NAME, a2u(“李东日-ldr123″).c_str());

}

void MainMenuLayer::onweiboshare(CCObject* sender)

{

string strFile = saveScreen(“xx.jpg”);

if (!strFile.empty())

{

SocialShare::shareSocialShare()->weiboShare(SOCIALSHARE_SINAWEIBO_NAME, a2u(“PokerFace测试”).c_str(),a2u(“大家可以来关注哦,@李东日-ldr123 http://ldr123.mobi”).c_str(),strFile.c_str());

}

}

bool MainMenuLayer::onweiboCallback(const char* x, int y, int z)

{

CCLOG(“MainMenuLayer::onweiboCallback:%s,%d,%d”, x,y,z);

return true;

}

大家看到a2u()函数了把,这个函数是将gb2312的字符串转换成utf8,这样才能在cocos2d-x里显示中文,是用iconv实现,具体请搜索相关关键字“cocos2d-x iconv”

另外,提供saveScreen代码

//如果是发微博用的,最好jpg。。。

std::string saveScreen(const char *fileName)

{

string strResult = “”;

bool bResult = false;

CCSize size = CCDirector::sharedDirector()->getWinSize();

CCRenderTexture* screen = CCRenderTexture::create(size.width, size.height);

CCScene* temp = CCDirector::sharedDirector()->getRunningScene();

screen->begin();

temp->visit();

screen->end();

CCImage *pImage = screen->newCCImage(true);

if (pImage)

{

strResult = CCFileUtils::sharedFileUtils()->getWritablePath() + fileName;

bResult = pImage->saveToFile(strResult.c_str(), true);

}

CC_SAFE_DELETE(pImage);

CC_SAFE_DELETE(screen);

if (bResult)

{

return strResult;

}

return “”;

}

哇哦,好多东西,终于结束了,开心的编译和调试吧。

后记:

这次weibo分享集成之旅,我感慨良多,每次看到一个新东西的时候,总感觉这很容易啊,分分钟搞定啊,可是真正的参与操作才会发现,各种各样需要解决的坑。留此博文仅供参考。博文中或许有些许不恰当或者不精准的用词,还请海涵。也感谢sharesdk官方客服耐心的解答和提供的建议,再次感谢!

最后,如果您是cocos2d-x使用者,也想使用sharesdk,那么你来对地方了,这里可以解决你的烦恼,欢迎技术探讨与交流,博文中提供的代码片段已经足够帮助理解和使用了,对于求代码者,我只能“呵呵”了。

转载于:https://www.cnblogs.com/wvqusrtg/p/5063526.html

我的cocos2d-x集成sharesdk之旅(转)相关推荐

  1. Mob之社会化分享集成ShareSDK

    接着上篇顺便分享一篇自己使用 ShareSDK 的笔记,上篇我们集成了 SMSSDK 完成了短信接收验证码的功能,请参考Mob 之 短信验证集成 SMSSDK,如何在项目已经集成 SMSSDK 的情况 ...

  2. Android集成ShareSDK第三方分享和登录

    本篇记录在Android平台上如何集成ShareSDK实现第三方登陆和分享,以及其中可能会遇到的坑. Mob官网 下载 如图选择你需要分享的平台: 集成 解压下载的文件,然后在ShareSDK for ...

  3. Android 集成ShareSDK实现三方登录

    ** 前言 ** 三方登录在如今差不多已经成为每一款App必备的功能了.每次集成都会遇到各种各样的问题,今天总结一下三方登录的流程,以免忘记.现在好像还没有专门的三方登录SDK,ShareSDK和友盟 ...

  4. quick-cocos 集成ShareSDK

    1.新建Android应用.获取App Key 和App Secret 2.下载SDK,选择相应的平台.下载后打开ShareSDK for Android文件夹,点击QuickIntegrater.j ...

  5. IOS项目集成ShareSDK实现第三方登录、分享、关注等功能

    快速集成 第一步:将下载的SDK解压后导入您的工程中,见下图(点击这里查看视频教程) 拖到工程中后弹出以下对话框,勾选"Copy items into destination group's ...

  6. 集成ShareSDK

    关于集成: 官网集成介绍 在manifest里添加 xmlns:tools="http://schemas.android.com/tools" 在application里添加 t ...

  7. Android 集成 ShareSdk 记录

    MobSdk 隐私协议: https://www.mob.com/wiki/detailed?wiki=share_hgzn&id=14 集成: https://www.mob.com/wik ...

  8. 集成ShareSDK,分享成功后QQ和空间回调不执行的可能原因

    AndroidMainifest.xml中的如箭头所示的id与assets下ShareSDK.xml中配置的QQ的AppId一定要相同. 转载于:https://www.cnblogs.com/rh1 ...

  9. iOS集成sharesdk遇到的坑

    分享新浪微博 ★★★分享新浪微博★★★ 前言: 写这个目地是为了记录那些过坑,直接先上效果图.大家看看如果你遇到了应该如果处理更好,因为刚一看到这个效果的时候就明白其实很简单不就是分享微博吧.但是要求 ...

  10. Unity集成ShareSDK一键分享

    1.首先在ShareSDK 官网下载http://mob.com/"ShareSDK社会化"分享插件,直接现在UnityforShareSDK. 2.解压,然后将ShareSDK导 ...

最新文章

  1. cmake, This may result in binaries being created in the wrong place
  2. IronRuby:元编程特性【method_missing】的使用
  3. linux查看网络流量
  4. 2018年终总结--最美的期待
  5. 如何用TXT文档数据批量生成条形码
  6. c++ primer第四版上的内容质疑
  7. Zookeepe实践与应用--分布队列
  8. Auto login to your computer
  9. java 冻结对象_模式匹配时冻结 - java
  10. 计算机科学NIP,焦点:网络入侵防护(NIP)技术真的成了鸡肋吗? -电脑资料
  11. [当当网,你意欲何为]之二:无奈,配送之痛
  12. sql 读取本地txt文件批量插入数据库
  13. html5新加的元素,HTML5新增元素
  14. linux汇编预处理,Linux程序在预处理、编译、汇编、链接、运行步骤的作用
  15. matlab gui用edit,matlab gui edit 显示
  16. 揭密微信跳一跳小游戏那些外挂
  17. ATECLOUD智能云测试平台,中国人自己的“LABVIEW”-测试测量软件
  18. Flink从入门到真香(12、Flink一大利器-时间窗口)
  19. 利用冒泡法对10个数字进行排序
  20. 透过“最牛”年报,聊聊优然牧业的“最佳养牛模式”

热门文章

  1. 泰安的雾霾确实有点大
  2. 最近两个星期,机器经常卡死,难道是内存用光了?
  3. 全网首发:解决办法:shmget()一直失败,errno=-22
  4. 引用原话,不等于原意
  5. 导航可与红绿灯结合起来
  6. 安装了opencv,怎么一直报错:找不到CAP_PROP_FRAME_COUNT
  7. XCode出现Could not locate device support files的解决办法
  8. iOS锁屏代码注意使用新接口
  9. js手机键盘遮挡_移动端页面input输入框被键盘遮挡问题
  10. excel 制作dashboard_【实例分享】勤哲Excel服务器做影视制作企业管理系统