Framework&&Bundle打包&&iOS SDK

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

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

1. Framework

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

  • 新建Framework工程
framework_1.jpg
framework_3.jpg
  • 配置工程
    1.IOS版本配置
    根据需要 7.0&&8.0均可 主要是兼容问题
    2.mach-O type
    由于是静态库 需要设置setting中Mach-O type 为Static Library

  • 终端导入Cocoapods
    导入项目所需要的Pods

    framework_8.jpg

  • 添加打包文件
    1.将项目需要打包的文件添加到项目文件目录中
    2.将项目所依赖的库文件(静态库,framework,lib导入并link)
    3.创建项目头文件,需要包含全部打包的文件
    格式如:#import<demo1/demo1.h>
    4.将Build Phases中headers头文件进行处理

    framework_14.jpg

  • 进行编译
    由于项目属于Framework,编译后只能在模拟器或真机中运行,而实际需求是要在两者内都可以正常操作,在编译前,我们这里要借助mac系统脚本文件Aggregate进行合并打包。
    1.创建aggregate target
    2.添加脚本

# 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
    bundle_1.jpg
  • 配置Bundle
    由于是OS X系统下的Bundle, 新建后我们要对其进行一些设置
  • "Base SDK" 设置为 "IOS 8.3" (Xcode 6.3.2为例)
  • "Build Active Architecture Only" 设置为 "YES"
  • "Debug Information Format" 设置为 "DWARF with dSYM File"
  • "OS X Deployment Target" 设置为 "Compiler Default"
  • "Skip Install" 设置为 "NO"
  • "Strip Debug Symbols During Copy" 中"Release"模式设置为 "YES"
  • "IOS Deployment Target" 设置为 "IOS 7.0"
  • "COMBINE_HIDPI_IMAGES" 设置为 "NO"
bundle_7.jpg
  • 导入打包资源文件并编译打包
    这里测试放入png,xib,storyborad,xcassets文件,以此类推.
bundle_11.jpg

3. 主项目调用

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

bundle_12.jpg
framework_26.jpg

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

4. 调用方法

  • bundle路径(定义宏)
#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
//加载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加载图片
// 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
//加载xib
    -(instancetype)init{
    NSBundle *bundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"bundle1.bundle"]];
    self = [super initWithNibName:@"testxib" bundle:bundle];
    return self;
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容