给iOS 模拟器“安装”app文件

前言

刚刚接触iOS的时候,我就一直很好奇,模拟器上面能不能直接安装app呢?如果可以,我们就直接在模拟器上面聊QQ和微信了。直到昨天和朋友们聊到了这个话题,没有想到还真的可以给模拟器“安装”app!

一.应用场景

先来谈谈是什么情况下,会有在模拟器上安装app的需求。

在一个大公司里,对源码的管理有严格的制度,非开发人员是没有权限接触到源码的。对苹果的开发证书管理也非常严格,甚至连开发人员也没有发布证书,证书只在持续集成环境或者Appstore产线里面,或者只在最后打包上架的人手上。

那么现在就有这样的需求,开发人员搭建好UI以后,要把开发完成的Alapha版给到UI设计师那边去评审,看看是否完全达到要求,达不到要求就需要打回来重做。

一般做法就是直接拿手机去安装一遍了。直接真机看效果。不过要是设计师和开发不在同一个地方的公司,一个在北京一个在上海,这种就没法安装了。源码又无法导出给设计师,让他运行一下Xcode跑一下模拟器。打release的ipa通过扫码安装,如果公司大了,UDID全部都用完了,也没法安装。这个时候就比较麻烦了。(一般也没人遇到这么蛋疼的事情吧)

那么现在就有给模拟器安装app的需求了,那开发人员如何能把开发版的app给打包出来给其他模拟器安装呢?

二.解决办法

解决思路,想要别人的模拟器运行起我们开发的app,最简单的办法就是把我们DerivedData的数据直接拷贝到别人模拟器上面,就可以了。当然还要考虑到设计师也许并不会一些命令行命令,我们的操作越傻瓜越好。

1.拷贝本地的DerivedData里面的debug包

Mac的拷贝命令有cp和ditto,建议用ditto进行拷贝工作。

Usage: ditto [  ] src [ ... src ] dst

are any of:

-h                         print full usage

-v                         print a line of status for each source copied

-V                         print a line of status for every file copied

-X                         do not descend into directories with a different device ID

-c                         create an archive at dst (by default CPIO format)

-x                         src(s) are archives

-z                         gzip compress CPIO archive

-j                         bzip2 compress CPIO archive

-k                         archives are PKZip

--keepParent               parent directory name src is embedded in dst_archive

--arch archVal             fat files will be thinned to archVal

multiple -arch options can be specified

archVal should be one of "ppc", "i386", etc

--bom bomFile              only objects present in bomFile are copied

--norsrc                   don‘t preserve resource data

--noextattr                don‘t preserve extended attributes

--noqtn                    don‘t preserve quarantine information

--noacl                    don‘t preserve ACLs

--sequesterRsrc            copy resources via polite directory (PKZip only)

--nocache                  don‘t use filesystem cache for reads/writes

--hfsCompression           compress files at destination if appropriate

--nopreserveHFSCompression don‘t preserve HFS+ compression when copying files

--zlibCompressionLevel num use compression level ‘num‘ when creating a PKZip archive

--password                 request password for reading from encrypted PKZip archive

Ditto比cp命令更好的地方在于:

  1. 它在复制过程中不仅能保留源文件或者文件夹的属性与权限,还能保留源文件的资源分支结构和文件夹的源结构。
  2. 此命令能确保文件或者文件夹被如实复制。
  3. 如果目标文件或者文件夹不存在,ditto将直接复制过去或创建新的文件和文件夹,相反,对于已经存在的文件,命令将与目标文件(夹)合并。
  4. ditto还能提供完整符号链接。

那么我们就拷贝出本地的debug包

ditto -ck --sequesterRsrc --keepParent `ls -1 -d -t ~/Library/Developer/Xcode/DerivedData/*/Build/Products/*-iphonesimulator/*.app | head -n 1` /Users/YDZ/Desktop/app.zip

有几点需要说明的:

  1. 上面命令最后一个路径(/Users/YDZ/Desktop/app.zip),这个是自定义的,我这里举的例子是直接放在桌面。除了这里改一下路径,前面的都不需要改,包括 * 也都不用改。
  2. 再来说一下命令里面的 * 的问题。当我们打开自己本地的~/Library/Developer/Xcode/DerivedData/ ,这个路径下,会发现里面装的都是在我们本地模拟器上运行过的app程序。前面是app的Bundle Identifier,横线后面是一堆字符串。上面的ditto里面带 * 的那个路径是为了动态匹配一个地址的,* 在这里也是一个通配符。后面的head说明了匹配的规则。head其实是找出最近一次我们运行模拟器的app的路径。

为了保证我们打包是正确的,建议先运行一下我们要打包的app,一般我们Scheme里面的Run都是debug product(如果这里有更改,那就改成对应debug的Scheme),确保是我们要给设计师审核的app,之后再运行这个ditto命令。

