一款简单实用的iOS分享框架(支持三方登陆)

一款简单实用的iOS分享框架(支持三方登陆)

需求背景:公司需要在项目里面用到三方登陆和分享功能,于是我去翻看了友盟和ShareSDK的官网看了他们分享的代码,感觉官方文档比较乱,所以自己动手写了一款分享框架用于项目中,希望对需要集成分享框架的朋友有所帮助,也可以作为如果自己封装分享框架的参考资料。(注:目前该框架已经在公司项目中稳定运行接近两年;欢迎大家一起来丰富框架内容)

项目GitHub地址:iOS分享框架(支持三方登陆)

功能概览:

  • 一、支持微信、朋友圈、小程序、QQ、QQZone、新浪微博分享,并且后续会持续增加分享平台

  • 二、支持第三方的登陆功能

  • 三、支持个人自定义分享视图以及框架分享视图两种UI选择

  • 四、配置哪些平台,当使用框架展示视图时就展示你配置过的平台

  • 五、数据配置统一通过model配置,用户根据分享类型选择添加分享参数,项目提供有一份各个平台分享必要参数,用户可通过阅读文档来配置参数

  • 六、支持微信iOS适配universal link通用链接配置

框架架构流程图:

流程图.png

架构分析:

LFBChannelManager: 作为整个框架管理类,管理着各个分享平台类的生命周期以及appkey和appsecret的获取。
LFBShareChannelConfig: 主要用于平台appkey和appsecret的配置和获取

效果图

IMG_5567.GIF

具体用法

安装

CocoaPods

1、可以在Podfile中加入下面一行代码来使用LFBSocialSDK

pod ‘LFBSocialSDK’

手动导入

1、下载LFBSocialSDK文件下所有内容并拖入你的工程中

2、导入 ‘LFBSocialSDK.h’

添加项目配置

在Other Linker Flags加入-Objc, 注意不要手动写为-Objc

image

-Objc属于链接必备参数,如果不加此项,会导致库文件无法被正确链接,SDK无法正常运行

加入依赖系统库

在General下的Linked Frameworks and Libraries添加系统库

image

加入以下系统库


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可工程设置面板设置

image

权限配置

微博

从微博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

image

3.登录苹果开发者后台,在设置证书的页面找到 Identifiers -> App ID(设置包名)里,在对应的BundleId下勾选 Associated Domains如下图,然后保存设置,然后重新生成配置文件。
image

4.在 Xcode 中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏下的“URL type“添加“URL scheme”为你所注册的应用程序 id:在“LSApplicationQueriesSchemes“添加weixin 和weixinULAPI(如下图所示)

image

5.打开Associated Domains开关,将Universal Links域名加到配置上

image

注意点:在 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配置有问题,或者网络状态异常。

image

2.连续发起分享,确认不会发生多次二次跳转行为

当用户首次使用新版本SDK发起分享时,将会出现如下交互流程:从App拉起微信-出现“正在连接”页面-返回App-重新打开微信。以上是新的安全验证流程,每个用户在首次使用时会出现上述跳转。(如同一用户多次使用分享都出现跳转,请按照以下接入指引,检查Universal Links配置)

image

3.如App有使用微信授权登录功能,确认授权不出现二次确认弹窗

授权登录如出现以下二次确认弹窗,原因是微信无法通过App提供的Universal Links返回导致,很可能是App的Universal Links不生效,请按照接入指引检查Universal Links配置

image

使用手则:

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空间等平台的分享和登陆,后期会在此基础上支持更多的平台。

希望本文能为你带来帮助。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值