随着智能机的火速普及,现在市面上好多智能机的游戏(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,那么你来对地方了,这里可以解决你的烦恼,欢迎技术探讨与交流,博文中提供的代码片段已经足够帮助理解和使用了,对于求代码者,我只能“呵呵”了。
我的要求是能够分享新浪微博,腾讯微博,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,那么你来对地方了,这里可以解决你的烦恼,欢迎技术探讨与交流,博文中提供的代码片段已经足够帮助理解和使用了,对于求代码者,我只能“呵呵”了。
相关推荐
同时,Cocos2d-x集成了Box2D物理引擎,使开发者能轻松实现物理效果,如碰撞检测、重力模拟等。 游戏中的音频管理也是不可或缺的一环。本书会介绍Cocos2d-x的音频API,包括音乐播放、音效处理以及音效资源的加载和...
资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...
《Cocos2d-x 3.13.1与Spine 3.6集成详解》 Cocos2d-x是一个广泛使用的开源游戏开发框架,它基于C++,同时支持Lua和JavaScript等多种脚本语言,为开发者提供了高效、跨平台的游戏开发解决方案。在3.13.1版本中,...
Cocos2d-x-3.x游戏开发之旅-钟迪龙著 全新pdf版和附书代码(代码为工程文件,可复制) 附带目录标签
《Cocos2d-x实战:C++卷(2版)源代码》这本书是关于使用Cocos2d-x游戏引擎进行游戏开发的专业指南。Cocos2d-x是一个开源的、跨平台的游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言...
"cocos2d-x windows vs2010 配置详解" 本文将详细介绍如何在 Windows 环境下使用 Visual Studio 2010 配置 Cocos2d-x 游戏引擎。Cocos2d-x 是一个跨平台的游戏引擎,可以在多种平台上运行,包括 Windows、Mac OS X...
同时,cocos2d-x还集成了物理引擎Box2D,使得游戏中的物体运动和碰撞处理变得更加真实。 下载“cocos2d-x-cocos2d-x-2.2.2.zip”后,你需要运行“download-deps.py”脚本来下载依赖库。这个脚本会自动处理安装过程...
cocos2d-x 是一个开源的游戏开发框架,使用 C++ 语言编写,支持多平台发布,包括 iOS、Android、Windows、macOS、Linux 和 Web。cocos2d-x v3.16 是该框架的一个版本号,本文档主要介绍了该版本的安装流程以及环境...
《cocos2d-x 3.8:经典游戏引擎源码解析》 cocos2d-x 是一个跨平台的游戏开发框架,它基于C++,同时提供了Lua和JavaScript的绑定,让开发者可以方便地在多种操作系统上创建2D游戏、演示程序和其他图形交互应用。这...
总结,cocos2d-x 集成 ShareSDK 进行 iOS 和 Android 平台的微信分享,主要包括以下步骤: 1. 注册微信开放平台应用并获取 AppId。 2. 下载 ShareSDK for cocos2dx 组件并放入项目。 3. 修改 appdelegate.cpp 文件...
12. **扩展与插件**:社区提供的各种扩展库和插件,如社交网络集成、广告支持、IAP(应用内购买)等,丰富了Cocos2d-x的功能。 13. **工具集**:包含了一个完整的工具链,如Cocos Studio用于界面设计,Cocos ...
《cocos2d-x 动画工具 Flash2Cocos2d-x 1.3:将Flash创意带入移动游戏开发》 在移动游戏开发领域,cocos2d-x是一款广泛使用的开源游戏引擎,以其高效、跨平台的特性深受开发者喜爱。而Flash2Cocos2d-x则是一个专为...
《Cocos2d-x实战C++卷》是关东升所著的一本深入探讨Cocos2d-x游戏引擎开发的专业书籍。Cocos2d-x是一个开源的、跨平台的2D游戏开发框架,广泛应用于iOS、Android、Windows等多个操作系统。本书以C++语言为主要编程...
Cocos2d-x 3.x游戏开发之旅教程及完整源码下载,使用最新cocos2d-x-3.14版本,在xcode7.3上已编译通过。 解决相关问题 1、解决源程序在高版本上无法编译问题 2、解决源程序中文注释部分,xcode上显示乱码问题 使用...
《cocos2d-x 3.0:游戏开发中的角色移动技术详解》 在游戏开发领域,cocos2d-x是一款广泛使用的开源2D游戏引擎,尤其在移动平台上的应用非常广泛。cocos2d-x 3.0版本带来了许多性能优化和新特性,使得开发者能够更...
《Cocos2d-x实战 JS卷 Cocos2d-JS开发》是一本深入探讨Cocos2d-x游戏引擎JavaScript版本使用的专业书籍。Cocos2d-x是全球范围内广泛采用的游戏开发框架,尤其适用于2D游戏的制作,而Cocos2d-JS则是其JavaScript接口...
标题中提到了"Cocos2d-x实战++JS卷++Cocos2d-JS开发+PDF电子书下载+带书签目录+完整",这里面包含了几个关键知识点: 1. Cocos2d-x:是一个开源的游戏开发框架,它主要用于开发跨平台的游戏和应用程序,支持iOS、...
《cocos2d-x 2.1.4:探索移动游戏开发的新篇章》 cocos2d-x 是一个跨平台的2D游戏开发框架,它为开发者提供了强大的工具和技术支持,使得游戏开发变得更为便捷。2.1.4 版本是这个框架的一个重要里程碑,它在前一...
### cocos2d-iphone至cocos2d-html5移植之旅:深入解析与实践指南 #### 引言 在数字化时代,跨平台游戏开发成为了一种趋势,尤其在移动设备和网页端之间的转换变得日益频繁。《cocos2d-iphone至cocos2d-html5移植...
cocos2d-x-2.1.5