合并模拟器Framework与真机Framework

转载 2016年05月30日 16:12:46

如果写了一个Framework,根据Build时选择的机器类型,会分为模拟器Framework和真机Framework,两者是不能混用的。

此时可以通过配置一个Run Script,在Script中使用lipo命令来合并两个版本的Framework,重新生成一个新的Framework,这个Framework将同时支持在模拟器和真机上运行。

首先,在配置Run Script前,我们可以先检查下,Framework的类型,既查看Framework支持的机器架构:

打开【windows】-【Projects】,左侧选择项目,右侧点击Derived Data,打开目录后进入Build的主目录:

这个两个目录下包含了生成的Framework文件夹,第一个是真机、第二个是模拟器(当前使用的是Debug模式)。

现在我们分别对这两个目录中的Framework进行检测:

Debug-iphoneos(真机)目录下的Framework(Framework其实是个文件夹,命令中要再往下一层,使用以项目名称命名的一个二进制文件)

MiniPC:~ lijl$ lipo -info /Users/lijl/Library/Developer/Xcode/DerivedData/SwiftCommon-dyhotzllcfgqjibahyytumthguvh/Build/Products/Debug-iphoneos/SwiftCommon.framework/SwiftCommon 
Architectures in the fat file: /Users/lijl/Library/Developer/Xcode/DerivedData/SwiftCommon-dyhotzllcfgqjibahyytumthguvh/Build/Products/Debug-iphoneos/SwiftCommon.framework/SwiftCommon are: armv7 arm64 
MiniPC:~ lijl$ 

真机Framework的结果是:armv7  arm64。可见,如果把这个Framework运行在模拟器中,肯定会报错,因为模拟器架构是x86_64的(以目前最新的设备)

Debug-iphonesimulator(模拟器)目录下的Framework

MiniPC:~ lijl$ lipo -info /Users/lijl/Library/Developer/Xcode/DerivedData/SwiftCommon-dyhotzllcfgqjibahyytumthguvh/Build/Products/Debug-iphonesimulator/SwiftCommon.framework/SwiftCommon 
Non-fat file: /Users/lijl/Library/Developer/Xcode/DerivedData/SwiftCommon-dyhotzllcfgqjibahyytumthguvh/Build/Products/Debug-iphonesimulator/SwiftCommon.framework/SwiftCommon is architecture: x86_64
MiniPC:~ lijl$ 

模拟器Framework的结果是x86_64。可见这个库只能运行在模拟器中,真机设备是无法运行的。

接下来,我们要对这2个库(其实是Framework目录下2个可执行文件)进行合并。

在项目的Build Phases中,新建一个Run Script,输入下面内容:

(我测试了很久,下面这个修改后的Run Script会更加通用,不会出错)

if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework

DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework

SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework


if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi

mkdir -p "${INSTALL_DIR}"

cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"

lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"

#open "${DEVICE_DIR}"
#open "${SRCROOT}/Products"
fi


这段shell代码其实很简单,前面一大部分是申明一些目录路径,最后使用lipo命令进行合并操作。

在修改这个代码过程中,也许要学习下Xcode的全局变量,代码中那些${}值,都是Xcode自带的变量,详情请参考:Xcode环境变量

现在,当项目再次Build时,就会在项目目录下面出现Products目录,里面包含了合并后的Framework文件夹。

使用lipo -info来检测下:

MiniPC:~ lijl$ lipo -info /Users/lijl/Documents/Self\ Project/Cocoa\ Touch\ Framework/SwiftCommon/Products/SwiftCommon.framework/SwiftCommon 
Architectures in the fat file: /Users/lijl/Documents/Self Project/Cocoa Touch Framework/SwiftCommon/Products/SwiftCommon.framework/SwiftCommon are: x86_64 armv7 arm64 
MiniPC:~ lijl$ 

成功的集成了X86_64和arm,这样真机与模拟器都可以用啦


建立一个真机和模拟器通用的framework

转自: 建立一个真机和模拟器通用的framework 首先用finder找到framework所在的位置 然后找到framework中的文件,例如这里的  Kalagam...
  • shuicg
  • shuicg
  • 2014年05月28日 15:02
  • 2580

iOS 合并framework的方法

出处:http://devonios.com/xcode-lipo-framework.html   感谢!!! 在工程中添加script脚本 if [ "${ACTION}" = "build"...
  • cjh965063777
  • cjh965063777
  • 2015年10月14日 11:20
  • 1905

ios framework 真机和模拟器合并

最近百度地图的SDK更新了,为了兼容IOS 9 ,不得不做更新。 下载SDK后发现,原来的静态库.a木有了。现在是framework,而且做了真机和模拟器两个,显然需要我们将两个framework合...
  • HeroRazor
  • HeroRazor
  • 2016年07月18日 16:17
  • 833

iOS 关于真机和模拟器framework合并

有时候在项目中,模拟器和真机上运行一个项目的时候,因为某些静态库的原因,可能某一个方面不能运行,大部分情况就是模拟器上不可以但是在真机上可以。接下来要做的就是把某一个工程生成的静态库进行打包以后生成的...
  • koocui
  • koocui
  • 2017年07月06日 11:56
  • 192

iOS开发之制作framework并将模拟器Framework与真机Framework合并

什么是framework Framework是资源的集合,将静态库(iOS8以后可以是动态库)和其头文件包含到一个结构中,让Xcode可以方便地把它纳入到你的项目中。 分为真机—Debug(调...
  • james_1010
  • james_1010
  • 2016年11月28日 10:54
  • 1579

iOS 关于真机和模拟器framework合并

有时候在项目中,模拟器和真机上运行一个项目的时候,因为某些静态库的原因,可能某一个方面不能运行,大部分情况就是模拟器上不可以但是在真机上可以。接下来要做的就是把某一个工程生成的静态库进行打包以后生成的...
  • koocui
  • koocui
  • 2017年07月06日 11:56
  • 192

用lipo合并模拟器Framework与真机Framework【转载】

如果写了一个Framework,根据Build时选择的机器类型,会分为模拟器Framework和真机Framework,两者是不能混用的。 此时可以通过配置一个Run Script,在Scrip...
  • gavin8803
  • gavin8803
  • 2016年08月03日 14:57
  • 411

用lipo合并模拟器Framework与真机Framework

真机 模拟器 framework
  • u011342466
  • u011342466
  • 2016年07月18日 11:45
  • 280

Swift工程下,合并真机和模拟器framework

最近做项目,抛弃了之前常用的objective语言,开始使用新的swift语言, 首先遇到的问题就是网络请求和Json解析,经过一番考察,决定使用Alamofire做网络请求,使用SwiftJson...
  • qq896953198
  • qq896953198
  • 2017年05月04日 14:37
  • 257

ios 打包framework用到的脚本 一

权做以记录,需要用的同学,需要根据脚本自己修改。本脚本用来打包framework用的 # Take build target if [[ "$SDK_NAME" =~ ([A-Za-z...
  • marryshi
  • marryshi
  • 2016年05月16日 11:46
  • 2388
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:合并模拟器Framework与真机Framework
举报原因:
原因补充:

(最多只允许输入30个字)