iOS开发——制作Framework

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 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值