美文网首页iOS_Skill_Collect
iOS 集成 ShareSDK 分享

iOS 集成 ShareSDK 分享

作者: 張無忌 | 来源:发表于2016-07-06 09:56 被阅读2961次

最近在项目中集成了分享的功能,坑还是挺多的,总结一下。

下载SDK

首先下载官网的 SDK。可以把 Demo 一并下载,看着官方的示例程序来做,遇到坑再回头看看我的流程。

下载地址:http://www.mob.com/#/downloadDetail/ShareSDK/ios

选择要集成到项目中的分享


选择需要集成的项目.png

在项目中集成SDK

直接把 ShareSDK 文件目录拖入自己的项目中,注意选择的方式,如图所示。可以在平台文件夹里面,删除一些自己不想集成的分享。

要拖入的文件夹 拖入项目的方式

加入所需的依赖库

在项目中打开如图所示界面,可以看到已经引入了一些依赖,这些是刚才拖入 SDK 文件夹的时候自动就引入进去的。

添加依赖库的方式

还有另外一些需要自己手动加进入,其中必须添加的依赖库如下。(注意:Xcode 7 下 .dylib库后缀名更改为.tbd)

必须引入的:
libicucore.dylib
libz.dylib
libstdc++.dylib
JavaScriptCore.framework

以下依赖库根据社交平台添加:

新浪微博SDK依赖库 
ImageIO.framework
libsqlite3.dylib
QQ好友和QQ空间SDK依赖库 
libsqlite3.dylib
微信SDK依赖库 
libsqlite3.dylib
短信和邮件需要依赖库 
MessageUI.framework

设置 AppDelegate.m 文件

这些头文件,在AppDelegate.m文件里面引入。

#import <ShareSDK/ShareSDK.h>
#import <ShareSDKConnector/ShareSDKConnector.h>
 
//腾讯开放平台(对应QQ和QQ空间)SDK头文件
#import <TencentOpenAPI/TencentOAuth.h>
#import <TencentOpenAPI/QQApiInterface.h>
 
//微信SDK头文件
#import "WXApi.h"
 
//新浪微博SDK头文件
#import "WeiboSDK.h"
//新浪微博SDK需要在项目Build Settings中的Other Linker Flags添加"-ObjC"
 
//人人SDK头文件
#import <RennSDK/RennSDK.h>

didFinishLaunchingWithOptions方法中加入如下代码。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    /**
     *  设置ShareSDK的appKey,如果尚未在ShareSDK官网注册过App,请移步到http://mob.com/login 登录后台进行应用注册
     *  在将生成的AppKey传入到此方法中。
     *  方法中的第二个第三个参数为需要连接社交平台SDK时触发,
     *  在此事件中写入连接代码。第四个参数则为配置本地社交平台时触发,根据返回的平台类型来配置平台信息。
     *  如果您使用的时服务端托管平台信息时,第二、四项参数可以传入nil,第三项参数则根据服务端托管平台来决定要连接的社交SDK。
     */

    // 这里的iosv1101要替换成你在ShareSDK官网注册时得到的AppKey
    [ShareSDK registerApp:@"iosv1101"
     
          // 这个数组装的都是分享时会展示出来的应用,可以根据自己需要来进行删减,比如 GooglePlus 我一般就删掉了
          activePlatforms:@[
                            @(SSDKPlatformTypeSinaWeibo),
                            @(SSDKPlatformTypeMail),
                            @(SSDKPlatformTypeSMS),
                            @(SSDKPlatformTypeCopy),
                            @(SSDKPlatformTypeWechat),
                            @(SSDKPlatformTypeQQ),
                            @(SSDKPlatformTypeRenren),
                            @(SSDKPlatformTypeGooglePlus)]
                 onImport:^(SSDKPlatformType platformType)
     { 
        // 改动以下代码要注意,一个case对应一个break
         switch (platformType)
         {
             case SSDKPlatformTypeWechat:
                 [ShareSDKConnector connectWeChat:[WXApi class]];
                 break;
             case SSDKPlatformTypeQQ:
                 [ShareSDKConnector connectQQ:[QQApiInterface class] tencentOAuthClass:[TencentOAuth class]];
                 break;
             case SSDKPlatformTypeSinaWeibo:
                 [ShareSDKConnector connectWeibo:[WeiboSDK class]];
                 break;
             case SSDKPlatformTypeRenren:
                 [ShareSDKConnector connectRenren:[RennClient class]];
                 break;
             default:
                 break;
         }
     }
          onConfiguration:^(SSDKPlatformType platformType, NSMutableDictionary *appInfo)
     {
         
        // 以下的AppKey和appSecret都是 ShareSDK 官方程序带的,测试的时候可以用用,建议用自己去申请的。QQ、微信、微博授权都得分别去对应的开发者平台去申请
         switch (platformType)
         {
             case SSDKPlatformTypeSinaWeibo:
                 //设置新浪微博应用信息,其中authType设置为使用SSO+Web形式授权
                 [appInfo SSDKSetupSinaWeiboByAppKey:@"568898243"
                                           appSecret:@"38a4f8204cc784f81f9f0daaf31e02e3"
                                         redirectUri:@"http://www.sharesdk.cn"
                                            authType:SSDKAuthTypeBoth];
                 break;
             case SSDKPlatformTypeWechat:
                 [appInfo SSDKSetupWeChatByAppId:@"wx4868b35061f87885"
                                       appSecret:@"64020361b8ec4c99936c0e3999a9f249"];
                 break;
             case SSDKPlatformTypeQQ:
                 [appInfo SSDKSetupQQByAppId:@"100371282"
                                      appKey:@"aed9b0303e3ed1e27bae87c33761161d"
                                    authType:SSDKAuthTypeBoth];
                 break;
             case SSDKPlatformTypeRenren:
                 [appInfo        SSDKSetupRenRenByAppId:@"226427"
                                                 appKey:@"fc5b8aed373c4c27a05b712acba0f8c3"
                                              secretKey:@"f29df781abdd4f49beca5a2194676ca4"
                                               authType:SSDKAuthTypeBoth];
                 break;
             // 如果上面代码已经把 GooglePlus 排除掉了,那么这里也要删除,不过不删除也没什么
             case SSDKPlatformTypeGooglePlus:
                 [appInfo SSDKSetupGooglePlusByClientID:@"232554794995.apps.googleusercontent.com"
                                           clientSecret:@"PEdFgtrMw97aCvf0joQj7EMk"
                                            redirectUri:@"http://localhost"];
                 break;
             default:
                 break;
         }
     }];
    return YES;
}

