移动端支付集成回顾
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_UTDID
lib,在该lib中引入 不包含UTDID版本的支付宝支付SDK -
AlipaySDK_Dependency_UTDID.podspec
中依赖AlicloudUTDID
s.dependency 'AlicloudUTDID'
-
AlipaySDK_Dependency_UTDID.podspec
中依赖framework
s.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’ ``
-
在主工程中引入
SGPay
pod '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:
为前缀