xcode6後支援在xcode中制作動态庫,并且過程也十分簡單。
建立一個項目,選擇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:
選擇aggregate:
之後,我們在target的build phases中點選加号:
添加一個run script:
在裡面添加如下的腳本:
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下即可:
之後我們運作程式,需要注意的一點事,如果要支援64位,需要在編譯選項中設定,如下:
到此時,我們的framework庫檔案就制作完成,在xcode的window->projects中選中我們的這個項目,點選進入檔案夾的小箭頭:
在build->product中便可以找到我們的framework檔案,我們将其指派出來即可以使用。
我們測試一下,建立一個工程,将剛才制作的靜态庫導入,如下加入頭檔案,調用方法,可以使用。
<code>#import <myframework/myobject.h></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的類,在這個類中導入這個總的頭檔案,将這個類隐藏成私有的,就可以解決問題了。