irpas技术客

iOS 创建含有 cocoapods 依赖的 framework_0o怀可o0

网络 6509

iOS 创建含有 cocoapods 依赖的 framework

之前一直用的 framework 实现了 OC 和 Swift 互调,现在需要添加依赖,即 framework 也需要 cocoapods 引入库,建立的方式稍有不同,这里记录一下。

建立新项目,选择 framework,命名,这里我命名为 HKYKit。

支持版本调低,和项目一样就可以了。这里比项目支持版本高的话会在引入 framework 时报错。如果有多个项目需要引这个 framework,选最低的版本。

引入 cocoapods 库

framwork 可能依赖别的库(比如我创建的 framework 就依赖 SwiftJSON),这时候和普通项目一样建立 Podfile,注意使用 use_frameworks!

pod install,从 .xcworkspace 打开,创建代码。

接口

这里创建一个 Experiment.swift 作为示例,根据需要把一切需要调用的都标上 public 或 open

import Foundation import SwiftyJSON public struct Experiment { public init() { } public func anyJSON() -> JSON { var json = JSON() json["title"].string = "实验" return json } }

将 Experiment.swift 作为暴露给 framework 外部的文件

TARGETS->Build Phases->Headers,添加到 Public

生成 .framework

先设置,TARGETS->Build Settings->Mach-O Type,设为 Static Library。这里如果需要设为 Dynamic Library,在引入 .framework 的项目还需设置一下,文末有设置方法。

构建框架

选到模拟器和真机,分别 build 一遍

项目目录->Products->XXX.framework->Show in Finder 看到 XXX.framework 文件夹及 Pods 文件夹。 Products 文件夹包含 Debug-iphoneos 和 Debug-iphonesimulator,对应真机和模拟器。

生成通用框架

TARGETS 左下角加号,添加一个 Aggregate,命名为 Maker

Build Phases->左上角加号->New Run Script Phase

注意 UNIVERSAL_OUTPUTFOLDER 路径,xxx 改为用户名。这里先测试一下,生成到桌面,实际生成到项目目录里比较方便。

if [ "true" == ${ALREADYINVOKED:-false} ] then echo "RECURSION: Detected, stopping" else export ALREADYINVOKED="true" UNIVERSAL_OUTPUTFOLDER=/Users/xxx/Desktop # 输出文件夹 mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" build xcodebuild -target "${TARGET_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" build cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/" SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule" fi lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}" fi

Maker 的 Build Setting->Excluded Architectures 添加 arm64

选到 Maker,Build,生成 .framework

引入 framework

新建一个项目,测试 framework 是否能用。如果 framework 使用了 cocoapods,项目也要使用 cocoapods,引入需要的库。建立一个测试

项目取名为 SwiftDemo,生成 SwiftDemo.xcworkspace 直接将生成的 .framework 拖入项目目录,确保 TARGETS->Build Phases 中有 .framework

测试代码

import UIKit import HKYKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let e = Experiment() let json = e.anyJSON() print("\(json["title"].stringValue)") } }

Run 一下,如果 framework 的 Mach-O Type 选的是 Dynamic Library ,则会报错

dyld: Library not loaded: @rpath/HKYKit.framework/HKYKit Referenced from: Reason: image not found

需要将 TARGETS->General->Frameworks,Libraries,and Embeded Content 中 的 Do Not Embed 改为 Embed & Sign。

建议使用 Static Library,Do Not Embed

如果报错

Building for iOS, but the linked and embedded framework was built for iOS + iOS Simulator.

在 stackoverflow 找到解决方法:TARGETS->Build Settings->Validate Workspace 改为 YES,Run 一次,再改回 NO 就可以了。

正常运行,输出“实验”


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #iOS #创建含有 #cocoapods #依赖的 #Framework #中包含