• 我的cocos2d-x集成sharesdk之旅(转)


    链接地址: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] = “″; 

        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 %s”, SocialShare::shareSocialShare()->weiboGetUserId(SOCIALSHARE_SINAWEIBO_NAME).c_str()); 



    void MainMenuLayer::onweiboname(CCObject* sender) 



             CCLOG(“MainMenuLayer::onweiboname %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,那么你来对地方了,这里可以解决你的烦恼,欢迎技术探讨与交流,博文中提供的代码片段已经足够帮助理解和使用了,对于求代码者,我只能“呵呵”了。

    如果一件事情你觉得难的完不成,你可以把它分为若干步,并不断寻找合适的方法。最后你发现你会是个超人。不要给自己找麻烦,但遇到麻烦绝不怕,更不要退缩。 电工查找电路不通点的最快方法是:分段诊断排除,快速定位。你有什么启示吗? 求知若饥,虚心若愚。 当你对一个事情掌控不足的时候,你需要做的就是“梳理”,并制定相应的规章制度,并使资源各司其职。
  • 相关阅读:
    序一
    Python3 网络爬虫开发实战
    爬虫笔记
    celery
    用yield实现协程 和asyncio模块
    Django学习之完成数据库主从复制、读写分离和一主多从情况下的使用办法
    Django学习之缓存和信号
    Django学习之Django-debug-toobar
    Python面向对象
    Python中 if __name__ == "__main__" 的理解
  • 原文地址:https://www.cnblogs.com/wvqusrtg/p/5063526.html
Copyright © 2020-2023  润新知