精选文章

Android下使用TCPDUMP抓包Wireshark分析数据 如果想分析Android下某个APP的网络数据交互,需要在Android手机上抓包,最常用的抓包工具非tcpdump莫属,用tcpdump生成Wireshark识别的pcap文件,然后将pcap文件下载到电脑上,用电脑上的Wireshark加载pcap文件,通过Wireshark分析tcpdump抓取的数据。...

继续阅读

Mac下部署Android开发环境附加NDK 作为开发者,我们深有体会,不管是进行什么开发,为了部署开发环境,我们往往需要折腾很长时间、查阅很多资料才能完成,而且这次折腾完了,下次到了另一台新电脑上又得重新来过,整个部署过程记得还好,要是不记得又得重新开始,而且遇到Android这种GFW阻隔了开发资源下载链接的环境部署,又尤其浪费时间。所以这也是我写下这篇教程的初衷跟动力源泉,希望大家参考了这篇教程以后可以轻轻松松在Mac系统下将Android环境部署好。...

继续阅读

稍顯嚴肅的台中 坦白說,留在腦海中的台中影像並不多,來台灣之前在Booking上只訂到了台中的一家青旅,第一次住青旅有些不習慣,幹什麼都放不開。 同屋的一個男生是台灣人,不過一年中四分之三的時間在上海跟北京,這麼說來跟我還是比較有共同話題的。得之我準備花15天的時間環島,覺得太倉促了,他們大學時期花一個半月的時間也不見得能將台灣島給逛完。我只能無奈地表示,兩岸允許的簽證時間有限,自己的空閒時間更有限,只能用打卡式的旅行了,我深知正真地旅行應該慢下來,融入當地的環境,感受他們的風土人情,但第一次只能這樣作罷,以後換成民進黨上台,形勢會變成怎樣還不得而知,能否再過來還是個未知數。而我一向信奉的人生格言是秉燭夜遊,活在當下,所以,理解自己吧。...

继续阅读

為之留戀的新竹 來新竹之前本沒有對她有過高的期待,慢慢對她加分要從桃園火車站出發前往新竹開始。 在桃園火車站的候車月台上,有醒目的旅遊資料發放處,這上面的擺放的全是新竹的旅遊宣傳資料,關鍵的是資料做得非常簡潔易懂,而接下來一天的新竹之行就全部是依據這份寶典的指引來完成的。...

继续阅读

從桃園開始台灣之行 初到台灣恰逢華夏銀行系統升級,特意準備的華夏銀聯卡在桃園機場沒能派上用場,只好用建行在機場5000塊,算下來是很不划算的,但是沒辦法,誰叫我出機場就得花錢呢。 從機場打車到桃園的酒店,花了將近六百塊新台幣,到酒店時五點多,天已經漸亮了,洗漱完等到七點吃過早餐就開始補覺囉,一覺醒來已是中午,帶著換下來的衣服外出找自助洗衣店,順便覓食。...

继续阅读

  • Prev
  • Next

使用Xcode 5.1.1编译iOS Framework详细教程

文章分类 : iOS, MacOS, 应用与编程

作为iOS开发者,想必我们都用过Apple自带的或者第三方开发的Framework(框架),比如,当我们开发音视频功能时,需要在Xcode的TARGETS -> General -> Linked Frameworks and Libraries内添加苹果自带的框架AudiToolBox.framework与AVFoundation.framework,又比如,我们使用科大讯飞的语音SDK时,需要下载他们提供的框架iflyMSC.framework,并添加至Linked Frameworks and Libraries内。

如果我们作为第三方开发者,需要将自己开发的iOS工具包或者SDK分享给其他开发者,而又不想公开源码,那么这时候就需要将iOS源码编译成框架后发布出来,我们将这个过程通俗地称为“打包”。但“打包”并不容易,很多开发者包括我一开始都无从下手,Google了很多英文博客才搞定。好记心不如烂笔头,为了便于自己下次再次打包,同时为了方便有打包需求的其他开发者,故制作该教程指导大家如何使用Xcode编译iOS Framework。

