一款简单实用的iOS分享框架(支持三方登陆)
需求背景:公司需要在项目里面用到三方登陆和分享功能,于是我去翻看了友盟和ShareSDK的官网看了他们分享的代码,感觉官方文档比较乱,所以自己动手写了一款分享框架用于项目中,希望对需要集成分享框架的朋友有所帮助,也可以作为如果自己封装分享框架的参考资料。(注:目前该框架已经在公司项目中稳定运行接近两年;欢迎大家一起来丰富框架内容)
项目GitHub地址:iOS分享框架(支持三方登陆)
功能概览:
-
一、支持微信、朋友圈、小程序、QQ、QQZone、新浪微博分享,并且后续会持续增加分享平台
-
二、支持第三方的登陆功能
-
三、支持个人自定义分享视图以及框架分享视图两种UI选择
-
四、配置哪些平台,当使用框架展示视图时就展示你配置过的平台
-
五、数据配置统一通过model配置,用户根据分享类型选择添加分享参数,项目提供有一份各个平台分享必要参数,用户可通过阅读文档来配置参数
-
六、支持微信iOS适配universal link通用链接配置
框架架构流程图:
架构分析:
LFBChannelManager: 作为整个框架管理类,管理着各个分享平台类的生命周期以及appkey和appsecret的获取。
LFBShareChannelConfig: 主要用于平台appkey和appsecret的配置和获取
效果图
具体用法
安装
CocoaPods
1、可以在Podfile中加入下面一行代码来使用LFBSocialSDK
pod ‘LFBSocialSDK’
手动导入
1、下载LFBSocialSDK文件下所有内容并拖入你的工程中
2、导入 ‘LFBSocialSDK.h’
添加项目配置
在Other Linker Flags加入-Objc, 注意不要手动写为-Objc
-Objc属于链接必备参数,如果不加此项,会导致库文件无法被正确链接,SDK无法正常运行
加入依赖系统库
在General下的Linked Frameworks and Libraries添加系统库
加入以下系统库
libsqlite3.tbd
CoreGraphics.framework
第三方平台库添加
根据集成的不同平台加入相关的依赖库,未列出平台则不需添加添加方式:选中项目Target -> General -> Linked Frameworks and Libraries列表中进行添加
微信(完整版)
精简版无需添加以下依赖库
SystemConfiguration.framework
CoreTelephony.framework
libsqlite3.tbd
libc++.tbd
libz.tbd
QQ(完整版)
精简版无需添加以下依赖库
SystemConfiguration.framework
libc++.tbd
新浪微博(精简版)
Photos.framework
新浪微博(完整版)
SystemConfiguration.framework
CoreTelephony.framework
ImageIO.framework
libsqlite3.tbd
libz.tbd
Photos.framework
配置SSO白名单
如果你的应用使用了如SSO授权登录或跳转到第三方分享功能,在iOS9/10下就需要增加一个可跳转的白名单,即LSApplicationQueriesSchemes,否则将在SDK判断是否跳转时用到的canOpenURL时返回NO,进而只进行webview授权或授权/分享失败。在项目中的info.plist中加入应用白名单,右键info.plist选择source code打开(plist具体设置在Build Setting -> Packaging -> Info.plist File可获取plist路径)请根据选择的平台对以下配置进行裁剪:
LSApplicationQueriesSchemes
/**!-- 微信 URL Scheme 白名单*/
wechat
weixin
/** 新浪微博 URL Scheme 白名单*/
sinaweibohd
sinaweibo
sinaweibosso
weibosdk
weibosdk2.5
/** QQ、Qzone URL Scheme 白名单*/
mqqapi
mqq
mqqOpensdkSSoLogin
mqqconnect
mqqopensdkdataline
mqqopensdkgrouptribeshare
mqqopensdkfriend
mqqopensdkapi
mqqopensdkapiV2
mqqopensdkapiV3
mqqopensdkapiV4
mqzoneopensdk
wtloginmqq
wtloginmqq2
mqqwpa
mqzone
mqzonev2
mqzoneshare
wtloginqzone
mqzonewx
mqzoneopensdkapiV2
mqzoneopensdkapi19
mqzoneopensdkapi
mqqbrowser
mttbrowser
tim
timapi
timopensdkfriend
timwpa
timgamebindinggroup
timapiwallet
timOpensdkSSoLogin
wtlogintim
timopensdkgrouptribeshare
timopensdkapiV4
timgamebindinggroup
timopensdkdataline
wtlogintimV1
timapiV1
/** 支付宝 URL Scheme 白名单*/
alipay
alipayshare
/** 钉钉 URL Scheme 白名单*/
dingtalk
dingtalk-open
/** Linkedin URL Scheme 白名单*/
linkedin
linkedin-sdk2
linkedin-sdk
/** 点点虫 URL Scheme 白名单*/
laiwangsso
/** 易信 URL Scheme 白名单*/
yixin
yixinopenapi
/** instagram URL Scheme 白名单*/
instagram
/** whatsapp URL Scheme 白名单*/
whatsapp
/** line URL Scheme 白名单*/
line
/** Facebook URL Scheme 白名单*/
fbapi
fb-messenger-api
fb-messenger-share-api
fbauth2
fbshareextension
/** Kakao URL Scheme 白名单,注:以下第一个参数需替换为自己的kakao appkey,格式为 kakao + "kakao appkey*/
kakaofa63a0b2356e923f3edd6512d531f546
kakaokompassauth
storykompassauth
kakaolink
kakaotalk-4.5.0
kakaostory-2.9.0
/** pinterest URL Scheme 白名单*/
pinterestsdk.v1
/** Tumblr URL Scheme 白名单*/
tumblr
/** 印象笔记 */
evernote
en
enx
evernotecid
evernotemsg
/** 有道云笔记*/
youdaonote
ynotedictfav
com.youdao.note.todayViewNote
ynotesharesdk
/** Google+*/
gplus
/** Pocket*/
pocket
readitlater
pocket-oauth-v1
fb131450656879143
en-readitlater-5776
com.ideashower.ReadItLaterPro3
com.ideashower.ReadItLaterPro
com.ideashower.ReadItLaterProAlpha
com.ideashower.ReadItLaterProEnterprise
/** VKontakte*/
vk
vk-share
vkauthorize
/** Twitter*/
twitter
twitterauth
配置URL Scheme
-
URL Scheme是通过系统找到并跳转对应app的一类设置,通过向项目中的info.plist文件中加入URL types可使用第三方平台所注册的appkey信息向系统注册你的app,当跳转到第三方应用授权或分享后,可直接跳转回你的app。
-
添加URL Types可工程设置面板设置
权限配置
微博
从微博SDk 3.2.1,即U-Share 6.9.1版开始,支持微博分享多张图片。需在 info.plist 文件中配置相册权限
/** NSPhotoLibraryUsageDescription */
/** App需要您的同意,才能访问相册 */
初始化配置
应用启动后,需要在AppDelegate.m里面配置对应平台的AppKey和AppSecret
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self configChannel];
return YES;
}
- (void)configChannel{
LFBShareChannelConfig *config = [[LFBShareChannelConfig alloc]init];
[[LFBChannelManager sharedManager] setDelegate:config];
[config setChannelType:LFBChannelTypeWX appKey:@"wx515bbc9e05bf9dx80" appSecret:@"1d44d80947bb3821506e440116f73168"];
[config setChannelType:LFBChannelTypePYQ appKey:@"wx515bbc9e05bf9dx80" appSecret:@"1d44d80947bb3821506e440116f73168"];
[config setChannelType:LFBChannelTypeQQ appKey:@"1101053347" appSecret:nil];
[config setChannelType:LFBChannelTypeQQZone appKey:@"1101053237" appSecret:nil];
[config setChannelType:LFBChannelTypeSinaWB appKey:@"1843261032" appSecret:@"b2f5b2b661babaa3c01b57312decffd7"];
}
设置系统回调
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary
基本使用
当用户自定义分享渠道时,有两种调用方式分别如下:
- 带Block回调
LFBSharePlateforms *model = [[LFBSharePlateforms alloc]init];
model.shareType = LFBChannelTypeWX;
model.shareInfoType = LFBShareInfoTypeApplet;
model.title = @"小程序";
model.text = @"大家来找茬!!!";
model.webPageUrl =@"https://tapi.liufuboExample.com/activefront/qrcode/shared_car_get_coupon?coupon_template_id=115";
model.userName = @"gh_a4ff22eef403";
model.path = @"pages/getcoupon?coupon_template_id=115";
model.hdImageData = nil;
model.withShareTicket = YES;
model.miniProgramType = LFBShareMiniInfoTypeRelease;
[LFBShareMoudle shareObject:model completion:^(id sender, LFBChannelType channelType, LFBShareState shareState) {
}];
- 不带block的调用方式
LFBSharePlateforms *model = [[LFBSharePlateforms alloc]init];
model.shareType = LFBChannelTypeWX;
model.shareInfoType = LFBShareInfoTypeApplet;
model.title = @"小程序";
model.text = @"大家来找茬!!!";
model.webPageUrl =@"https://tapi.liufuboExample.com/activefront/qrcode/shared_car_get_coupon?coupon_template_id=115";
model.userName = @"gh_a4ff22eef403";
model.path = @"pages/getcoupon?coupon_template_id=115";
model.hdImageData = nil;
model.withShareTicket = YES;
model.miniProgramType = LFBShareMiniInfoTypeRelease;
[LFBShareMoudle shareObject:model];
使用框架自带UI分享时,调用方式如下:
LFBSharePlateforms *model = [[LFBSharePlateforms alloc]init];
model.shareType = LFBChannelTypeWX;
model.shareInfoType = LFBShareInfoTypeApplet;
model.title = @"小程序";
model.text = @"大家来找茬!!!";
model.webPageUrl =@"https://tapi.liufuboExample.com/activefront/qrcode/shared_car_get_coupon?coupon_template_id=115";
model.userName = @"gh_a4ff22eef403";
model.path = @"pages/getcoupon?coupon_template_id=115";
model.hdImageData = nil;
model.withShareTicket = YES;
model.miniProgramType = LFBShareMiniInfoTypeRelease;
[LFBShareMoudle showShareViewWithObject:model];
关于登陆功能的使用方法:
[LFBShareMoudle loginWithChannelType:LFBChannelTypeWX success:^(LFBChannelBase *channel, id data) {
LFBUserInfo *userInfo = data;
NSLog(@"%@",userInfo.nickname);
} fail:^(LFBChannelBase *channel, NSError *error) {
NSLog(@"%@",error);
} cancel:^(LFBChannelBase *channel) {
NSLog(@"取消操作");
}];
关于升级微信分享SDK(WechatOpenSDK)到1.8.6以后,分享功能无法使用问题。
苹果iOS 13系统版本安全升级,为此WechatOpenSDK在1.8.6版本进行了适配。 1.8.6版本支持Universal Links方式跳转,对openSDK分享进行合法性校验。因为微信SDK的变化,在升级openSDK以后,如果您的LFBSocialSDK不是最新版本,则会导致微信分享调用失败。这里强烈建议您升级LFBSocialSDK到最新版本。
环境要求:
1.SDK版本必须在1.8.6或以上
2.微信版本7.0.7或以上
3.系统版本iOS12或以上
SDK接入指引
1.根据苹果文档配置应用的Universal Links
微信使用第三方App的Universal Links唤起第三方App时,会在Universal Links末尾拼接路径和参数,因此开发者Universal Links配置必须加上通配符,并测试Universal Links拼接字符串能否唤起app
建议Universal Links配置path,例如"/app/* ", 避免全域命中Universal Links跳转
咱们以路劲applesite为例:
{
"applinks": {
"apps": [],
"details": [{
"appID": "6VUB45YDCB.com.yxyt.YXYT",
"paths": ["/applesite/*"]
}]
}
}
注意:这里的appID格式为: TeamID(apple developer开发者账号登陆后可获取)+ . + BundleID(App项目可以查看)
path这里可以直接填 " * " 也可以填写路劲并带*
这里需要将该json文件上传至服务器根目录下,这里假设根域名为www.social.com,则通过通过https://www.social.com/apple-app-site-association访问可以查看到文件内容或者下载本地配置则成功。咱们还可以通过苹果提供的 验证网址 来直接验证apple-app-site-association设置是否生效。
2.微信开放平台配置Universal Links
3.登录苹果开发者后台,在设置证书的页面找到 Identifiers -> App ID(设置包名)里,在对应的BundleId下勾选 Associated Domains如下图,然后保存设置,然后重新生成配置文件。
4.在 Xcode 中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏下的“URL type“添加“URL scheme”为你所注册的应用程序 id:在“LSApplicationQueriesSchemes“添加weixin 和weixinULAPI(如下图所示)
image
5.打开Associated Domains开关,将Universal Links域名加到配置上
注意点:在 Associated Domains里面配置的Universal Links必须要以applinks:开头,后面写上域名。
例如:applinks:www.social.com
配置成功以后,咱们就可以来验证一下Universal Links是否生效
SDK成功验证指引
1.确认微信的 Universal Links
能正常访问
首先,确认微信(7.0.7或以上版本)的Universal Links在设备上正常,以确保openSDK与微信双向使用Universal Links通信,Safari输入您配置好的通用连接,下拉查看是否有打开微信入口(如下图)。若无入口,可能是App的Universal Links配置有问题,或者网络状态异常。
2.连续发起分享,确认不会发生多次二次跳转行为
当用户首次使用新版本SDK发起分享时,将会出现如下交互流程:从App拉起微信-出现“正在连接”页面-返回App-重新打开微信。以上是新的安全验证流程,每个用户在首次使用时会出现上述跳转。(如同一用户多次使用分享都出现跳转,请按照以下接入指引,检查Universal Links配置)
3.如App有使用微信授权登录功能,确认授权不出现二次确认弹窗
授权登录如出现以下二次确认弹窗,原因是微信无法通过App提供的Universal Links返回导致,很可能是App的Universal Links不生效,请按照接入指引检查Universal Links配置
使用手则:
1.配置appkey和secret这里需要多配置一项UniversalLink字段,对于QQ、新浪微博等平台没用到该功能的UniversalLink字段直接传nil即可。
2.重写AppDelegate或SceneDelegate的continueUserActivity方法: 注意:适配了SceneDelegate的App,系统将会回调SceneDelegate的continueUserActivity方法,所以需要重写SceneDelegate的该方法。
AppDelegate:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void(^)(NSArray<id<UIUserActivityRest
oring>> * __nullable restorableObjects))restorationHandler {
return [[LFBChannelManager sharedManager] handleOpenUniversalLink:userActivity];
}
SceneDelegate:
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
[[LFBChannelManager sharedManager] handleOpenUniversalLink:userActivity];
}
版本更新
- v1.0.4 修复了小程序分享预览图和缩略图过大,导致分享失败的问题
- v1.0.5 统一提供各平台是否支持分享的API接口
- v1.0.6 升级微信开发平台SDK版本,支持通用链接
universal Link
的配置
后话
LFBSocialSDK总体架构设计简单清晰,比较适合快速集成到项目中使用,目前暂时仅支持微信、朋友圈、QQ、QQ空间等平台的分享和登陆,后期会在此基础上支持更多的平台。
希望本文能为你带来帮助。