iOS静态库(.framework)

本文是基于Xcode9的开发环境搭建的,由于本人使用的.framework形式,所以只说.framework形式的静态库,其他可自行百度

提交appstore的应用使用的库不允许包含i386或x86_64,否则会报错

前提

库:库实际上是一种代码共享的方式,主要用于代码重用和源码隐藏,通常分为动态库和静态库。

静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存空间。

静态库和动态库的存在形式

静态库:.a 和 .framework

动态库:.dylib 和 .framework

支持多个设备需要了解Xcode指令集及配置,请跳转

制作

一、创建工程

1、打开Xcode在导航栏选择File -》New -》Project,选择Cocoa Touch Framework,点击Next创建工程

2、新建工程后目录结构如下(TestApi是我自己添加的文件),在Targets -》Build Phases -》 Headers 选择对外暴露的头文件,Private为空则只暴露Public

3、配置Targets -》Build Settings

(1)使静态库支持bitcode,需要在Other C Flags添加-fembed-bitcode

(2)更改Mach-0 Type 为Static Library (默认创建的是Dynamic)

二、添加Aggregate Target

1、File -》New -》Target,选择Cross-platform中的Aggregate并创建


2、选择新加的Aggregate Target -》Build Phases 点击“+”号选择New Run Script Phase添加脚本

脚本内容:

# Sets the target folders and the final framework product.

# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME

# 例如: FMK_NAME = "MyFramework"

FMK_NAME=${PROJECT_NAME}

# Install dir will be the final output to the framework.

# The following line create it in the root folder of the current project.

INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework

# Working dir will be deleted after the framework creation.

WRK_DIR=build

DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework

SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework

# -configuration ${CONFIGURATION}

# Clean and Building both architectures.

xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build

xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build

# Cleaning the oldest.

if [ -d "${INSTALL_DIR}" ]

then

rm -rf "${INSTALL_DIR}"

fi

mkdir -p "${INSTALL_DIR}"

cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"

# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.

lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"

rm -r "${WRK_DIR}"

open "${INSTALL_DIR}"

三、制作通用静态库

方案一、Build的Target使用二中创建的即可,如下图:


方案二、使用Carthage中的使你的framework支持Carthage章节

推荐阅读更多精彩内容