1、新建静态库工程

选择iOS -> Framework & Library -> Cocoa Touch Static Library

ios_framework_tutorials_01

很多第三方SDK,如微信、新浪微博、Google AdMob选择的是Static iOS Framework,最终编译出来是类似于libXXX.a的静态库文件,这种方式的缺点在于libXXX.a静态库文件与公开的头文件是分开的,不便于管理。如果选择Cocoa Touch Static Library,最终编译出来的是一个完整的Framework Bundle文件,它类似于一个压缩包文件,会整合编译出来的静态库与公开的头文件,便于管理与使用。

2、为你的工程取个名字

ios_framework_tutorials_02

这个演示用Framework最终想实现的功能是对外提供一个helloFramework接口,其他工程加载这个框架后调用该接口弹出警告框并显示“Hello Framework”,故将工程名称设置为HelloFramework,组织名称跟公司名称你都可以根据自己的需求来设置。如果不是十分想突出你产品或公司的品牌价值的话,这些随意设置即可。

3、为你的工程选择一个存储位置

ios_framework_tutorials_03

随意选择,方便找到即可,我这里选择的是桌面。

4、删除Xcode向导自动生成的文件

ios_framework_tutorials_04

如上图所示,有4处需要删除,删除①、②两处时按下图所示,将其删除至回收站即可。

ios_framework_tutorials_05

删除后所剩文件如下:

ios_framework_tutorials_06

5、删除Xcode自动生成的配置选项

ios_framework_tutorials_07

在Xcode内按快捷键Command+Shift+<或者通过Product->Scheme->Edit Scheme…进入配置编辑界面,点击Manage Scheme..,在如下界面内删除自动生成的HelloFramework配置,删除完毕后点击OK返回。

ios_framework_tutorials_08

6、新增一个Target

步骤1~5只是利用Xcode向导新建了一个iOS静态库工程,自动生成了一系列配置,然后删除了其自动生成的基本文件与配置,而接下来才开始新建iOS框架工作。我个人的理解是,Xcode只为iOS提供了生成静态库的向导,没有提供生成Bundle的向导,但Xcode为OS X提供了生成Bundle的向导,所以我们只能利用Xcode为OS X提供的新建Bundle向导来为iOS新建Bundle,最终将这个Bundle转化为Framework。

ios_framework_tutorials_09

ios_framework_tutorials_10

ios_framework_tutorials_11

类似与步骤2,为你的框架(新建的Target)取个名字,这将是最终生成的框架的文件名,我这里取为“HelloFramework”,组织跟公司名沿用之前新建工程时设置的。

7、修改步骤6中新建的Target的“Build Setting”

(1)修改Architectures(架构)内的配置

选择Standard architectures、选择Latest iOS、Build Active Architecture Only选No。

(2)修改Deployment(部署)内的配置

OS X部署目标选择OS X默认编译器,让Xcode自动判断OS X系统版本,为了兼容iPhone跟iPad,目标设备两者都选,为了兼容尽可能多的iOS版本,iOS部署目标选择可选的最低版本,我这里可选的最低版本是iOS 4.3。

ios_framework_tutorials_13

(3)修改Linking(链接)内的配置

优化代码选项设置为No,链接标准库选项设置为No,指定目标文件的链接格式为重定位方式。

ios_framework_tutorials_14

(4)修改Packaging(打包)内的配置

打包的默认后缀名是bundle,将其更改为framework。

ios_framework_tutorials_15

8、修改步骤6中新建的Target的”Info”

Bundle OS Type code选项默认为BNDL,改为FMWK,原理同步骤7中的(4),将默认的Bundle更新为Framework。

ios_framework_tutorials_16

9、注释Xcode自动生成的预编译头文件

ios_framework_tutorials_17

10、为新建的框架添加类(简单演示,故只新建一个类,大型工程需要多少类就新建多少类)

ios_framework_tutorials_18

我这里新建一个名为“HelloFramework”的类。

ios_framework_tutorials_19

ios_framework_tutorials_20

ios_framework_tutorials_21

