iOS中製作可複用的架構Framework

來源:互聯網
上載者:User

標籤:

iOS中製作可複用的架構Framework

        在iOS開發中,我們時常會使用一些我們封裝好的管理類,架構類,方法類等,我們在實現這些檔案時,可能還會依賴一些第三方庫或者系統庫。如果每次我們複用這些代碼時,都要將關聯的這些東西進行匯入,甚至還要進行arc和mrc的編譯設定,會浪費我們很大的精力。除此之外,如果項目需要多人合作,你可能也並不希望你的原始碼暴漏在所有人的面前,這個時候,我們就可以使用靜態庫或者動態庫的方式來對我們的代碼進行封裝,便於複用。靜態庫的製作方法在一篇舊的部落格中有描述:http://my.oschina.net/u/2340880/blog/398887。相比靜態庫檔案,動態庫的效率會更高且封裝性更好,這裡主要討論動態庫的製作。

        xcode6後支援在xcode中製作動態庫,並且過程也十分簡單。

        建立一個項目,選擇framework:


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

@interface MyObject : NSObject-(void)myLog;@end@implementation MyObject-(void)myLog{    NSLog(@"framework");}@end

        和靜態庫類似,如果我們不做任何處理,打包出來的庫檔案只能在模擬器或者只能在真機上使用,為了方便我們調試,我們可以添加一個指令碼命令,是的產生一個同時支援模擬器和真機的framework:

        建立target:


        選擇Aggregate:


        之後,我們在target的Build Phases中點擊加號:


        添加一個Run Script:


        在裡面添加如下的指令碼:


set -eset +u# Avoid recursively calling this script.if [[ $SF_MASTER_SCRIPT_RUNNING ]]thenexit 0fiset -uexport SF_MASTER_SCRIPT_RUNNING=1SF_TARGET_NAME=${PROJECT_NAME}SF_EXECUTABLE_PATH="${SF_TARGET_NAME}.framework/${SF_TARGET_NAME}"SF_WRAPPER_NAME="${SF_TARGET_NAME}.framework"if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]thenSF_SDK_PLATFORM=${BASH_REMATCH[1]}elseecho "Could not find platform name from SDK_NAME: $SDK_NAME"exit 1fiif [[ "$SDK_NAME" =~ ([0-9]+.*$) ]]thenSF_SDK_VERSION=${BASH_REMATCH[1]}elseecho "Could not find sdk version from SDK_NAME: $SDK_NAME"exit 1fiif [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]thenSF_OTHER_PLATFORM=iphonesimulatorelseSF_OTHER_PLATFORM=iphoneosfiif [[ "$BUILT_PRODUCTS_DIR" =~ (.*)$SF_SDK_PLATFORM$ ]]thenSF_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${SF_OTHER_PLATFORM}"elseecho "Could not find platform name from build products directory: $BUILT_PRODUCTS_DIR"exit 1firm -rf buildProductsmkdir buildProducts# Build the other platform.xcrun xcodebuild -project "${PROJECT_FILE_PATH}" -target "${TARGET_NAME}" -configuration "${CONFIGURATION}" -sdk ${SF_OTHER_PLATFORM}${SF_SDK_VERSION} BUILD_DIR="${BUILD_DIR}" OBJROOT="${OBJROOT}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}" $ACTION# Smash the two static libraries into one fat binary and store it in the .frameworkxcrun lipo -create "${BUILT_PRODUCTS_DIR}/$PRODUCT_NAME.framework/$PRODUCT_NAME" "${SF_OTHER_BUILT_PRODUCTS_DIR}/$PRODUCT_NAME.framework/$PRODUCT_NAME" -output "${PROJECT_DIR}/buildProducts/$PRODUCT_NAME"cp -rf ${BUILT_PRODUCTS_DIR}/$PRODUCT_NAME.framework ${PROJECT_DIR}/buildProductsmv ${PROJECT_DIR}/buildProducts/$PRODUCT_NAME ${PROJECT_DIR}/buildProducts/$PRODUCT_NAME.framework

接著,我們需要將給外界的介面檔案暴露出來,將其移動到public下即可:


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


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

在build->product中便可以找到我們的framework檔案,我們將其賦值出來即可以使用。

 我們測試一下,建立一個工程,將剛才製作的靜態庫匯入,如下加入標頭檔,調用方法,可以使用。

#import <MyFramework/MyObject.h> MyObject * obj = [[MyObject alloc]init];    [obj myLog];


兩個技巧:

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

二、一個優秀且完整的架構可能會包含相當多的檔案,包括架構自己的和其他第三方的,將所有的標頭檔都放在一個headers檔案夾中尋找和使用起來都會有些不便,我們可以將其中檔案進行檔案夾的分類,只需直接雙擊點入frameword檔案中,在headers檔案夾中直接建立檔案夾,然後將檔案進行分類即可,效果如下:


如此,我們的架構結構就會更加清晰,再發散一些,我們可以在裡面繼續嵌套framework,進一步最佳化項目的代碼。



iOS中製作可複用的架構Framework

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.