引用一张博客的图片来理解下基本知识(http://www.cnblogs.com/oc-bowen/p/7478461.html)

我们可以看出.a的封装和.framework的封装差不多,也有模拟器和真机合并的过程,通过上边的图片我们可以看出.a 和.framework的区别,就是.a+.h+soureFile=.framework。可以看出我们直接封装.framework其实是最好的。那么我们就来看看framework怎么封装的。

步骤

1、打开Xcode,新建工程名:MySDK
2、创建测试类:ShowInfo

ShowInfo.h

#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface ShowInfo : NSObject+ (void)show;@endNS_ASSUME_NONNULL_END

ShowInfo.m

#import "ShowInfo.h"@implementation ShowInfo+ (void)show {NSLog(@"-----ShowInfo------");
}@end
3. framework修改target配置

1.Mach-O type 修改为 static framework
2.暴露的头文件放在public下面
3.在MySDk.h中将你所有要公开的.h引入。(必须是公开的,否则无法引用)

只有Public里面的头文件才会给人看到,Project(默认情况下)和Private中的都不会被使用者看到。设置好需要公开的头文件后,我们需要在公开的头文件中引用,被公开的头文件

 import "ShowInfo.h"

4.需要把Build Active Architecture Only修改为NO,否则生成的静态库就只支持当前选择设备的架构。

4、设置编译选项(可选)

如果我们在打包的工程中,为系统的类增加了分类的情况下,需要修改这个编译选项,否则请跳过.

在Build Settings--> Linking -->Other Linker Flags 在后面增加[-ObjC] 注意大小写

1.手动打包

1、选中模拟器,command+B
2、选中真机,command+B
3、在finder中找到framework文件
4、终端合并MySDK

Last login: Thu Apr 18 19:58:24 on ttys005
lzz-Mac-mini:~ suning$ lipo -create /Users/suning/Desktop/VideoPlayerFramework/MySDK/Build/Products/Debug-iphoneos/MySDK.framework/MySDK /Users/suning/Desktop/VideoPlayerFramework/MySDK/Build/Products/Debug-iphonesimulator/MySDK.framework/MySDK -output /Users/suning/Desktop/VideoPlayerFramework/MySDK/Build/Products/MySDK
lzz-Mac-mini:~ suning$ lipo -info /Users/suning/Desktop/VideoPlayerFramework/MySDK/Build/Products/MySDK
Architectures in the fat file: /Users/suning/Desktop/VideoPlayerFramework/MySDK/Build/Products/MySDK are: x86_64 arm64
lzz-Mac-mini:~ suning$

合并成功,将Projects 文件夹下合并的 MySDK copy 到 MySDK.framework下替换MySDK ,后形成最终的目标 MySDK.framework 包

导入demo 使用

2.脚本化打包(shell)

.framework 也可以像 .a 一样将打包过程自动化,用脚本来实现自动打包
参考 iOS架构-静态库.a的脚本化打包及使用(3) 由于之前有过 .a 的脚本化打包的经验,那么这里就非常简单了。

那么就用脚本来把上面手动打包的过程实现一下:

  1. 把 iOS架构-静态库.a的脚本化打包及使用(3) 中的 Script.sh 的脚本copy 到和MySDk.xcodeproj 同一目录下
  2. 脚本之行后形成的目标文件 MySDK.framework
  3. 修改后的脚本,代码有注释
