分享、推送、支付不知做过多少遍了,却从来没总结过,然后每次再做的时候又是各种看文档,很是繁琐,索性抽空来总结一下,方便以后使用
本篇文章主要包含以下几个模块
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,如果需要微信登录功能,需要申请微信登录权限,注意微信登录有效期为一年,需要按时在微信平台认证
因为qq互联开放平台不是使用自己的qq号注册的,所以暂不演示了值得说明的是QQ及Qzone使用同一个AppID及App-key
至于分享为什么用精简版,后面会有说明
2:项目配置
以下为友盟提供的项目配置流程:
在Other Linker Flags加入-ObjC ,注意不要写为-Objc
-ObjC属于链接库必备参数,如果不加此项,会导致库文件无法被正确链接,SDK无法正常运行
加入依赖系统库
//不是只添加这两个依赖库的,还需要根据你分享的平台按需添加相应平台分享功能的依赖库,如下说明
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的工程面板设置
微信:wx+appID
qq需要添加两个,如下
1、"tencent"+腾讯QQ互联应用appID//例如:tencent100424468
//转换方法终端中输入 echo 'ibase=10;obase=16;"你的appID"'|bc回车
2、“QQ”+腾讯QQ互联应用appID转换成十六进制(不足8位前面补0)//例如:QQ05fc5b14
微博:wb+appID
我项目中的配置如下:
这样,友盟分享的准备工作就完成了,开始在项目中使用
5:项目中实现分享
因为我项目是使用swift写的,所以需要在桥接文件中倒入如下配置
然后就是友盟的初始化设置,并配置需要分享的平台信息
//设置友盟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("分享成功")
}
})
}
效果图
事实上,我们项目中在不同页面的分享会有不同的展示选项,而且手机未安装的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:友盟分享 和 支付宝支付 的冲突
错误显示有34个重复文件,关于UTDID冲突,解决办法如下:
支付宝SDK是拖入项目中的,所以替换掉使用的支付宝SDK(使用下面那个)就好了
总结:如果同时集成"友盟分享"和"支付宝支付"的功能,支付宝sdk请选择上图下面那个(解决UTDID冲突)
最后再说明一个无脑问题,如果你没在项目中判断是否安装某某app来进行显示与隐藏的情况下,有时你会收到canOpenURL: failed for URL: “weixin://
,并不一定是你配置白名单的问题,而是你手机根本就没安装你要分享到的那个app!!!