使用cocoapods集成友盟分享库UMShare时,处理友盟自带微信库不带支付的问题
问题原因:
最近想把项目里之前用的ShareSDK改为友盟的分享库, 看文档, 集成sdk, 但是在集成微信时发现问题, UMShare所集成的微信库, 不带微信支付的. 但是项目里使用到了微信支付. 如果同时集成微信完整sdk会跟UMShare带的微信库冲突, 不集成UMShare的微信库又会导致UMShare初始化的时候识别不到微信相关的库而失败. 文档解释如下:
- 微信精简版已不维护, 如果使用, 会被识别为未认证的应用, 不推荐
- 手动替换微信完整版sdk太low了
解决方案:
- 使用shell脚本自动拷贝替换
- 使用临时Target来集成微信带支付的sdk, 添加编译脚本, 在编译的时候,自动把微信官方带支付的静态库、头文件替换进UMShare的微信库目录.
开始搞定:
1. cocoapods处理
- 在项目设置中,复制一个target出来(方便不用配置参数)随便改个名字(比如叫WechatSDK), 用来集成微信的sdk, 其他正式的target集成友盟的微信sdk, 这样就不会出现库冲突的问题
- 修改Podfile, 其他target正常集成必要库, 对于target WechatSDK, 单独集成WechatOpenSDK:
target 'WechatSDK' do
#在这个target下pod微信官方sdk,因为umshare的完整版微信sdk不带支付模块
#所以使用这个target即成官方sdk之后,build phrase在其他三个target下有添加脚本把官方的sdk覆盖到umshare的目录下替换
# 手动集成微信sdk
pod 'WechatOpenSDK', '~> 1.0'
end
- 这里有个小技巧, 多个target集成pod时, 可以使用抽象target来集成公用库, 在抽象target内针对单独库集成特有库, 可以方便管理:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios,'10.0'
inhibit_all_warnings!
use_frameworks!
# 抽象target:不存在实体的XXX target
abstract_target 'XXX' do
pod '***' # 全部target都会执行
target 'AAA' do
pod '***' # 只有target AAA会集成
end
target 'BBB' do
pod '***' # 只有target BBB会集成
end
end
- 执行Pod update(建议pod库时使用'~>'指定大版本号, 定期更新第三方库以修复一些bug)单纯的pod install不会更新pod仓库, 无法集成最新的库
2. 编写自动替换脚本
- 打开需要替换的工程设置->Build Phases, 选中左侧target, 点击右侧加号添加Run Script, 添加后将Run Script拖动到第二行
- 编写脚本:
# Type a script or drag a script file from your workspace to insert its path.
cur_dir=$(pwd) # 当前工程目录
copydest_path=${cur_dir}"/Pods/UMCShare/UMShare/SocialLibraries/WeChat/WechatSDK" # 需要替换的友盟微信库路径
wechatsdk_path=${cur_dir}"/Pods/WechatOpenSDK" # 微信库路径, 目录下有OpenSDK+版本号的子目录
wechatsdkFiles_path="" # 微信sdk的静态库与头文件
cd $wechatsdk_path # cd到微信库根路径
for fileName in $(ls) # 遍历路径下文件
do
if [[ "$fileName" == OpenSDK* ]]; then
cd $fileName # 进入版本子目录
break
fi
done
for fileName in $(ls) # 遍历文件
do
cp $fileName $copydest_path # 拷贝到友盟的微信库路径替换
done
exit 0 # 返回0表示完成, 调试的话可以返回1打断编译
- 编译工程, 会自动执行脚本, 编译完成之后即可看到库文件已替换. 这样提交到版本控制时,不用提交pod工程文件. 每次install之后,编译一下工程即可自动替换. 缺点就是podinstall之后必须要编译一下才能执行脚本
- 后续开发可以不用维护WechatSDK target, 为了防止错误编译该target, 可以添加个脚本抛出错误:
# Type a script or drag a script file from your workspace to insert its path.
echo 不要编译这个tag,只是用来拷贝微信sdk用的
exit 1