最近在项目中集成了分享的功能,坑还是挺多的,总结一下。
下载SDK
首先下载官网的 SDK。可以把 Demo 一并下载,看着官方的示例程序来做,遇到坑再回头看看我的流程。
下载地址:http://www.mob.com/#/downloadDetail/ShareSDK/ios
选择要集成到项目中的分享
在项目中集成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
#import
//腾讯开放平台(对应QQ和QQ空间)SDK头文件
#import
#import
//微信SDK头文件
#import "WXApi.h"
//新浪微博SDK头文件
#import "WeiboSDK.h"
//新浪微博SDK需要在项目Build Settings中的Other Linker Flags添加"-ObjC"
//人人SDK头文件
#import
在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
#import
分享
// 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的支持(为了分享成功,做什么都愿意),操作如下图:
好不容易编译成功,运行报错了,错误如下:
解决方式,如图:
1、在plist
文件添加节点:App Transport Security Settings。
2、在刚才添加的节点下,添加:Allow Arbitrary Loads,值为YES。
接着继续运行,出现了另外的问题,如下:
解决方案:
1、编辑如图所示的值,删除armv7s。
2、在Other Linker Flags 中添加 ObjC 。
这样就可以编译成功并且成功运行了,如图。
注意:要先在真机上安装了QQ、微信等社交软件,ShareSDK弹出的菜单才会有相应的图标。
界面可以显示了,但实际分享的时候还是会报错,如图:
需要在plist
文件进行如下配置:
配置 plist 文件里面的白名单和 URL Scheme 的设置
具体配置如图所示,我会把相应的XML文件放在下面,大家可以直接复制粘贴,注意别影响到你项目中已有的配置文件。
解释几点: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文件。
CFBundleURLTypes
CFBundleTypeRole
Editor
CFBundleURLSchemes
wx4868b35061f87885
tencent100371282
QQ05FB8B52
LSApplicationQueriesSchemes
wechat
weixin
mqqapi
mqq
mqqOpensdkSSoLogin
mqqconnect
mqqopensdkdataline
mqqopensdkgrouptribeshare
mqqopensdkfriend
mqqopensdkapi
mqqopensdkapiV2
mqqopensdkapiV3
mqzoneopensdk
wtloginmqq
wtloginmqq2
mqqwpa
mqzone
mqzonev2
mqzoneshare
wtloginqzone
mqzonewx
mqzoneopensdkapiV2
mqzoneopensdkapi19
mqzoneopensdkapi
mqqbrowser
mttbrowser
NSAppTransportSecurity
NSAllowsArbitraryLoads
CFBundleDevelopmentRegion
en
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
$(PRODUCT_BUNDLE_IDENTIFIER)
CFBundleInfoDictionaryVersion
6.0
CFBundleName
$(PRODUCT_NAME)
CFBundlePackageType
APPL
CFBundleShortVersionString
1.0
CFBundleSignature
????
CFBundleVersion
1
LSRequiresIPhoneOS
UILaunchStoryboardName
LaunchScreen
UIMainStoryboardFile
Main
UIRequiredDeviceCapabilities
armv7
UISupportedInterfaceOrientations
UIInterfaceOrientationPortrait
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
总的来说,ShareSDK 的官方文档还是足够清晰了。大家有什么其他的BUG欢迎留言分享。