iOS制作framework

博客介绍了iOS项目中一些路径变量和配置的含义。如$(PROJECT_DIR)代表整个项目文件夹,$(SRCROOT)代表项目根目录下与项目同名的文件夹,$(inherited)可继承上一级或依赖项配置,${PODS_ROOT}指pod目录,还提及recursive和non - recursive的搜索方式。

参考链接:https://blog.youkuaiyun.com/wujakf/article/details/117549786?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167109143816782412546009%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=167109143816782412546009&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-13-117549786-null-null.142^v68^control,201^v4^add_ask,213^v2^t3_esquery_v2&utm_term=iOS%20framework%20%E6%97%A0%E6%B3%95%E8%BF%90%E8%A1%8C%E7%9C%9F%E6%9C%BA&spm=1018.2226.3001.4187

亲自实践可行。

$(PROJECT_DIR)代表的是整个项目,即整个项目文件夹

$(SRCROOT)代表的是项目根目录,即整个项目文件夹下与项目同名的文件夹

$(inherited):继承上一级或依赖项的配置。通过CocoaPods集成的项目,$(inherited)将会包含Pods.xcodeproj中的配置

${PODS_ROOT}:pod目录

recursive:会在相应的目录递归搜索文件

non-recursive:非递归

#!/bin/sh

#要build的target名

TARGET_NAME=${PROJECT_NAME}

if [[ $1 ]]

then

TARGET_NAME=$1

fi

UNIVERSAL_OUTPUT_FOLDER="${SRCROOT}/Products"

#创建输出目录,并删除之前的framework文件

mkdir -p "${UNIVERSAL_OUTPUT_FOLDER}"

rm -rf "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework"

#分别编译模拟器和真机的Framework

xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

xcodebuild -target "${TARGET_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

#拷贝framework到univer目录

cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework" "${UNIVERSAL_OUTPUT_FOLDER}"

#合并framework,输出最终的framework到build目录

lipo -create -output "${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"

#删除编译之后生成的无关的配置文件

dir_path="${UNIVERSAL_OUTPUT_FOLDER}/${TARGET_NAME}.framework/"

for file in ls $dir_path

do

if [[ ${file} =~ ".xcconfig" ]]

then

rm -f "${dir_path}/${file}"

fi

done

#判断build文件夹是否存在,存在则删除

if [ -d "${SRCROOT}/build" ]

then

rm -rf "${SRCROOT}/build"

fi

rm -rf "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator" "${BUILD_DIR}/${CONFIGURATION}-iphoneos"

#打开合并后的文件夹

open "${UNIVERSAL_OUTPUT_FOLDER}"

制作 iOS FrameworkiOS 开发中常见的需求,特别是在构建 SDK 或者希望将部分代码模块化、提供给其他项目或团队使用时。以下是一个完整的制作流程,涵盖从创建工程到配置以及最终生成 framework 的关键步骤。 ### 创建 Framework 项目 在 Xcode 中新建一个 Framework 工程: 1. 打开 Xcode,选择 **File -> New -> Project**。 2. 在模板中选择 **Framework**(iOS 下的 Cocoa Touch Framework)。 3. 输入项目名称,例如 `MySDK`,并选择存储路径。 此时,Xcode 会自动生成一个包含 `.framework` 目标的工程结构。 ### 配置 Build Settings 为了确保生成的 framework 能够兼容多种设备和模拟器,需要对项目的编译设置进行调整: - **Mach-O Type** 设置为 **Static Library**,因为对于用户自定义的 framework,通常都是静态库形式 [^3]。 - **Build Active Architecture Only** 设置为 **NO**,以确保生成的 framework 包含所有支持的架构(如 arm64、x86_64 等),否则可能只包含当前连接设备的架构 [^3]。 - **iOS Deployment Target** 应该设置为一个较低版本,以保证兼容性,并且不能高于主项目的最低支持版本 。 - **Valid Architectures** 可以根据需要添加或删除特定的 CPU 架构支持,比如移除模拟器相关的架构以减小体积。 ### 编写公共接口与实现 在 framework 中,需要将对外暴露的类、方法和属性标记为 `public` 或 `open`,以便外部项目可以访问这些内容。例如: ```swift // MySDK.swift import Foundation @objc public class MySDK: NSObject { @objc public func greet() -> String { return "Hello from MySDK!" } } ``` 此外,如果是 Objective-C 项目,则需要将头文件添加到 **Public Headers** 列表中,以便外部可见。 ### 构建 Framework 构建时可以选择不同的 scheme 来生成不同平台的二进制文件: - **Generic iOS Device**:用于真机运行的版本,生成的 framework 支持 arm64 架构。 - 模拟器(Simulator):用于在 Mac 上运行的模拟器环境,支持 x86_64 或 arm64(Mac M1 之后)。 可以通过命令行脚本或者使用 `lipo` 命令合并多个架构的 framework,生成通用的多架构 framework 文件。 #### 示例:使用 lipo 合并架构 ```bash # 分别构建真机和模拟器版本 xcodebuild -target MySDK -sdk iphoneos xcodebuild -target MySDK -sdk iphonesimulator # 合并两个架构 lipo -create -output build/MySDK.framework/MySDK \ build/Release-iphoneos/MySDK.framework/MySDK \ build/Release-iphonesimulator/MySDK.framework/MySDK ``` ### 导出与使用 构建完成后,可以在 `Products` 文件夹下找到生成的 `.framework` 文件。将其拖入目标项目中,并确保在 **Build Phases -> Link Binary With Libraries** 中添加该 framework。 如果希望 framework 支持 Swift 和 Objective-C 混编,还需要注意是否启用 **Defines Module**(YES)以及正确设置 **Product Module Name**。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值