天天看點

iOS中制作可複用的架構Framework

        xcode6後支援在xcode中制作動态庫,并且過程也十分簡單。

        建立一個項目,選擇framework:

iOS中制作可複用的架構Framework

        之後我們在裡面編寫我們的代碼,比如我們建立一個myobject類:

<a href="http://my.oschina.net/u/2340880/blog/491268#">?</a>

1

2

3

4

5

6

7

8

9

<code>@interface myobject : nsobject</code>

<code>-(</code><code>void</code><code>)mylog;</code>

<code>@end</code>

<code>@implementation myobject</code>

<code>-(</code><code>void</code><code>)mylog{</code>

<code>    </code><code>nslog(@</code><code>"framework"</code><code>);</code>

<code>}</code>

        和靜态庫類似,如果我們不做任何處理,打包出來的庫檔案隻能在模拟器或者隻能在真機上使用,為了友善我們調試,我們可以添加一個腳本指令,是的生成一個同時支援模拟器和真機的framework:

        建立target:

iOS中制作可複用的架構Framework

        選擇aggregate:

iOS中制作可複用的架構Framework

        之後,我們在target的build phases中點選加号:

iOS中制作可複用的架構Framework

        添加一個run script:

iOS中制作可複用的架構Framework

        在裡面添加如下的腳本:

iOS中制作可複用的架構Framework

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

<code>set</code> <code>-e</code>

<code>set</code> <code>+u</code>

<code># avoid recursively calling this script.</code>

<code>if</code> <code>[[ $sf_master_script_running ]]</code>

<code>then</code>

<code>exit</code> <code>0</code>

<code>fi</code>

<code>set</code> <code>-u</code>

<code>export</code> <code>sf_master_script_running=1</code>

<code>sf_target_name=${project_name}</code>

<code>sf_executable_path=</code><code>"${sf_target_name}.framework/${sf_target_name}"</code>

<code>sf_wrapper_name=</code><code>"${sf_target_name}.framework"</code>

<code>if</code> <code>[[ </code><code>"$sdk_name"</code> <code>=~ ([a-za-z]+) ]]</code>

<code>sf_sdk_platform=${bash_rematch[1]}</code>

<code>else</code>

<code>echo</code> <code>"could not find platform name from sdk_name: $sdk_name"</code>

<code>exit</code> <code>1</code>

<code>if</code> <code>[[ </code><code>"$sdk_name"</code> <code>=~ ([0-9]+.*$) ]]</code>

<code>sf_sdk_version=${bash_rematch[1]}</code>

<code>echo</code> <code>"could not find sdk version from sdk_name: $sdk_name"</code>

<code>if</code> <code>[[ </code><code>"$sf_sdk_platform"</code> <code>= </code><code>"iphoneos"</code> <code>]]</code>

<code>sf_other_platform=iphonesimulator</code>

<code>sf_other_platform=iphoneos</code>

<code>if</code> <code>[[ </code><code>"$built_products_dir"</code> <code>=~ (.*)$sf_sdk_platform$ ]]</code>

<code>sf_other_built_products_dir=</code><code>"${bash_rematch[1]}${sf_other_platform}"</code>

<code>echo</code> <code>"could not find platform name from build products directory: $built_products_dir"</code>

<code>rm</code> <code>-rf buildproducts</code>

<code>mkdir</code> <code>buildproducts</code>

<code># build the other platform.</code>

<code>xcrun xcodebuild -project </code><code>"${project_file_path}"</code> <code>-target </code><code>"${target_name}"</code> <code>-configuration </code><code>"${configuration}"</code> <code>-sdk ${sf_other_platform}${sf_sdk_version} build_dir=</code><code>"${build_dir}"</code> <code>objroot=</code><code>"${objroot}"</code> <code>build_root=</code><code>"${build_root}"</code> <code>symroot=</code><code>"${symroot}"</code> <code>$action</code>

<code># smash the two static libraries into one fat binary and store it in the .framework</code>

<code>xcrun lipo -create </code><code>"${built_products_dir}/$product_name.framework/$product_name"</code> <code>"${sf_other_built_products_dir}/$product_name.framework/$product_name"</code> <code>-output </code><code>"${project_dir}/buildproducts/$product_name"</code>

<code>cp</code> <code>-rf ${built_products_dir}/$product_name.framework ${project_dir}</code><code>/buildproducts</code>

<code>mv</code> <code>${project_dir}</code><code>/buildproducts/</code><code>$product_name ${project_dir}</code><code>/buildproducts/</code><code>$product_name.framework</code>

接着,我們需要将給外界的接口檔案暴露出來,将其移動到public下即可:

iOS中制作可複用的架構Framework

之後我們運作程式,需要注意的一點事,如果要支援64位,需要在編譯選項中設定,如下:

iOS中制作可複用的架構Framework

到此時,我們的framework庫檔案就制作完成,在xcode的window-&gt;projects中選中我們的這個項目,點選進入檔案夾的小箭頭:

iOS中制作可複用的架構Framework
iOS中制作可複用的架構Framework

在build-&gt;product中便可以找到我們的framework檔案,我們将其指派出來即可以使用。

iOS中制作可複用的架構Framework

 我們測試一下,建立一個工程,将剛才制作的靜态庫導入,如下加入頭檔案,調用方法,可以使用。

<code>#import &lt;myframework/myobject.h&gt;</code>

<code> </code><code>myobject * obj = [[myobject alloc]init];</code>

<code>    </code><code>[obj mylog];</code>

兩個技巧:

一、如果你運作程式出現類似reason: image not found!的崩潰資訊,可能的原因是動态庫檔案中的某些檔案你的項目中已經包含了,在build phases中将required改成optional即可。

二、一個優秀且完整的架構可能會包含相當多的檔案,包括架構自己的和其他第三方的,為了使用的友善,我們可以将頭檔案都導入一個的頭檔案中,這裡有一個地方我們需要注意,我們直接在framework工程中添加的頭檔案是不會編譯的,我的解決方案是通過建一個oc的類,在這個類中導入這個總的頭檔案,将這個類隐藏成私有的,就可以解決問題了。

繼續閱讀