#!/bin/sh#  Script.sh
#  VideoPlayerLib
#
#  Created by lzz on 2019/4/10.
#  Copyright © 2019 lzz. All rights reserved.#注意:脚本目录和xxxx.xcodeproj要在同一个目录,如果放到其他目录,请自行修改脚本。
#要build的target名
target_Name=MySDK
echo "target_Name=${target_Name}"#工程名
project_name=$target_Name
echo "project_name=${project_name}"#打包模式 Debug/Release 默认是Release
development_mode=Release#当前脚本文件所在的路径 $(pwd)
SCRIPT_DIR=$(pwd)
echo "======脚本路径=${SCRIPT_DIR}======"#工程路径
#PROJECT_DIR=${SCRIPT_DIR} 和下面写法也样
PROJECT_DIR=$SCRIPT_DIR
echo "======工程路径=${PROJECT_DIR}======"#build之后的文件夹路径
build_DIR=$SCRIPT_DIR/Build
echo "======Build路径=${build_DIR}======"#真机build生成的.framework 文件路径
DEVICE_DIR=${build_DIR}/${development_mode}-iphoneos/${project_name}.framework#真机build生成的sdk文件路径
DEVICE_DIR_A=${build_DIR}/${development_mode}-iphoneos/${project_name}.framework/${project_name}
echo "======真机.framework路径=${DEVICE_DIR_A}======"#模拟器build生成的sdk文件路径
SIMULATOR_DIR_A=${build_DIR}/${development_mode}-iphonesimulator/${project_name}.framework/${project_name}
echo "======模拟器.framework路径=${SIMULATOR_DIR_A}======"#目标文件夹路径(也就SDK的文件:.framework文件 和 bundle文件)
INSTALL_DIR=${build_DIR}/Products/${project_name}
echo "======SDK的文件夹路径=${INSTALL_DIR}======"#目标 sdk 路径
INSTALL_DIR_A=${build_DIR}/Products/${project_name}/${project_name}.framework/${project_name}
echo "======目标sdk路径=${INSTALL_DIR}======"#判断build文件夹是否存在,存在则删除
#rm -rf 命令的功能:删除一个目录中的一个或多个文件或目录
if [ -d "${build_DIR}" ]
then
rm -rf "${build_DIR}"
fi#判断目标文件夹是否存在,存在则删除该文件夹
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi#创建目标文件夹
mkdir -p "${INSTALL_DIR}"echo "======盒子已经准备好了,开始生产.a 并合成装到盒子里吧======"#build之前clean一下
xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphonesimulator cleanxcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphoneos clean#模拟器build
xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphonesimulator#真机build
xcodebuild -target ${target_Name} -configuration ${development_mode} -sdk iphoneos#1.复制真机的${project_name}.framework到目标文件夹
#使用-R参数可实现递归功能,即所有子目录中的文件与目录均拷贝
cp -R "${DEVICE_DIR}" "${INSTALL_DIR}"#2.删除真机 INSTALL_DIR 中原来的MySDK 文件
#判断目标文件夹是否存在,存在则删除该文件夹
if [ -f "${INSTALL_DIR_A}" ]
then
rm -f "${INSTALL_DIR_A}"
fi#合成模拟器和真机 MySDK 文件替换目标文件夹中${project_name}.framework 下的 真机 MySDK 文件
lipo -create "${DEVICE_DIR_A}" "${SIMULATOR_DIR_A}" -output "${INSTALL_DIR_A}"echo "======合成结束======"# -f 判断文件是否存在
if [ -f "${INSTALL_DIR_A}" ]
then
echo "======验证合成包是否成功======"
lipo -info "${INSTALL_DIR_A}"
fi#打开目标文件夹
open "${INSTALL_DIR}"
  1. 终端执行脚本
Last login: Mon Apr 22 09:02:10 on console
lzz-Mac-mini:~ suning$ cd /Users/suning/Desktop/VideoPlayerFramework/MySDK
lzz-Mac-mini:MySDK suning$ ./Script.sh

结果

** BUILD SUCCEEDED **======合成结束======
======验证合成包是否成功======
Architectures in the fat file: /Users/suning/Desktop/VideoPlayerFramework/MySDK/Build/Products/MySDK/MySDK.framework/MySDK are: armv7 armv7s i386 x86_64 arm64
lzz-Mac-mini:MySDK suning$

让库支持armv7s

  1. 最终就形成了第2步
  1. 脚本之行后形成的目标文件 MySDK.framework

使用:我们就可以把上面路径下的 MySDK.framework 文件夹丢给客户了,然后尼?然后就可以喝喝茶,刷刷手机了!岂不乐哉!使用方法和(一)一样。

方法二:可以在公共新建Target:Aggregate
在Aggregate里面添加运行脚本,这里有个博客介绍的很详细
参考:http://www.cnblogs.com/oc-bowen/p/7478461.html

注意:

1. Debug和Release版本一般来说, 我们应该发布的是release版本.debug:调试版本, 系统本身也会有一些调试代码. 此版本体积会稍大, 运行会稍慢release: 发布版本, 系统会去除调试代码, 体积变小, 运行速度变快. 对用户来说没有明显的感觉2. 到底要不要合成多个架构真机和模拟器合成的好处: 调试会非常方便, 缺点是体积会变大(一种架构就占用一部分体积).真机和模拟器不合成的好处:体积小,  缺点是调试稍显麻烦.3. 资源包的问题a:静态库的资源, 都应该放到后缀为.bundle的文件夹中 --> 避免文件重名被覆盖, 导致加载资源文件出错b:静态库打包时, 并不会打包资源文件 --> 需要手动拖出去

