美文网首页iOS编程
swift-友盟分享

swift-友盟分享

作者: 梦回蓝桥 | 来源:发表于2019-04-30 17:51 被阅读0次

    分享、推送、支付不知做过多少遍了,却从来没总结过,然后每次再做的时候又是各种看文档,很是繁琐,索性抽空来总结一下,方便以后使用

    本篇文章主要包含以下几个模块
    1:友盟分享的集成
    2:友盟分享与支付宝、微信支付冲突解决
    3:分享模块代码封装

    友盟文档说明

    友盟分享、推送、统计都有以下三个依赖库,其中'UMCCommon'必须集成,其他两个是可选项
    ``

    pod 'UMCCommon'
    pod 'UMCSecurityPlugins'//可选项:安全组件,有效的防止刷量和反作弊等行为
    pod 'UMCCommonLog'//可选项:日志库,调试使用,可测试时集成,上线时删除
    


    也就是说不管你集成分享、推送、统计中的一个或多个,这个依赖库必须添加

    友盟统计SDK

     pod 'UMCAnalytics'
    

    友盟推送SDK

    pod 'UMCPush'
    


    友盟分享SDK

    # U-Share SDK UI模块(分享面板,建议添加)
    pod 'UMCShare/UI'
    
    # 集成微信(精简版0.2M)
    pod 'UMCShare/Social/ReducedWeChat'
    
    # 集成微信(完整版14.4M)
    pod 'UMCShare/Social/WeChat'
    
    # 集成QQ/QZone/TIM(精简版0.5M)
    pod 'UMCShare/Social/ReducedQQ'
    
    # 集成QQ/QZone/TIM(完整版7.6M)
    pod 'UMCShare/Social/QQ'
    
    # 集成新浪微博(精简版1M)
    pod 'UMCShare/Social/ReducedSina'
    
    # 集成新浪微博(完整版25.3M)
    pod 'UMCShare/Social/Sina'
    
    # 集成Facebook/Messenger
    pod 'UMCShare/Social/Facebook'
    
    # 集成Twitter
    pod 'UMCShare/Social/Twitter'
    
    # 集成支付宝
    pod 'UMCShare/Social/AlipayShare'
    
    # 集成钉钉
    pod 'UMCShare/Social/DingDing'
    
    # 集成豆瓣
    pod 'UMCShare/Social/Douban'
    
    # 集成人人
    pod 'UMCShare/Social/Renren'
    
    # 集成腾讯微博
    pod 'UMCShare/Social/TencentWeibo'
    
    # 集成易信
    pod 'UMCShare/Social/YiXin'
    
    # 集成Flickr
    pod 'UMCShare/Social/Flickr'
    
    # 集成Kakao
    pod 'UMCShare/Social/Kakao'
    
    # 集成Tumblr
    pod 'UMCShare/Social/Tumblr'
    
    # 集成Pinterest
    pod 'UMCShare/Social/Pinterest'
    
    # 集成Instagram
    pod 'UMCShare/Social/Instagram'
    
    # 集成Line
    pod 'UMCShare/Social/Line'
    
    # 集成WhatsApp
    pod 'UMCShare/Social/WhatsApp'
    
    # 集成有道云笔记
    pod 'UMCShare/Social/YouDao'
    
    # 集成印象笔记
    pod 'UMCShare/Social/EverNote'
    
    # 集成Google+
    pod 'UMCShare/Social/GooglePlus'
    
    # 集成Pocket
    pod 'UMCShare/Social/Pocket'
    
    # 集成DropBox
    pod 'UMCShare/Social/DropBox'
    
    # 集成VKontakte
    pod 'UMCShare/Social/VKontakte'
    
    # 集成邮件
    pod 'UMCShare/Social/Email'
    
    # 集成短信
    pod 'UMCShare/Social/SMS'
    


    友盟cocoapods集成分享、推送、统计 "说明文档" 链接

    一:集成友盟分享

    友盟分享
    项目中分享使用了微信、微信朋友圈、QQ、QQ空间,分享页面是自定义的,所以不需要集成 pod 'UMCShare/UI'

    1: 想实现分享功能,你需要到相应的开放平台注册应用获取需要的appKey/appID、appSecret

    以微信为例

    首先进入 微信开放平台 注册应用,通过审核后获取appID、appSecret(前端不需要),然后上传app的Bundle ID,如果需要微信登录功能,需要申请微信登录权限,注意微信登录有效期为一年,需要按时在微信平台认证

    项目微信开放平台图片.jpeg 友盟官方提供的实例图.jpeg 实际图.jpeg

    因为qq互联开放平台不是使用自己的qq号注册的,所以暂不演示了值得说明的是QQ及Qzone使用同一个AppID及App-key

    pod中相关库.jpeg

    至于分享为什么用精简版,后面会有说明

    2:项目配置

    以下为友盟提供的项目配置流程:

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

    友盟提供设置objc.jpeg
    -ObjC属于链接库必备参数,如果不加此项,会导致库文件无法被正确链接,SDK无法正常运行
    加入依赖系统库
    友盟提供添加依赖库.jpeg
    //不是只添加这两个依赖库的,还需要根据你分享的平台按需添加相应平台分享功能的依赖库,如下说明
    libsqlite3.tbd
    CoreGraphics.framework
    


    然后不同的分享平台(有的拥有完整版/精简版区别)需要添加的依赖库也不尽相同,可参考 U-Share集成文档 按照自己的需求添加

    3:配置SSO白名单

    如果你的应用使用了如SSO授权登录或跳转到第三方分享功能,在iOS9/10下就需要增加一个可跳转的白名单,即LSApplicationQueriesSchemes,否则将在SDK判断是否跳转时用到的canOpenURL时返回NO,进而只进行webview授权或授权/分享失败。在项目中的info.plist中加入应用白名单,右键info.plist选择source code打开(plist具体设置在Build Setting -> Packaging -> Info.plist File可获取plist路径)请根据选择的平台对以下配置进行裁剪:

    <key>LSApplicationQueriesSchemes</key>
    <array>
    <!-- 微信 URL Scheme 白名单-->
    <string>wechat</string>
    <string>weixin</string>
    
    <!-- 新浪微博 URL Scheme 白名单-->
    <string>sinaweibohd</string>
    <string>sinaweibo</string>
    <string>sinaweibosso</string>
    <string>weibosdk</string>
    <string>weibosdk2.5</string>
    
    <!-- QQ、Qzone URL Scheme 白名单-->
    <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>mqqopensdkapiV4</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>
    <string>tim</string>
    <string>timapi</string>
    <string>timopensdkfriend</string>
    <string>timwpa</string>
    <string>timgamebindinggroup</string>
    <string>timapiwallet</string>
    <string>timOpensdkSSoLogin</string>
    <string>wtlogintim</string>
    <string>timopensdkgrouptribeshare</string>
    <string>timopensdkapiV4</string>
    <string>timgamebindinggroup</string>
    <string>timopensdkdataline</string>
    <string>wtlogintimV1</string>
    <string>timapiV1</string>
    
    <!-- 支付宝 URL Scheme 白名单-->
    <string>alipay</string>
    <string>alipayshare</string>
    
    <!-- 钉钉 URL Scheme 白名单-->
      <string>dingtalk</string>
      <string>dingtalk-open</string>
    
    <!--Linkedin URL Scheme 白名单-->
    <string>linkedin</string>
    <string>linkedin-sdk2</string>
    <string>linkedin-sdk</string>
    
    <!-- 点点虫 URL Scheme 白名单-->
    <string>laiwangsso</string>
    
    <!-- 易信 URL Scheme 白名单-->
    <string>yixin</string>
    <string>yixinopenapi</string>
    
    <!-- instagram URL Scheme 白名单-->
    <string>instagram</string>
    
    <!-- whatsapp URL Scheme 白名单-->
    <string>whatsapp</string>
    
    <!-- line URL Scheme 白名单-->
    <string>line</string>
    
    <!-- Facebook URL Scheme 白名单-->
    <string>fbapi</string>
    <string>fb-messenger-api</string>
    <string>fb-messenger-share-api</string>
    <string>fbauth2</string>
    <string>fbshareextension</string>
    
    <!-- Kakao URL Scheme 白名单-->  
    <!-- 注:以下第一个参数需替换为自己的kakao appkey--> 
    <!-- 格式为 kakao + "kakao appkey"-->    
    <string>kakaofa63a0b2356e923f3edd6512d531f546</string>
    <string>kakaokompassauth</string>
    <string>storykompassauth</string>
    <string>kakaolink</string>
    <string>kakaotalk-4.5.0</string>
    <string>kakaostory-2.9.0</string>
    
    <!-- pinterest URL Scheme 白名单-->  
    <string>pinterestsdk.v1</string>
    
    <!-- Tumblr URL Scheme 白名单-->  
    <string>tumblr</string>
    
    <!-- 印象笔记 -->
    <string>evernote</string>
    <string>en</string>
    <string>enx</string>
    <string>evernotecid</string>
    <string>evernotemsg</string>
    
    <!-- 有道云笔记-->
    <string>youdaonote</string>
    <string>ynotedictfav</string>
    <string>com.youdao.note.todayViewNote</string>
    <string>ynotesharesdk</string>
    
    <!-- Google+-->
    <string>gplus</string>
    
    <!-- Pocket-->
    <string>pocket</string>
    <string>readitlater</string>
    <string>pocket-oauth-v1</string>
    <string>fb131450656879143</string>
    <string>en-readitlater-5776</string>
    <string>com.ideashower.ReadItLaterPro3</string>
    <string>com.ideashower.ReadItLaterPro</string>
    <string>com.ideashower.ReadItLaterProAlpha</string>
    <string>com.ideashower.ReadItLaterProEnterprise</string>
    
    <!-- VKontakte-->
    <string>vk</string>
    <string>vk-share</string>
    <string>vkauthorize</string>
    
    <!-- Twitter-->
    <string>twitter</string>
    <string>twitterauth</string>
    </array>
    


    按需配置吧

    4:配置URL Scheme

    URL Scheme是通过系统找到并跳转对应app的一类设置,通过向项目中的info.plist文件中加入URL types可使用第三方平台所注册的appkey信息向系统注册你的app,当跳转到第三方应用授权或分享后,可直接跳转回你的app。

    添加URL Types的工程面板设置

    WechatIMG20976.jpeg

    微信:wx+appID
    qq需要添加两个,如下
    1、"tencent"+腾讯QQ互联应用appID//例如:tencent100424468 
    //转换方法终端中输入 echo 'ibase=10;obase=16;"你的appID"'|bc回车
    2、“QQ”+腾讯QQ互联应用appID转换成十六进制(不足8位前面补0)//例如:QQ05fc5b14
    微博:wb+appID
    


    更多配置看这里

    我项目中的配置如下:

    项目实际Types设置.jpeg

    这样,友盟分享的准备工作就完成了,开始在项目中使用

    5:项目中实现分享

    因为我项目是使用swift写的,所以需要在桥接文件中倒入如下配置


    桥接文件中倒入相应的库.jpeg

    然后就是友盟的初始化设置,并配置需要分享的平台信息

    //设置友盟appKey
    UMConfigure.initWithAppkey(umengAppKey, channel: "App Store")
    //打开日志
    UMConfigure.setLogEnabled(true)
    //配置分享平台信息
    self.configUMShareSetting()
    


    func configUMShareSetting(){
        //微信
        UMSocialManager.default()?.setPlaform(UMSocialPlatformType.wechatSession, appKey: WXAppID, appSecret: nil, redirectURL: nil)
        //qq
        UMSocialManager.default()?.setPlaform(UMSocialPlatformType.QQ, appKey: QQAppID, appSecret: nil, redirectURL: nil)
        //qqZone
        UMSocialManager.default()?.setPlaform(UMSocialPlatformType.qzone, appKey: QQAppID, appSecret: nil, redirectURL: nil)
    }
    


    设置回调方法

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
        let result:Bool = UMSocialManager.default()?.handleOpen(url, options: options) ?? false
        if !result {
            //其他如支付等回调
        }
        return result
    }
    


    然后在需要调用分享的地方实现如下类似的方法

    func sendDataToSharePlatform(type:UMSocialPlatformType,dic:NSDictionary,presentVc:UIViewController){
        
        let image:UIImage = UIImage(named: dic["image"] as! String)!
        let text:NSString = dic["text"] as! NSString
        var urlStr:NSString = dic["url"] as! NSString
        let titleStr:NSString = dic["title"] as! NSString
        if urlStr.length <= 0 {
            urlStr = "https://h5.51jiashuju.com"
        }
        let messageObject = UMSocialMessageObject.init()
        messageObject.text = text as String
        let shareObject:UMShareWebpageObject = UMShareWebpageObject.shareObject(withTitle: titleStr as String, descr: text as String, thumImage: image)
        shareObject.webpageUrl = urlStr as String
        messageObject.shareObject = shareObject
        //分享调用接口
        UMSocialManager.default()?.share(to: type, messageObject: messageObject, currentViewController: presentVc, completion: { (data, error) in
            if error != nil{
                MBProgressHUD.showSuccess("分享失败")
            }else{
                MBProgressHUD.showSuccess("分享成功")
            }
        })
    }
    


    效果图

    项目实际分享效果图.jpeg
    事实上,我们项目中在不同页面的分享会有不同的展示选项,而且手机未安装的app自然是不会显示出来,所以我写了一个枚举传一个数组进来实现的分享面板自定义布局
    protocol WEShareManageViewDelegate:NSObjectProtocol {
        func removeShareView()
        func chooseShareButton(typy:WESharePlamtType)
    }
    
    enum WESharePlamtType:NSInteger {
        case WESharePlamtTypeUnKnown      = -1 //未知
        case WESharePlamtTypeWeixin       = 0  //微信
        case WESharePlamtTypeFriends      = 1  //微信朋友圈
        case WESharePlamtTypeQQ           = 2  //qq
        case WESharePlamtTypeQQFriends    = 3  //qq朋友圈
        case WESharePlamtTypeCopy         = 4  //复制链接
        case WESharePlamtTypeNOInterested = 5  //不感兴趣
        case WESharePlamtTypeReport       = 6  //举报
        case WESharePlamtTypeDelete       = 7  //删除
    }
    


    以后有时间,会将封装的功能放上来,非常简洁明了,可以直接拿来使用

    6:关于友盟分享与微信支付、支付宝支付冲突问题的解决

    1:微信分享 和 微信支付 的冲突

    项目中微信支付和分享都是使用的pods集成,如果微信分享使用完整版就会跟微信支付有重复文件的冲突,所以选择微信分享精简版是完美的解决方案

    总结:在集成 "微信支付" 的情况下必须选择 "微信分享精简版"(都使用pod集成)

    2:友盟分享 和 支付宝支付 的冲突

    友盟分享和支付宝支付冲突.jpeg

    错误显示有34个重复文件,关于UTDID冲突,解决办法如下:


    解决友盟分享和支付宝支付冲突问题.png

    支付宝SDK是拖入项目中的,所以替换掉使用的支付宝SDK(使用下面那个)就好了

    总结:如果同时集成"友盟分享"和"支付宝支付"的功能,支付宝sdk请选择上图下面那个(解决UTDID冲突)

    支付宝SDK下载地址

    最后再说明一个无脑问题,如果你没在项目中判断是否安装某某app来进行显示与隐藏的情况下,有时你会收到canOpenURL: failed for URL: “weixin://,并不一定是你配置白名单的问题,而是你手机根本就没安装你要分享到的那个app!!!

    相关文章

      网友评论

        本文标题:swift-友盟分享

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