合并模拟器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的合并

打开终端。输入pwd 先看一下当前所在的目当路径。使用ls 查看当前目录下的文件夹。 cd /users/[用户名]/Desktop/fmwksqlite/DerivedData/fmwksql...
  • smking
  • smking
  • 2014-04-24 20:43
  • 6307

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

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

ios framework 真机和模拟器合并

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

关于xcode7生成的framework静态库文件,模拟器和真机framwork如何合并

关于xcode7生成的framework静态库文件,模拟器和真机framwork如何合并前置部分条件 在 edit Scheme 中,选中run - Build Configuration - r...

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

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

真机 模拟器 framework 终端合并

打开终端。输入pwd 先看一下当前所在的目当路径。使用ls 查看当前目录下的文件夹。 cd /users/[用户名]/Desktop/fmwksqlite/DerivedData/fmwksql...

XCode 8.3 上真机与模拟器Framework的合并

在打包SDK的过程中,Xcode编译出的framework分为真机与模拟器两种,但在使用过程中,我们需要将两种进行合并。本文简单总结了下合并的过程。

【iOS】IOS 4.2 编写真机和模拟器通用的framework(静态库)

本文转自http://blog.csdn.net/fengsh998/article/details/8290687

真机调试报错:Library not loaded: @rpath/AFNetworking.framework/AFNetworking

在运行的时候,编译通过, 但程序在启动的时候,程序直接崩溃,显示如下: dyld: Library not loaded: @rpath/AFNetworking.framework/AFNetwo...
  • ridxmc
  • ridxmc
  • 2017-01-18 00:05
  • 1304

XCode6添加自定义framework运行真机出现dyld: Library not loaded的解决方法

笔记下,bei
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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