iOS架构-静态库.framework手动打包及脚本化打包(5)相关推荐

  1. iOS架构-静态库.framework脚本化打包补充(5)

    静态库.framework脚本化打包打包已经在iOS架构-静态库.framework手动打包及脚本化打包(5)中讲过.这里补充是通过Xcode 配置Aggregate自动执行脚本打包Framework ...

  2. iOS架构-静态库.framework之资源文件打包bundle(6)

    iOS架构-静态库.framework手动打包及脚本化打包(5)中介绍了.framework的脚本化打包,虽然在iOS架构-静态库.a打包之资源文件打包成bundle(4)中已经演示过,其实是一样的. ...

  3. iOS架构-静态库.framework之依赖第三方库(7)

    需求分析:     把自己的能力封装成静态库提供给客户使用,但是有些工作市场上已经有很好的公开的代码,或者成本很低的解决方案,我们就可以使用别人公开的.或者低成本采购的技术来为我们服务.制作静态库也是 ...

  4. iOS架构-静态库.framework(引用第三方SDK、开源库、资源包)(9)

    前面介绍了 静态库.a依赖第三方静态库.a的制作 静态库.framework之依赖第三方库(Cocoapods进行管理) 今天课题: 静态库.framework(引用第三方SDK.framework. ...

  5. iOS架构-静态库.a打包之资源文件打包成bundle(4)

    iOS架构-静态库.a的打包及使用(一) iOS架构-静态库.a的脚本化打包及使用(二) 资源文件主要包括:xib.图片以及其他文件资源(json.string等).这里主要介绍 xib.图片.其他的 ...

  6. iOS架构-静态库.a的脚本化打包及使用(3)

    接着iOS架构-静态库.a的打包及使用(一)继续研究静态库.a的打包 需求背景: 手动编译静态库工程是会生成模拟器和真机两个不同的.a包 终端合成 $:lipo -create 真机.a路径 模拟器. ...

  7. iOS架构-静态库.a之依赖第三方静态库.a的制作(8)

    上一篇讲的是静态库.framework 依赖第三方库,是通过Cocoapod 提供的第三方库.而有时我们会依赖第三方.a 或者.framework 的.那么怎么样来制作依赖第三方.a 或者.frame ...

  8. iOS架构-静态库.a 和.framework的区别(0)

    原文网址:https://my.oschina.net/kaqijiang/blog/649632 一.什么是库? 库是共享程序代码的方式. 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存 ...

  9. iOS架构-静态库.a的打包及使用(2)

    补充知识-框架分类: 模拟器架构: • i386 : 32位架构 4S ~ 5 • x86_64 : 64位架构 5S ~ 现在的机型 真机架构: • armv7: 在最老的支持iOS7的设备上使用 ...

最新文章

  1. Eclipse 中maven插件坏死解决办法
  2. docker-compose up volumes 调用外部文件,权限问题 cannot open directory xxxxx .: Permission denied
  3. 用cxSelect插件补充一下回显过滤项功能
  4. 操作系统学习之用C语言模拟LRU算法
  5. 数据结构—链表-单链表应用-拆分链表
  6. 优化mysql插入数据_优化MySQL插入方法的五个妙招
  7. java寻宝题目,神都夜行录寻宝答题答案大全 挖宝答题答案汇总
  8. HDU6608 Fansblog【Miller_Rabin素性测试算法+威尔逊定理】
  9. 图片压缩,分辨率和尺寸大小修改工具(完全免费)
  10. 24V电磁铁电磁特模块电路分析
  11. 计算机水平居中,excel表格居中设置可数据还是偏左-excel表格,页面设置选水平居中了,为什么预览时它......
  12. K线形态识别—三K线之买入型三日K线组合
  13. 阿里云三网手机号实名认证和印刷文字识别_身份证识别
  14. C语言中如何测量各种变量的长度
  15. 马来西亚-沙巴-亚庇游记
  16. angular学习6之路由可选参数和必选参数
  17. python oracle 工具类,python连接Oracle工具类
  18. 俄罗斯电商平台ozon的崛起,卖家可以使用测评补单方式打造爆款吗?
  19. 松饼行业调研报告 - 市场现状分析与发展前景预测
  20. 浅谈一个完整网站配色方案设计大法3实战篇

热门文章

  1. mysql-atlas安装及使用教程
  2. 大数据引发的风险与管控
  3. linux命令:系统裁剪之五dropbear嵌入式系统专用ssh服务
  4. iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、view...
  5. 【翻译】了解Ext JS 5的小部件
  6. 转:在windows通过Xrdp软件远程桌面连接Fedora
  7. linux 下常见启动文件配置
  8. ASP.NET中常用功能代码总结(5)——文件操作篇
  9. sql输出表中重复数据
  10. 大数模板(加减乘除幂次开方)