IOS知识积累ios进阶iOS-行知

Framework&&Bundle打包&

2016-04-12  本文已影响5528人  earthX

在网上搜索了很多关于静态库的知识,最后都是不了了之,遂怒发冲冠,暴走了一次,将Framework打包的一些详细细节加以记录,给予有同样需求的朋友一些帮助。

首先,Framework作为静态库,是苹果公司允许的一种打包机制,通常SDK的制作也是通过讲.h文件和.m文件加以编译,打包成framework,而例如图片,xib,storyboard,xcassets等资源文件通常是以bundle的方式进行打包,framewrok和bundle本质上都是一种资源包,以一种包集合的概念来对目标文件进行封装。同时,Cocoapods的出现为我们带来了更加便捷的方便,搜索了很多也找不到一个很满意的可以支持Pods方式的静态库打包,我们接下来就尝试进行依赖Cocoapods方式的Framework方式的打包。

1. Framework

Framework打包其实很容易,首先,我们将原有工程的项目进行剥离,这里我用了SDAutoLayout的Demo进行操作。
附上传送门:SDAutoLayoutDemo

framework_1.jpg framework_3.jpg
# Sets the target folders and the final framework product.
# 如果工程名称和Framework的Target名称不一样的话,要自定义FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos -arch armv7 -arch armv7s -arch arm64 clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator -arch x86_64 clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${SRCROOT}/Products/"

3.设置Run 模式为 release模式


framework_19.jpg

4.删除Frameworks中的libPod.a文件
这个需要强调一下,必须要删除这个文件,因为打包后该项目不存在拿给其他项目用的时候,该文件会重复,引起报错。


framework_20.jpg

5.编译生成Framework

framework_21.jpg

2. Bundle打包

前文说过,例如图片,xib,storyboard,xcassets等资源文件通常是以bundle的方式进行打包,framewrok和bundle本质上都是一种资源包,以一种包集合的概念来对目标文件进行封装。且bundle在xcode7中已经被划分到mac项目文件中来,新建时要从OS X文件中寻找。

bundle_7.jpg bundle_11.jpg

3. 主项目调用

需要将主项目Enable Bitcode 设置为“YES”

bundle_12.jpg framework_26.jpg

需要注意的是 如果主项目中采用了Category的话 需要在引用framework的工程中设置 Build Pharse -> Other Linker Flags中加上 -all_load 就OK了,再次运行工程,可以完成所有的打印过程.

4. 调用方法

#define MYBUNDLE_NAME_2   @"bundle1.bundle"
#define MYBUNDLE_PATH_2   [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME_2]
#define MYBUNDLE_2        [NSBundle bundleWithPath: MYBUNDLE_PATH_2]
//加载storyboard
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SFMapKit" bundle:MYBUNDLE_2];
    UIViewController *test = [storyboard instantiateViewControllerWithIdentifier:@"test"];
    [self.navigationController pushViewController:test animated:YES];
// bundle加载图片
    UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    imageView.image = [UIImage imageWithContentsOfFile:[MYBUNDLE_PATH_2 stringByAppendingPathComponent:@"test.png"]];
    [self.view addSubview:imageView];
// xcassets加载图片
    UIImageView *imageView1 = [[UIImageView alloc]initWithFrame:CGRectMake(100, 260 , 40, 40)];
    UIImage *image1 = [UIImage imageNamed:@"ScanBook_HL" inBundle:MYBUNDLE_2 compatibleWithTraitCollection:nil];
    imageView1.image = image1;
    [self.view addSubview:imageView1];
//加载xib
    -(instancetype)init{
    NSBundle *bundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"bundle1.bundle"]];
    self = [super initWithNibName:@"testxib" bundle:bundle];
    return self;
}

好了到此为止,问题解决!

上一篇下一篇

猜你喜欢

热点阅读