2.把debug包拷贝到另一个模拟器中

我们运行完上面的ditto命令会产生一个zip文件,解压出来,会得到一个app文件,这个就是debug包了。debug包就是我们要给设计师的app包了。

如何能让设计师傻瓜式的安装这个app呢?

这里介绍一个命令行工具,ios-sim命令行工具。

ios-sim 是一个可以在命令控制iOS模拟器的工具。利用这个命令,我们可以启动一个模拟器,安装app,启动app,查询iOS SDK。它可以使我们像自动化测试一样不用打开Xcode。

不过 ios-sim 只支持Xcode 6 以后的版本。

安装ios-sim

$ npm install ios-sim -g

说明文档:

Usage: ios-sim  [--args ...]

Commands:

showsdks                        List the available iOS SDK versions

showdevicetypes                 List the available device types

launch        Launch the application at the specified path on the iOS Simulator

start                           Launch iOS Simulator without an app

install       Install the application at the specified path on the iOS Simulator without launching the app

Options:

--version                       Print the version of ios-sim

--help                          Show this help text

--exit                          Exit after startup

--log            The path where log of the app running in the Simulator will be redirected to

--devicetypeid     The id of the device type that should be simulated (Xcode6+). Use ‘showdevicetypes‘ to list devices.

e.g "com.apple.CoreSimulator.SimDeviceType.Resizable-iPhone6, 8.0"

Removed in version 4.x:

--stdout      The path where stdout of the simulator will be redirected to (defaults to stdout of ios-sim)

--stderr      The path where stderr of the simulator will be redirected to (defaults to stderr of ios-sim)

--sdk               The iOS SDK version to run the application on (defaults to the latest)

