iOS开发——制作Framework

来源:互联网 发布:免费视频聊天的软件 编辑:程序博客网 时间:2024/05/22 00:41

http://www.cocoachina.com/ios/20150127/11022.html

创建一个静态库工程

点击File\New\Project,选择iOS\Framework and Library\Cocoa Touch Static Library新建一个静态库工程.

 删除RWUIControls.m 
RWUIControls.h 全部改为 #import<UIKit/UIKit.h>
Xcode的静态库工程不会自动连接到UIKit,在工程导航栏中选择工程名,然后在中央面板中选择Targets RWUIControls ,添加UIKit.framework

添加头文件 Editor\Add Build Phase\Add Headers Build Phase (点击下方Build Phases界面的白色区域来获取Xcode的应用焦点

RWUIControls.h拖到public下.

在项目导航栏中点击项目名,然后选择RWUIControls静态库目标,选择Build Setting栏,将public header设置为 include/$(PROJECT_NAME)

改变设置:

  • Dead Code Stripping设置为NO

  • Strip Debug Symbol During Copy 全部设置为NO

  • Strip Style设置为Non-Global Symbols

command + B进行编译。

一旦成功,工程导航栏中Product目录下libRWUIControls.a文件将从红色变为黑色,表明现在该文件已经存在了。

创建一个依赖开发(Dependent Development)工程

使用File\New\Project创建一个新的工程,选择iOS\Application\Single View Application,将新工程命名为UIControlDevApp,将类前缀命名为RW,选择该工程只支持iPhone,最后将项目保存到和之前的RWUIControls相同的目录下。

添加RWUIControls依赖库,将RWUIControls.xcodeproj从Finder中拖到Xcode中UIControlDevApp组下。

ios_framework_import_library_into_dev_app-700x357.png


  • 在项目导航栏中选择UIControlDevApp。

  • 导航到UIControlDevApp目标下Build Phases面板下。

  • 打开Target Dependencies面板,点击+按钮调出选择器。

  • 找到RWUIControls静态库,选择并点击Add。这一步表明当构建dev应用时,Xcode会检查是否静态库需要重新构建。

为了连接到静态库本身,展开Link Binary With Libraries面板,再次点击+按钮,从Workspace组中选择libRWUIControls.a然后点击Add。

这一步确保Xcode可以连接到静态库,就像连接到系统framework(例如UIKit)一样。

ios_framework_add_dependencies_to_dev_app.gif

创建一个Framework

现在你需要在静态库构建过程中添加脚本来创建这种结构,在项目导航栏中选择RWUIControls,然后选择RWUIControls静态库目标,选择Build Phases栏,然后选择Editor/Add Build Phase/Add Run Script Build Phase来添加一个新的脚本。

双击面板标题栏Run Script,重命名为Build Framework。

在脚本文本框中粘贴下面的Bash脚本代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
set -e
  
export FRAMEWORK_LOCN="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework"
  
# Create the path to the real Headers die
mkdir -p "${FRAMEWORK_LOCN}/Versions/A/Headers"
  
# Create the required symlinks
/bin/ln -sfh A "${FRAMEWORK_LOCN}/Versions/Current"
/bin/ln -sfh Versions/Current/Headers "${FRAMEWORK_LOCN}/Headers"
/bin/ln -sfh "Versions/Current/${PRODUCT_NAME}" \
             "${FRAMEWORK_LOCN}/${PRODUCT_NAME}"
  
# Copy the public headers into the framework
/bin/cp -a "${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/" \
           "${FRAMEWORK_LOCN}/Versions/A/Headers"

选择RWUIControls静态库scheme,然后选择iOS Device构建目标,然后使用cmd+B构建。

在这次构建目录中你可以看到RWUIControls.framework,可以确定一下这里展示了正确的目录结构:


不过你会注意到这里并没有一个静态lib文件

在项目导航栏中选择RWUIControls,然后点击已经存在的目标下面的Add Target按钮。

找到iOS/Other/Aggregate,点击Next,将目标命名为Framework。

在Framework目标下,选择Build Phases栏,点击Editor/Add Build Phase/Add Run Script Build Phase,创建一个新的Run Script Build Phase。


双击Run Script,重命名脚本的名字。这次命名为MultiPlatform Build。

在脚本文本框中粘贴下面的Bash脚本代码:

1
2
3
4
5
6
7
8
9
10
11
set -e
  
# If we're already inside this script then die
if [ -n "$RW_MULTIPLATFORM_BUILD_IN_PROGRESS" ]; then
  exit 0
fi
export RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1
  
RW_FRAMEWORK_NAME=${PROJECT_NAME}
RW_INPUT_STATIC_LIB="lib${PROJECT_NAME}.a"
RW_FRAMEWORK_LOCATION="${BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework"

接下来,用脚本设置一些函数,这些函数一会项目就会用到,把下面的代码加到脚本的底部。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function build_static_library {
    # Will rebuild the static library as specified
    #     build_static_library sdk
    xcrun xcodebuild -project "${PROJECT_FILE_PATH}" \
                     -target "${TARGET_NAME}" \
                     -configuration "${CONFIGURATION}" \
                     -sdk "${1}" \
                     ONLY_ACTIVE_ARCH=NO \
                     BUILD_DIR="${BUILD_DIR}" \
                     OBJROOT="${OBJROOT}" \
                     BUILD_ROOT="${BUILD_ROOT}" \
                     SYMROOT="${SYMROOT}" $ACTION
}
  
function make_fat_library {
    # Will smash 2 static libs together
    #     make_fat_library in1 in2 out
    xcrun lipo -create "${1}" "${2}" -output "${3}"
}

把下面的代码添加到脚本的底部。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]; then
  RW_SDK_PLATFORM=${BASH_REMATCH[1]}
