移动端支付集成回顾

Image by mohamed Hassan from Pixabay
需求
最近接到集成移动支付功能的业务,需要支持支付宝和微信两类主流的移动支付平台。
该业务需要移植到其它项目, 基于组件化的考虑,决定使用 cocoapods 私有库功能 制作一个 SGPay 的 lib,把支付宝支付和微信支付封装在 SGPay 中,在需要使用支付功能的工程中使用 Podfile 引用。
cocoapods私有库教程可参考之前的文章Cocoapods Private Pods
SGPay
初步依赖关系:

-
创建 Lib
在终端执行下面命令
pod lib create SGPay -
添加依赖库
打开工程,在
SGPay.podspec中添加支付宝和微信的SDKs.dependency 'AlipaySDK-iOS' s.dependency 'WechatOpenSDK' -
支付功能及接口的代码编写
-
推送
podspec文件pod repo push 私有库名称 --sources=私有库URL,master --allow-warnings --verbose
上述流程是在理想的情况下进行的,而实际开发中却并不顺利。
支付宝相关问题解决方案

UTDID 冲突
当 SGPay.podspec 发布完成后,在主工程引用,编译,运行,
由于
主工程依赖了 阿里推送库 AlicloudPush,
AlicloudPush 又依赖了 AlicloudUTDID,
AlipaySDK-iOS 又引入了 AlicloudUTDID 源码
最终导致UTDID 重复,编译报错
错误信息如下:
...
/Users/path/Pods/AlipaySDK-iOS/AlipaySDK.framework/AlipaySDK
/Users/path/Pods/AlicloudUTDID/utdid/UTDID.framework/UTDID(UTDIDKeychainItemWrapper.o)
duplicate symbol '_OBJC_CLASS_$_UTDIDPersistentConf' in:
/Users/path/Pods/AlipaySDK-iOS/AlipaySDK.framework/AlipaySDK
/Users/path/Pods/AlicloudUTDID/utdid/UTDID.framework/UTDID(UTDIDPersistentConf.o)
duplicate symbol '_OBJC_METACLASS_$_UTDIDPersistentConf' in:
/Users/path/Pods/AlipaySDK-iOS/AlipaySDK.framework/AlipaySDK
/Users/path/Pods/AlicloudUTDID/utdid/UTDID.framework/UTDID(UTDIDPersistentConf.o)
duplicate symbol '_OBJC_CLASS_$_UTDIDPersistentFile' in:
/Users/path/Pods/AlipaySDK-iOS/AlipaySDK.framework/AlipaySDK
/Users/path/Pods/AlicloudUTDID/utdid/UTDID.framework/UTDID(UTDIDPersistentFile.o)
duplicate symbol '_OBJC_METACLASS_$_UTDIDPersistentFile' in:
/Users/path/Pods/AlipaySDK-iOS/AlipaySDK.framework/AlipaySDK
/Users/path/Pods/AlicloudUTDID/utdid/UTDID.framework/UTDID(UTDIDPersistentFile.o)
...
解决:
使用阿里官方提供的不带有UTDID版本的AlipaySDK-iOS SDK.
AlipaySDK_Dependency_UTDID
阿里官方只提供了不带UTDID版本的SDK, 并没有提供不带有UTDID版本SDK的 cocoapods库
难道要我们放弃支付宝支付SDK的cocoapods引入,把 SDK 拖进工程嘛???
不!!!
-
新建
AlipaySDK_Dependency_UTDIDlib,在该lib中引入 不包含UTDID版本的支付宝支付SDK -
AlipaySDK_Dependency_UTDID.podspec中依赖AlicloudUTDIDs.dependency 'AlicloudUTDID' -
AlipaySDK_Dependency_UTDID.podspec中依赖frameworks.resources = 'AlipaySDK_Dependency_UTDID/Assets/Resources/*.{xml,db,bundle,json,ttf,p12,der,xib}' s.libraries = 'c++', 'z' s.frameworks = 'QuartzCore', 'CoreText', 'CoreGraphics', 'CoreTelephony', 'SystemConfiguration', 'UIKit', 'Foundation', 'CFNetwork', 'CoreMotion', 'WebKit' s.vendored_frameworks = 'AlipaySDK_Dependency_UTDID/Assets/Frameworks/*.framework' -
在 SGPay.podspec 中把依赖的
AlipaySDK-iOS更换为AlipaySDK_Dependency_UTDID``` s.dependency ‘AlipaySDK_Dependency_UTDID’ ``
-
在主工程中引入
SGPaypod 'SGPay'
更改后的依赖关系:

在 GitHub上 发布 AlipaySDK_Dependency_UTDID
上述的lib均在私有库,如果有小伙伴遇到和我一样的问题,岂不是要再填一遍坑,何不把 AlipaySDK_Dependency_UTDID 发布到 GitHub
-
使用命令
pod trunk push --allow-warnings --verbose由于
AlipaySDK_Dependency_UTDID依赖了AlicloudUTDID,AlicloudUTDID是阿里发布在自己的Specs仓库的, aliyun-specs导致无法直接发布在
cocoapods公共仓库,发布时报错信息如下:
AlipaySDK_Dependency_UTDID (0.0.1) - WARN | description: The description is equal to the summary. - ERROR | [iOS] unknown: Encountered an unknown error (Unable to find a specification for `AlicloudUTDID` depended upon by `AlipaySDK_Dependency_UTDID`难道就不难为其他小伙伴排忧解难了嘛???
不!!!
-
在
GitHub新建公开的specs仓库,用于存储AlipaySDK_Dependency_UTDID的spec文件仓库地址:yq-aliyun-specs
把
AlipaySDK_Dependency_UTDID的spec文件 推送到这个仓库pod repo push yq-aliyun-specs --sources=https://github.com/YQqiang/yq-aliyun-specs.git,master --allow-warnings --verbose -
使用
-
在Podfile中增加
source# CocoaPods 仓库 source 'https://github.com/CocoaPods/Specs.git' # 阿里云 spec 仓库 source 'https://github.com/aliyun/aliyun-specs.git' # AlipaySDK_Dependency_UTDID 的 spec 仓库 source 'https://github.com/YQqiang/yq-aliyun-specs.git' -
在Podfile中添加依赖库
pod 'AlipaySDK_Dependency_UTDID'
-
微信相关问题解决方案

静态库
因为微信SDK使用了静态库(libWeChatSDK.a), 在推送 podspec 时会出现错误
错误信息如下:
ERROR | [iOS] unknown: Encountered an unknown error (The 'Pods-App' target has transitive dependencies that include statically linked binaries: (/private/var/folders/yd/m1j1pblx2kj64rpyd701tt3c0000gn/T/CocoaPods-Lint-20191120-68548-jjtzwd-SGPay/Pods/WechatOpenSDK/WeChatSDK1.8.6.1/libWeChatSDK.a)
解决:
在 SGPay.podspec 文件中 设置使用静态库
s.static_framework = true
Universal Links
-
需要有一个支持
https的域名 -
新建文件
apple-app-site-association文件格式如下:
{ "applinks": { "apps": [], "details": [ { "appID": "9JA89QQLNQ.com.apple.wwdc", "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*"] }, { "appID": "ABCD1234.com.apple.wwdc", "paths": [ "*" ] } ] } }-
appId: team identifier.bundle identifier
-
paths: 支持的url路径
-
-
把
apple-app-site-association上传到域名对应的服务器根目录中 或.well-known子目录中 -
在工程中添加域名 以
applinks:为前缀