11、在新添加的类中完成你要实现的功能

由于是简单演示,故只实现一个弹出警告框显示“Hello Framework”的对外接口。分别在HelloFramework.m中实现hello函数,在HelloFramework.h文件中给以声明。

ios_framework_tutorials_22

ios_framework_tutorials_23

12、添加你要对外公开的头文件

ios_framework_tutorials_24

ios_framework_tutorials_25

13、插入一个步骤

由于步骤4中忘了删除Frameworks内的UIKit.framework,直接编译会报错,故在此更正步骤4的截图。

ios_framework_tutorials_26

①~④步已经在步骤4中完成了,这里只需要补上第⑤步。

14、编译真机跟模拟器可以通用的框架

首先,添加一个集合器Aggregate,命名为buildUniversalFramework(编译真机跟模拟器通用框架)。

ios_framework_tutorials_27

ios_framework_tutorials_28

ios_framework_tutorials_29

然后,新建一个编译脚本,写入编译指令。

ios_framework_tutorials_30

ios_framework_tutorials_31

在Products目录内存放编译生成的框架,框架名称由第2行FMK_NAME=来指定。
不难看出,上侧编译脚本的任务是在工程文件所在目录内新建一个Products目录,然后分别编译真机跟模拟器的框架,再把真机框架内的文件拷贝至Products目录下,最后用lipo命令将真机框架与模拟器框架合并到Products目录内下,同时删除编译时自动生成的build目录。

上侧的编译脚本如下,大家使用时务必修改第2行FMK_NAME=后面的框架名称:

# Sets the target folders and the final framework product.
FMK_NAME=HelloFramework

# 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

# Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator

# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi

# Creates and renews the final product folder.
mkdir -p "${INSTALL_DIR}"

# Copies the headers and resources files to the final product folder.
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}"

最后,编译真机模拟器通用框架。

ios_framework_tutorials_32

ios_framework_tutorials_33

在工程文件所在目录下的Products目录内就能找到我们刚刚编译成功的真机模拟器通用框架。

ios_framework_tutorials_34

到此,整个框架编译过程也完毕了。

15、附加:测试框架

(1)新建一个iOS Single View Application工程,命名为test,存在Desktop(桌面)上。

ios_framework_tutorials_35

ios_framework_tutorials_36

ios_framework_tutorials_37

ios_framework_tutorials_38

(2)将HelloFramework框架添加到新工程内。

ios_framework_tutorials_39

ios_framework_tutorials_40

(3)在test工程启动后调用HelloFramework框架对外提供的hello接口,选择一个模拟器,点击运行。

ios_framework_tutorials_41

ios_framework_tutorials_42

(4)虽然运行成了,但我们发现Xcode提示了警告。

ios_framework_tutorials_43

这是由于我们编译的框架是静态库,运行崩溃时不会自动生成dSYM文件,只需要在新工程Build Setting -> Build Options下的Debug Information Format修改为DWARF即可。

ios_framework_tutorials_44

再次运行,Xcode不再提示警告。

16、结束语

其实编译类似于libXXX.a的iOS静态库框架,采用Xcode自带的向导,不必进行如上这么多复杂的操作即可完成。国内绝大多数公司提供的iOS框架也是似于libXXX.a的iOS静态库附加头文件。之所以这篇教程非要指导大家将框架编译成类似于XXX.framework的形式,也是为了跟苹果自带的绝大多数框架呈现形式保持一致,同时也让开发者简单拖动这个XXX.framework到工程就能完成对框架的加载。

整篇教程,个人觉得比较有技术含量的是步骤14,尤其是14中利用Aggregate自动合并真机框架与模拟器框架,虽然新建工程时写这么多脚本语言比较麻烦,但一旦写完后,以后每次打包就相当方便了,不必再去Terminal(终端)内合并真机框架与模拟器框架,既能省力,又可以避免不少因为粗心而造成的错误。

 

除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。

本文地址:https://www.cpplive.com/html/1870.html

这里因为你的留言而存在!!!

You must be logged in to post a comment.