else
  echo "Could not find platform name from SDK_NAME: $SDK_NAME"
  exit 1
fi
  
# 2 - Extract the version from the SDK
if [[ "$SDK_NAME" =~ ([0-9]+.*$) ]]; then
  RW_SDK_VERSION=${BASH_REMATCH[1]}
else
  echo "Could not find sdk version from SDK_NAME: $SDK_NAME"
  exit 1
fi
  
# 3 - Determine the other platform
if "$RW_SDK_PLATFORM" == "iphoneos" ]; then
  RW_OTHER_PLATFORM=iphonesimulator
else
  RW_OTHER_PLATFORM=iphoneos
fi
  
# 4 - Find the build directory
if [[ "$BUILT_PRODUCTS_DIR" =~ (.*)$RW_SDK_PLATFORM$ ]]; then
  RW_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}"
else
  echo "Could not find other platform build directory."
  exit 1
fi

在脚本最后添加下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
# Build the other platform.
build_static_library "${RW_OTHER_PLATFORM}${RW_SDK_VERSION}"
  
# If we're currently building for iphonesimulator, then need to rebuild
#   to ensure that we get both i386 and x86_64
if "$RW_SDK_PLATFORM" == "iphonesimulator" ]; then
    build_static_library "${SDK_NAME}"
fi
  
# Join the 2 static libs into 1 and push into the .framework
make_fat_library "${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \
                 "${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \
                 "${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}"

脚本的最后是简单的拷贝命令,将下面代码添加到脚本最后:

1
2
3
4
5
6
# Ensure that the framework is present in both platform's build directories
cp -a "${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}" \
      "${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework/Versions/A/${RW_FRAMEWORK_NAME}"
  
# Copy the framework to the user's desktop
ditto "${RW_FRAMEWORK_LOCATION}" "${HOME}/Desktop/${RW_FRAMEWORK_NAME}.framework"
选择Framework集合方案(aggregate scheme),按下cmd+B编译该framework。

检查一下我们的多平台编译真的成功了,启动终端

cd ~/Desktop/RWUIControls.framework

lipo -info RWUIControls 



原创粉丝点击