iOS 创建含有 cocoapods 依赖的 framework

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

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

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

引入 cocoapods 库

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

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

接口

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

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: /private/var/containers/Bundle/Application/02734D3C-F7CC-4DD1-BDDB-971CC2597F54/SwiftDemo.app/SwiftDemo
  Reason: image not found

将 TARGETS->General->Frameworks,Libraries,and Embeded Content 中 framework 的 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 就可以了。

正常运行,输出“实验”


在项目中的 .framework 上右键,Show in Finder,拷贝其 目录地址,复制到上面的 UNIVERSAL_OUTPUTFOLDER,之后生成就可以直接在项目里用了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容