--family         The device type that should be simulated (defaults to `iphone‘)

--retina                        Start a retina device

--tall                          In combination with --retina flag, start the tall version of the retina device (e.g. iPhone 5 (4-inch))

--64bit                         In combination with --retina flag and the --tall flag, start the 64bit version of the tall retina device (e.g. iPhone 5S (4-inch 64bit))

Unimplemented in this version:

--verbose                       Set the output level to verbose

--timeout              The timeout time to wait for a response from the Simulator. Default value: 30 seconds

--args                     All following arguments will be passed on to the application

--env    A plist file containing environment key-value pairs that should be set

--setenv NAME=VALUE             Set an environment variable

用法不难

ios-sim launch /Users/YDZ/Desktop/app.app --devicetypeid iPhone-6s

其中,/Users/YDZ/Desktop/app.app这个是设计师收到app之后的路径。–devicetypeid参数后面是给定一个模拟器的版本。

只需要把上面的命令发给设计师,无脑粘贴到命令行,装好app的模拟器就会自动启动,打开app了。

三.额外的尝试

好奇的同学肯定不会满足只给模拟器安装debug包吧,既然可以不用代码就可以给模拟器安装app,那我们能安装release包么?我好奇的尝试了一下。

先从Appstore上面下载最新的微信,把ipa后缀改成zip,解压,把Payload文件夹里面的“WeChat”取出来,然后运行ios-sim命令。

结果微信确实是安装到了模拟器了。不过一点击app,看见了月亮界面就退出了。控制台打印了一堆信息。

此处信息过长,可到原文查看

仔细看了一下log,根本原因还是因为

com.apple.CoreSimulator.SimDevice.D6BD3967-9BC4-4A8D-9AD0-23176B22B12A.launchd_sim[19096] (UIKitApplication:com.tencent.xin[0xdf6d][19774]): Program specified by service does not contain one of the requested architectures:

Unable to get pid for ‘UIKitApplication:com.tencent.xin[0xdf6d]‘: No such process (err 3)

因为release包里面architectures打包的时候不包含模拟器的architectures。debug包里面就有。所以release就没法安装到模拟器了。

由于笔者逆向方面的东西没有研究,所以也无法继续下去了。不知道逆向技术能不能把release包破壳之后能不能转成debug包呢?如果能转成debug包,通过ios-sim命令应该也是可以直接安装到模拟器的。

至此,ios-sim给模拟器安装app就尝试到此了。因为只能给模拟器安装debug包,所以在题目上额外给安装加了双引号,并不是所有的app文件都可以安装到模拟器。

请大家多多指教。

时间: 2024-10-17 15:13:27

给iOS 模拟器“安装”app文件的相关文章

iOS 模拟器“安装”app

1.首先在模拟器上运行我们的app程序 2.执行以下命令: ditto -ck --sequesterRsrc --keepParent `ls -1 -d -t ~/Library/Developer/Xcode/DerivedData/*/Build/Products/*-iphonesimulator/*.app | head -n 1` /Users/czc/Desktop/app.zip (1)上面命令最后一个路径(/Users/YDZ/Desktop/app.zip)是文件压缩包输出

ios模拟器安装.app

相对于xcode的run,然后再在安装到模拟器上测试,如果是个人开发的话,那还好. 要是是团队开发,那每次其他的童鞋就都需要update最新的文件下来再编译运行了. 而且,一些测试的童鞋也不会打开xcode这个庞大的IDE来拖垮电脑的运行速度的. 所以,能够只使用ios模拟器来安装.app的话,对工作来说是一件不错的事情. xcode6之后提供了一个工具,xctool.这个工具可以做到这三件事情: 1.启动一个模拟器 xcrun instruments -w 'iPhone 5s' 2.把.ap

【iOS开发-模拟器】Xcode6以后mac中iOS模拟器安装路径以及程序沙箱路径

模拟器安装位置 /Users/TTF/Library/Developer/CoreSimulator/Devices/模拟器标识(一些字符串) 后面那些模拟器标识就是一些字符串代表每一个不同的iOS设备 比如D3E79030-5DB9-4E5B-8E46-5C3B100A4C1C就代表这是iPhone4S,点击进去查看device.plist这个文件就能知道. iOS应用程序资源文件位置 /Users/TTF/Library/Developer/CoreSimulator/Devices/模拟器

ios模拟器安装测试包方法

1. 使用ios-sim ios-sim是一个可以用命令空着ios模拟器的工具.利用这个命令,我们可以启动模拟器.安装app.启动app.查询ios sdk,它可以使我们像自动化测试一样打开xcode,ios-sim只支持xcode6以后的版本. 命令使用如下: # 安装ios-sim的命令 # 先安装node npm install ios-sim -g # 安装.app包到模拟器 ios-sim launch app文件目录 --devicetypeid 模拟器版本 ios-sim laun

IOS 如何安装 ipa文件

在以前,我们是可以将ipa包直接拖到iTunes里进行安装的,但是现在不行了[起码Xcode8.3.3就不行] 那我们怎么办呢? 可以使用PP助手----> 将ipa文件直接拖到红框内就OK了,自动就给你安装了,非常方便. 备注:Windows机器应该也是可以,[--这个我没有试( ̄? ̄)--]

charles_https_通过模拟器安装APP然后抓包

声明,方法参考链接:https://bbs.pediy.com/thread-226435.htm 使用文中的模拟器并不好使,自个使用逍遥模拟器的4.4版本成功抓包, 1>下载逍遥模拟器,在逍遥安卓多开模拟器中安装4.4版本 2>安装xposed,安装后在点击框架,然后更新,更新之后会卡顿,强杀重开即可 3>安装justTrustMe,安装之后再xposed中的模块中要勾选. 原文地址:https://www.cnblogs.com/hsuchan/p/10241992.html

iOS中web app调试(mac).md

目录 一.真机联调配置 二.mac上Safari配置及真机联调 三.iOS模拟器使用 四.在iOS模拟器中安装app 近期公司vue项目开发,目的是一次开发,多平台发布,其中就包含了app,app采用离线web方案,将vue打包后的js bundle文件.静态资源文件打包进app中,为提高性能.优化体验,app也通过jsbridge,暴露原生接口给web调用. 为此,web app开发时可以使用chrome等pc模拟器进行调试,但是涉及app适配,特别是原生接口调试时,就比较麻烦,必须要依赖于真

Appium+python自动化19-iOS模拟器(iOS Simulator)安装自家APP

前言 做过iOS上app测试的小伙伴应该都知道,普通用户安装app都是从appstore下载安装,安装测试版本的app,一般就是开发给的二维码扫码安装, 或者开发给个.ipa的安装包文件,通过itools安装.对于没有iPhone真机的小伙伴,想在iOS模拟器上安装app测试可不是那么容易的事情. 一.启动iOS Simulator 1.Xcode>Open Developer Tool>iOS Simulator,打开后在hardware里面选对应的iPhone版本就能启动模拟器了 2.第二

iOS 如何在模拟器中安装APP

公司使用钉钉应用,钉钉中可以添加本公司的web应用,测试的时候需要在iOS模拟器中测试,下面就是如何在模拟器中安装app. 模拟器上是没有 App Store 的,也不能下载 ipa 文件安装.只能安装基于源代码打包出来的 App Bundle. 例如,钉钉安装包 Dingtalk.app 1.先打开模拟器 一般是通过打开xcode在打开模拟器,但是也可以直接打开模拟器. 虽然模拟器捆绑在 Xcode 中,但是本身是一个单独的应用程序,安装路径在: /Applications/Xcode.app