浅谈插件化(二)

上一篇说了一下如何准备好两大工具,github 和 trunk 账号!

这一篇主要说的是,当你的代码里有一些不可描述的内容不想让别人看到,总之不想暴露自己的源码,只想让别人调用你公共API。 这时候我们可以把代码块打包成 Static Liabrary 或者是 Framework

也就是 .a文件 和 .framework 文件  大致来说   .framework = .a + header文件

这两种文件的具体差别不多说了,有兴趣的可以看StaticLibrary和Framework的区别

话不多说,步骤开撸。

一.创建 StaticLibrary

1.打开Xcode 创建一个新的project 在界面选择上按下图选择


然后完成自己的功能,这里用一个简单的小功能代替.


功能完成后 使用Command + B 分别在模拟器和Generic iOS Device 环境下编译一遍.然后在product文件下会生成一个library文件,这时候show in finder 会发现有iphones 和 iphonesimulater两个文件包 里面分别有一个.a文件,这就是我们刚才编译生成的static library文件,分别是模拟器状态和真机状态.

编译生成的library文件
两种环境下的文件包

然后需要使用 lipo create 命令行合并初一个适合两种环境的.a文件

lipo -create 模拟器环境下的.a文件路径  真机环境下的.a文件路径   -output  目标.a文件路径

适合两种环境的.a 

这时候就可以把这个.a 文件 和所需的.h文件拖到你的工程中使用了. bingo~

二.创建Framework

1.打开Xcode 创建一个新的project 在界面选择上按下图选择

2.同样的完成自己的功能代码块  依旧用一个小demo来说明

方法声明
方法实现

3.选中 Target ,选择 Build Phases - Headers ,可以看出有三个选项,分别是 Public 、Private 、Project ,把需要公开给别人的 .h 文件拖到 Public 中,把不想公开的,即为隐藏的 .h 文件拖到 Project 中


4. 在系统生成header文件下 按你的需求导入你的public header文件(必须导入,不然在别人使用的时候找不到你的头文件)

5. 在Architectures下增加armv7s,并选中。将Build Active Architecture Only 设置为NO

至于为什么添加 可以看这篇帖子链接

并把Architecture Only 改为 No


将Mach-O Type设为Static Library,framework,对于系统的framework是动态库,而用户制作的framework只能是静态库,要设置defines module为NO,不然集成的时候会出现Include of non-modular header inside framework module错误。设置bitcode为NO。


6.打包framework

方法一. 手动打包(不建议) 还是分别在两种环境下编译工程  并用 lipo  create. -output 命令行合并framework 直接改后缀即可.(详细可看.a 打包流程)

 方法二.  脚本自动打包(建议)

在TARGETS  下添加一个 Aggregate  并在此target下的build phases 增加一个新的脚本 如图

复制 粘贴下面的脚本代码 

# 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}"

选中编译环境

在这个编译环境下编译 你便可以得到一个适合 模拟器和真机环境的 .framework.  

 到此为止framework 制作完毕.自己建立个新工程测试一下,直接将刚才的.framework 导入测试


测试结果

bingo~。~

你可能感兴趣的:(浅谈插件化(二))