从对微信支付SDK二次封装,到OC和swift混编调用总结

项目背景:最近在对接微信支付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的封装

  1. 注意podsepc文件里引用的frameworks,libraries
  2. 注意配置成s.static_framework = true(原因查找上文)
  3. 主要配置vendored_libraries,指向.a文件所在地址
  4. 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壳工程以后,总结一下吧

  1. 微信支付SDK针对OC代码很友好,可以是直接使用对应的头文件
  2. 在针对swift的时候,甚至找不到头文件引入,没法直接使用。所以在本地二次包装一个pod,再使用的时候,直接引入对应的pod,微信的头文件就带上了
  3. 一定要带上s.static_framework = true配置
  4. 在加入了第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]

有洲洲哥的就有Demo

感谢地同时,也可以添加的我的微信公众号,"洲洲哥"

相关推荐
crasowas17 小时前
iOS - 超好用的隐私清单修复脚本(持续更新)
ios·app store
ii_best18 小时前
ios按键精灵脚本开发:ios悬浮窗命令
ios
Code&Ocean1 天前
iOS从Matter的设备认证证书中获取VID和PID
ios·matter·chip
/**书香门第*/1 天前
Laya ios接入goole广告,开始接入 2
ios
恋猫de小郭2 天前
什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap
flutter·ios·swiftui
网安墨雨2 天前
iOS应用网络安全之HTTPS
web安全·ios·https
福大大架构师每日一题2 天前
37.1 prometheus管理接口源码讲解
ios·iphone·prometheus
BangRaJun3 天前
LNCollectionView-替换幂率流体
算法·ios·设计
刘小哈哈哈3 天前
iOS 多个输入框弹出键盘处理
macos·ios·cocoa
靴子学长3 天前
iOS + watchOS Tourism App(含源码可简单复现)
mysql·ios·swiftui