如何创建你自己的Framework

作者: 爱吃鱼的小灰 | 来源:发表于2016-12-30 11:24 被阅读63次
    这个是适用于模拟器的,下一篇分享如何做出适用于模拟器和真机的FrameWork
    什么是Framework?
    • Framework是资源的集合,将静态库和其头文件包含到一个结构中,让Xcode可以方便地把它纳入到你的项目中。
    • 在OS X上,可能会创建一个动态连接(Dynamically Linked)的framework。通过动态连接,framework可以更新,不需要应用重新连接。在运行时,库中代码的一份拷贝被分享出来,整个工程都可以使用它,因此,这样减少了内存消耗,提高了系统的性能。不得不说这是一个功能强大的特性。
    • 在iOS上,你不能用这种方式添加为系统添加自定义的framework,因此仅有的动态链接的framework只能是Apple提供的那些。(编者注:在iOS 8中已加入此特性,开发者可以使用第三方的动态框架)。然而,这并不意味着framework对于iOS而言是无关紧要的,静态连接的framework依然可以打包代码,使其在不同的应用中复用。
    • 由于framework本质上是静态库的“一站式采购点”。当跟着教程走到如何创建framework时,你就能明白你所做的一切了,整体思路也不会那么烟雾缭绕了。
    下面来看如何创建你自己的FrameWork吧

    1、创建一个framework:

    1.png

    2、创建两个工具类:

    2.png

    3、这两个类里的代码如下:

    // 这个是JHTools1.h文件
    #import <Foundation/Foundation.h>
    @interface JHTools1 : NSObject
    - (void) print;
    @end
    
    // JHTools1.m文件内容
    #import "JHTools1.h"
    @implementation JHTools1
    - (void) print
    {
        NSLog(@"JHTools1");
    }
    @end
    
    // JHTools2.h文件
    #import <Foundation/Foundation.h>
    @interface JhTools2 : NSObject
    - (void) myPrint;
    @end
    
    // JHTools2.m文件
    #import "JhTools2.h"
    #import "JHTools1.h"
    @implementation JhTools2
    - (void) myPrint
    {
        JHTools1 * tool = [[JHTools1 alloc]init];
        [tool print];
    }
    @end
    

    4、然后是这个frameworktest.h文件的内容

    #import <UIKit/UIKit.h>
    // 其实就是把创建的两个类的头文件放进来了
    #import "JHTools1.h"
    #import "JHTools2.h"
    //! Project version number for frameworktest.
    FOUNDATION_EXPORT double frameworktestVersionNumber;
    
    //! Project version string for frameworktest.
    FOUNDATION_EXPORT const unsigned char frameworktestVersionString[];
    
    // In this header, you should import all the public headers of your framework using statements like #import <frameworktest/PublicHeader.h>
    

    5、创建一个target,生成一个同时支持模拟器和真机的framework

    3.png

    6、选择 Cross-platform->Aggregate

    4.png

    7、选中target,点击➕新建 run script phase

    5.png 6.png

    脚本在下边哦!
    8、粘贴以下脚本

    set -e
    set +u
    # Avoid recursively calling this script.
    if [[ $SF_MASTER_SCRIPT_RUNNING ]]
    then
    exit 0
    fi
    set -u
    export SF_MASTER_SCRIPT_RUNNING=1
    
    SF_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]+) ]]
    then
    SF_SDK_PLATFORM=${BASH_REMATCH[1]}
    else
    echo "Could not find platform name from SDK_NAME: $SDK_NAME"
    exit 1
    fi
    
    if [[ "$SDK_NAME" =~ ([0-9]+.*$) ]]
    then
    SF_SDK_VERSION=${BASH_REMATCH[1]}
    else
    echo "Could not find sdk version from SDK_NAME: $SDK_NAME"
    exit 1
    fi
    
    if [[ "$SF_SDK_PLATFORM" = "iphoneos" ]]
    then
    SF_OTHER_PLATFORM=iphonesimulator
    else
    SF_OTHER_PLATFORM=iphoneos
    fi
    
    if [[ "$BUILT_PRODUCTS_DIR" =~ (.*)$SF_SDK_PLATFORM$ ]]
    then
    SF_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${SF_OTHER_PLATFORM}"
    else
    echo "Could not find platform name from build products directory: $BUILT_PRODUCTS_DIR"
    exit 1
    fi
    
    rm -rf buildProducts
    mkdir 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 .framework
    xcrun 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}/buildProducts
    mv ${PROJECT_DIR}/buildProducts/$PRODUCT_NAME ${PROJECT_DIR}/buildProducts/$PRODUCT_NAME.framework
    

    9、选中framework 这是需要暴露的头文件

    7.png

    10、commod +b 编译,选中项目找到静态库的位置

    8.png
    如何使用呢?

    1、将库导入工程

    9.png

    2、在ViewController.m中导入头文件代码如下:

    #import "ViewController.h"
    // 导入头文件
    #import <frameworktest/frameworktest.h>
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
     - (void)viewDidLoad {
        [super viewDidLoad];、
    // 创建类
        JhTools2 * tools = [[JhTools2 alloc]init];
    // 调用方法
        [tools myPrint];
    }
    @end
    
    • 不出意外的话,会有以下崩溃 :
    10.png

    3、解决办法首先Build Phases -> 左上角的➕->New Copy Files Phase:

    11.png

    接下来继续跟着步骤走啊:

    12.png

    4、到此结束完成了运行下吧
    调用结果为:

    2016-12-30 11:22:22.534 test[8283:11798681] JHTools1
    

    相关文章

      网友评论

        本文标题:如何创建你自己的Framework

        本文链接:https://www.haomeiwen.com/subject/zkqjvttx.html