AlipaySDK支持Swift Package Manager

14 阅读2分钟

1. 先去官网下载xcframework

2. 简单实现,直接使用binaryTarget包下

新建个目录,创建package.swift

目录如下

├── Package.swift
├── Sources
│   └── AlipaySDK
│       └── AlipaySDK.xcframework

Package.swift

// swift-tools-version: 6.2
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "AlipaySDK",
    platforms: [.iOS(.v15)],
    products: [
        .library(
            name: "AlipaySDK",
            targets: ["AlipaySDK"]
        ),
    ],

    targets: [
        .binaryTarget(
            name: "AlipaySDK",
            path: "Sources/AlipaySDK/AlipaySDK.xcframework"
        ),
        .testTarget(
            name: "SimpleSwiftKitTests",
            dependencies: ["AlipaySDK"]
        ),
    ]
)

这样主工程就可以通过spm使用这个库了,但是根据iOS 集成流程要添加这些添加库依赖

image.png

但是这时会提示AlipaySDK.framework did not contain an Info.plist。有个两个方法

  1. 让ai补上缺失的Info.plis(我选这个)
  2. AlipaySDK-inside-Info.plistcopy一份改名为Info.plis,然后自己改。

这时就可以运行成功了

import AlipaySDK
print("AlipaySDKVersion", AlipaySDK.defaultService().currentVersion())
输出
AlipaySDKVersion Optional("15.8.42")

#import <AlipaySDK/AlipaySDK.h>
或者
@import AlipaySDK;

NSLog(@"AlipaySDK.currentVersion %@", [[AlipaySDK defaultService] currentVersion]);
AlipaySDK.currentVersion 15.8.42

这时应该就大功告成了,但是我觉得主工程要自己添加那么多库依赖,实在不好。使用cocoapods时就不用这么麻烦。所以自己就试除了以下几个方法。

方案A 用普通的Target包下详见

cocoapods时主工程不用添加那么多库依赖,是因为.podspec中用frameworks加好了。由于SPM 的 binaryTarget 不支持配置 linkerSettings,所以要不自己在主工程里加,要么用普通的Target包下。

文件目录如下

├── Package.swift
├── README.md
├── Sources
│   ├── AlipaySDK
│   │   └── dummy.swift
│   └── AlipaySDKBinary
│       └── AlipaySDK.xcframework

Package.swift

// swift-tools-version: 6.2
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "AlipaySDK",
    platforms: [.iOS(.v15)],
    products: [
        .library(
            name: "AlipaySDK",
            targets: ["AlipaySDK"]
        ),
    ],

    targets: [
        .binaryTarget(
            name: "AlipaySDKBinary",
            path: "Sources/AlipaySDKBinary/AlipaySDK.xcframework"
        ),
        .target(
            name: "AlipaySDK",
            dependencies: ["AlipaySDKBinary"],
            path: "Sources/AlipaySDK",
            linkerSettings: [
                .linkedFramework("SystemConfiguration"),
                .linkedFramework("CoreTelephony"),
                .linkedFramework("QuartzCore"),
                .linkedFramework("CoreText"),
                .linkedFramework("CoreGraphics"),
                .linkedFramework("UIKit"),
                .linkedFramework("Foundation"),
                .linkedFramework("CFNetwork"),
                .linkedFramework("Network"),
                .linkedFramework("WebKit"),
                .linkedLibrary("z"),
                .linkedLibrary("c++"),
//                .unsafeFlags(["-fmodules"])
            ]
        ),
        .testTarget(
            name: "SimpleSwiftKitTests",
            dependencies: ["AlipaySDK"]
        ),
    ]
)

dummy.swift

@_exported import AlipaySDK
import Foundation

这样主工程不用自己添加那么多库依赖,使用跟以前一样。但是在objc中不能用@import AlipaySDK;导入了#import <AlipaySDK/AlipaySDK.h>

#import <AlipaySDK/AlipaySDK.h> ✅
@import AlipaySDK; ❌

方案B 用普通的Target包下,用oc实现详见

文件目录如下

├── Package.swift
├── README.md
├── Sources
│   ├── AlipaySDK
│   │   ├── AlipaySDK.m
│   │   └── include
│   │       ├── AlipaySDKModule.h
│   │       └── module.modulemap
│   └── AlipaySDKBinary
│       └── AlipaySDK.xcframework
│           ├── Info.plist
│           ├── ios-arm64
│           └── ios-arm64_x86_64-simulator

AlipaySDKModule.h

#ifndef AlipaySDKModule_h
#define AlipaySDKModule_h

#import <AlipaySDK/AlipaySDKModule.h>

#endif /* AlipaySDKModule_h */

module.modulemap

module AlipaySDKOC {
    umbrella header "AlipaySDKModule.h"

    export *
    module * { export * }
}

这样的话,使用就跟以前一样了