调用分享功能

代码上配置就结束了,接下来在你需要进行分享操作的地方,做以下操作。

引入头文件

#import <ShareSDK/ShareSDK.h>
#import <ShareSDKUI/ShareSDK+SSUI.h>

分享

// 1、创建分享参数
NSArray* imageArray = @[[UIImage imageNamed:@"shareImg.png"]];
//(注意:图片必须要在Xcode左边目录里面,名称必须要传正确,如果要分享网络图片,可以这样传iamge参数 images:@[@"http://mob.com/Assets/images/logo.png?v=20150320"])
    if (imageArray) {
        
        NSMutableDictionary *shareParams = [NSMutableDictionary dictionary];
        [shareParams SSDKSetupShareParamsByText:@"分享内容"
                                         images:imageArray
                                            url:[NSURL URLWithString:@"http://mob.com"]
                                          title:@"分享标题"
                                           type:SSDKContentTypeAuto];
        //2、分享(可以弹出我们的分享菜单和编辑界面)
        [ShareSDK showShareActionSheet:nil //要显示菜单的视图, iPad版中此参数作为弹出菜单的参照视图,只有传这个才可以弹出我们的分享菜单,可以传分享的按钮对象或者自己创建小的view 对象,iPhone可以传nil不会影响
                                 items:nil
                           shareParams:shareParams
                   onShareStateChanged:^(SSDKResponseState state, SSDKPlatformType platformType, NSDictionary *userData, SSDKContentEntity *contentEntity, NSError *error, BOOL end) {
                       
                       switch (state) {
                           case SSDKResponseStateSuccess:
                           {
                               UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"分享成功"
                                                                                   message:nil
                                                                                  delegate:nil
                                                                         cancelButtonTitle:@"确定"
                                                                         otherButtonTitles:nil];
                               [alertView show];
                               break;
                           }
                           case SSDKResponseStateFail:
                           {
                               UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"分享失败"
                                                                               message:[NSString stringWithFormat:@"%@",error]
                                                                              delegate:nil
                                                                     cancelButtonTitle:@"OK"
                                                                     otherButtonTitles:nil, nil];
                               [alert show];
                               break;
                           }
                           default:
                               break;
                       }
                   }
         ];}

代码排版稍微有点乱,官方示例程序就是这个样子,大家可以根据自己的喜好进行排版或者重构。到此为止代码上的配置就完成了,接下来才是重头戏,各种问题的解决。

小部分社交平台SDK不支持bitcode。

问题描述:iOS 9 新建项目默认需要支持 bitcode,而不支持 bitcode 的 SDK 会导致无法编译运行。

支持 bitcode 的 SDK:
1、微信SDK
2、QQ SDK
3、新浪微博SDK
4、支付宝SDK
5、Kakao SDK
6、Facebook Messenger

不支持 bitcode:
1、易信 SDK
2、人人 SDK

解决方案:

  • 移除不支持bitcode的平台SDK(这个简单粗暴)
  • 暂时关闭对bitcode的支持(为了分享成功,做什么都愿意),操作如下图:
