项目背景:最近在对接微信支付SDK。壳工程是Swift开发语言,但是微信支付是OC开发语言。问题就随之而来了。如
壳工程
怎么调用封装Swift版本的pod
代码、壳工程
怎么调用封装Swift版本的pod
代码里的oc代码、OC代码和Swift代码
调用问题等等
1:对微信支付SDK进行二次封装成pod库
需要到微信开发平台,下载如下文件(这里以1.8.7.1
为例)
- libWeChatSDK.a
- WechatAuthSDK.h
- WechatAuthSDK.h
- WXApiObject.h
2:创建pod lib create WeChatPaySDK
在命令行里执行 pod lib create WeChatPaySDK
按照提示,一路填写信息即可
3:把文件放到Classes文件夹下
4:.podspec文件内容如下
objc
Pod::Spec.new do |s|
s.name = 'WeChatPaySDK'
s.version = '0.0.9'
s.summary = ' MSWeChatPaySDK for weChatPay-SDK'
s.description = <<-DESC
TODO: Add long description of the pod here.
DESC
s.homepage = 'https://github.com/7General'
s.license = { :type => 'MIT', :file => 'LICENSE' }
s.author = { 'wxxx1@163.com' => 'waxxu@xx.com' }
s.source = { :git => 'https://github.com/7General/WeChatPaySDK.git', :tag => s.version.to_s }
s.ios.deployment_target = '12.0'
s.swift_version = '5.0'
s.source_files = 'WeChatPaySDK/Classes/**/*.{h,swift}'
s.resources = 'WeChatPaySDK/Assets/*', 'WeChatPaySDK/Classes/**/*.xib'
s.frameworks = 'Security', 'CoreGraphics', 'WebKit', 'SystemConfiguration', 'CoreTelephony', 'QuartzCore', 'CoreText', 'UIKit', 'Foundation', 'CFNetwork', 'CoreMotion'
s.libraries = 'c++', 'z'
//****** 注意这里用了static_framework *****
s.static_framework = true
s.vendored_libraries = 'WeChatPaySDK/Classes/SDK/**/*.a'
s.xcconfig = {
'USER_HEADER_SEARCH_PATHS' => 'WeChatPaySDK/Classes/SDK/**/*.h',
'OTHER_LDFLAGS' => '-ObjC'
}
end
注意问题s.static_framework = true
,微信用静态库,而工程的Podfile文件里有设置了use_frameworks!
如果不设置就会报如下问题
objc
**dyld[5883]: Library not loaded: @rpath/WeChatPaySDK.framework/WeChatPaySDK**
**Referenced from: <5FC5794B-9BBA-3F60-8267-E9C333F23AAE> /private/var/containers/Bundle/Application/108DCA91-A669-4B57-BDF2-FD3095500303/WeChatPaySDK_Example.app/WeChatPaySDK_Example**
**Reason: tried: '/usr/lib/swift/WeChatPaySDK.framework/WeChatPaySDK' (errno=2, not in dyld cache),**
5:校验微信支付SDK是否接入正常
可以直接在appdelegate
添加注册和调用自检函数
添加头文件 #import "WXApi.h"
objc
添加头文件 #import "WXApi.h"
[WXApi registerApp:@"wxxxxxx" universalLink:@"https://xxx.com"];
//调用自检函数
[WXApi checkUniversalLinkReady:^(WXULCheckStep step, WXCheckULStepResult* result) {
NSLog(@">>>>>>>%@, %u, %@, %@", @(step), result.success, result.errorInfo, result.suggestion);
}];
另外一种校验模式,看下文混编调用
验证的结果看日志打印,能打开微信即可
6:关于对微信支付SDK二次封装的小结
到了这里,已经完成了二次对微信支付SDK的封装
- 注意podsepc文件里引用的frameworks,libraries
- 注意配置成
s.static_framework = true
(原因查找上文) - 主要配置vendored_libraries,指向.a文件所在地址
- xcconfig配置
7:(混编)封装微信支付SDK,OC和Swift调用
7.1 同在swift的pod库里,swift文件调用OC代码(微信代码)
在封装的pod库里添加一个MSPayManage.swift
文件,记住这里就可以直接用oc的头文件,无需添加头文件引用
swift
import UIKit
// 这里不用引用oc的头文件
public class MSPayManage: NSObject {
@objc public func setup(){
print("开始注册")
WXApi.registerApp("wx6dxxxxx", universalLink: "https://wxxxxx.com")
print("调用自检函数")
WXApi.checkUniversalLinkReady { step, result in
print("\n\n----\(step)===\(result.success)===\(result.errorInfo)====\(result.suggestion)")
}
}
}
7.2 同在swift的pod库里,swift文件调用创建OC代码
objc
@interface MSPayRequest : NSObject
-(void)SwiftCallOcFunc;
+(void)SwiftCallOcClassFunc;
@end
#import "MSPayRequest.h"
@implementation MSPayRequest
-(void)SwiftCallOcFunc {
NSLog(@"SwiftCallOcFuncSwiftCallOcFunc====instance");
}
+(void)SwiftCallOcClassFunc {
NSLog(@"SwiftCallOcFuncSwiftCallOcFunc=========class");
}
@end
在swift代码调用oc代码
swift
import UIKit
// 这里不用引用oc的头文件
public class MSPayManage: NSObject {
@objc public func setup(){
print("开始注册")
WXApi.registerApp("xxxxxx", universalLink: "https://whz.xxxxx.com")
print("调用自检函数")
WXApi.checkUniversalLinkReady { step, result in
print("\n\n----\(step)===\(result.success)===\(result.errorInfo)====\(result.suggestion)")
}
swiftCallOcFunc()
}
// 这里swift调用用户自己的oc代码
func swiftCallOcFunc(){
MSPayRequest().swiftCallOcFunc()
MSPayRequest.swiftCallOcClassFunc()
}
}
7.3 OC的壳工程调用swift的pod中的swift文件
引入头文件#import "WeChatPaySDK-Swift.h"
,这个文件是默认存在的 在OC壳工程里appdelegate
调用swift代码如下
objc
MSPayManage * manage = [[MSPayManage alloc] init];
[manage setup];
重点来了
:这里可以实例化到我们写的swift文件,但是无法调用具体的方法,所以,要在方法添加一个@objc
7.4 OC的壳工程调用swift的pod中的OC文件
注意这里引入的头文件是有差别的 #import "WeChatPaySDK-umbrella.h"
这样就可以在appdelegate文件里调用了
objc
#import "ZZGAppDelegate.h"
// OC壳工程调用swift-pod的swift代码
#import "WeChatPaySDK-Swift.h"
// OC壳工程调用swift-pod的oc代码
#import "WeChatPaySDK-umbrella.h"
@implementation ZZGAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// OC壳工程调用swift-pod的swift代码
MSPayManage * manage = [[MSPayManage alloc] init];
[manage setup];
// OC壳工程调用swift-pod的oc代码
MSPayRequest *request = [[MSPayRequest alloc] init];
[request goschool];
return YES;
}
8:配置重点提示
一定要注意.a
文件的路径位置!!!,否则可能出现能引用到,但是调用就提示找不到的情况
objc
ld: Undefined symbols:
_OBJC_CLASS_$_WXApi, referenced from:
in WeChatPaySDK[3](MSWechatPayHelper.o)
clang: error: linker command failed with exit code 1 (use -v to see invocation)
写在最后的
写到最后,突然就有个疑问,关于微信支付SDK在swift上为什么就不能好好的使用?这也是我自己对比了oc壳工和swift壳工程以后,总结一下吧
- 微信支付SDK针对OC代码很友好,可以是直接使用对应的头文件
- 在针对swift的时候,甚至找不到头文件引入,没法直接使用。所以在本地二次包装一个pod,再使用的时候,直接引入对应的pod,微信的头文件就带上了
- 一定要带上
s.static_framework = true
配置 - 在加入了第3点配置以后,一定要在壳工程\主工程中一定要加入
install! 'cocoapods',:disable_input_output_paths => true
少走弯路,微信SDK可以更新一下
objc
-> WeChatPaySDK (2.0.0)
MSWeChatPaySDK for weChatPay-SDK
pod 'WeChatPaySDK', '~> 2.0.0'
- Homepage: https://github.com/7General
- Source: https://github.com/7General/WeChatPaySDK.git
- Versions: 2.0.0, 1.0.0, 0.0.8, 0.0.7, 0.0.6, 0.0.3, 0.0.2, 0.0.1 [cocoapods
repo]
感谢地同时,也可以添加的我的微信公众号,"洲洲哥"