Paste_Image.png

好不容易编译成功,运行报错了,错误如下:

报错

解决方式,如图:
1、在plist文件添加节点:App Transport Security Settings。
2、在刚才添加的节点下,添加:Allow Arbitrary Loads,值为YES。

Paste_Image.png

接着继续运行,出现了另外的问题,如下:

Paste_Image.png

解决方案:

1、编辑如图所示的值,删除armv7s。


Paste_Image.png

2、在Other Linker Flags 中添加 ObjC 。


Paste_Image.png

这样就可以编译成功并且成功运行了,如图。

注意:要先在真机上安装了QQ、微信等社交软件,ShareSDK弹出的菜单才会有相应的图标。

IMG_0035.PNG

界面可以显示了,但实际分享的时候还是会报错,如图:

QQ分享报错

需要在plist文件进行如下配置:

配置 plist 文件里面的白名单和 URL Scheme 的设置

具体配置如图所示,我会把相应的XML文件放在下面,大家可以直接复制粘贴,注意别影响到你项目中已有的配置文件。


Paste_Image.png

解释几点:URL Schemes里wx开头的那串,代表微信。tencent 100371282是对应的是QQ空间,QQ05FB8B52对应QQ好友分享。100371282是你在腾讯申请的APP ID,05FB8B52是AppID的16进制(如果AppID转换的16进制数不够8位则在前面补0,如转换的是:5FB8B52,则最终填入为:QQ05FB8B52 注意:转换后的字母要大写),转换方式如图:
在终端输入:

echo 'ibase=10;obase=16;100371282'|bc

接下来配置LSApplicationQueriesSchemes,添加的条目如图所示,以下是我的plist的XML文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>wx4868b35061f87885</string>
                <string>tencent100371282</string>
                <string>QQ05FB8B52</string>
            </array>
        </dict>
    </array>
    <key>LSApplicationQueriesSchemes</key>
    <array>
        <string>wechat</string>
        <string>weixin</string>
        <string>mqqapi</string>
        <string>mqq</string>
        <string>mqqOpensdkSSoLogin</string>
        <string>mqqconnect</string>
        <string>mqqopensdkdataline</string>
        <string>mqqopensdkgrouptribeshare</string>
        <string>mqqopensdkfriend</string>
        <string>mqqopensdkapi</string>
        <string>mqqopensdkapiV2</string>
        <string>mqqopensdkapiV3</string>
        <string>mqzoneopensdk</string>
        <string>wtloginmqq</string>
        <string>wtloginmqq2</string>
        <string>mqqwpa</string>
        <string>mqzone</string>
        <string>mqzonev2</string>
        <string>mqzoneshare</string>
        <string>wtloginqzone</string>
        <string>mqzonewx</string>
        <string>mqzoneopensdkapiV2</string>
        <string>mqzoneopensdkapi19</string>
        <string>mqzoneopensdkapi</string>
        <string>mqqbrowser</string>
        <string>mttbrowser</string>
    </array>
    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    <key>CFBundleDevelopmentRegion</key>
    <string>en</string>
    <key>CFBundleExecutable</key>
    <string>$(EXECUTABLE_NAME)</string>
    <key>CFBundleIdentifier</key>
    <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
    <key>CFBundleInfoDictionaryVersion</key>
    <string>6.0</string>
    <key>CFBundleName</key>
    <string>$(PRODUCT_NAME)</string>
    <key>CFBundlePackageType</key>
    <string>APPL</string>
    <key>CFBundleShortVersionString</key>
    <string>1.0</string>
    <key>CFBundleSignature</key>
    <string>????</string>
    <key>CFBundleVersion</key>
    <string>1</string>
    <key>LSRequiresIPhoneOS</key>
    <true/>
    <key>UILaunchStoryboardName</key>
    <string>LaunchScreen</string>
    <key>UIMainStoryboardFile</key>
    <string>Main</string>
    <key>UIRequiredDeviceCapabilities</key>
    <array>
        <string>armv7</string>
    </array>
    <key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>
</dict>
</plist>

总的来说,ShareSDK 的官方文档还是足够清晰了。大家有什么其他的BUG欢迎留言分享。

相关文章

网友评论

  • 5e6b35cd75d3:info.plist里面要加上MOBAppSecret和MOBAppkey这两个字段,在MOBAppKey中设置ShareSDK的appKey
  • 863c73f31933:作者你好,sharesdk新浪分享sso失败,配置信息都看了核对了几遍了,在测试demo里面是可以的,但是放到工程里面就不行了,作者你知道这是什么原因不?
  • 8802fdfcc6dc:QQ好友分享成功 但空间分享失败
    張無忌:@路过怀念 看看配置文件,特别是plist文件配置。

本文标题:iOS 集成 ShareSDK 分享

本文链接:https://www.haomeiwen.com/subject/ttihjttx.html