日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/1/17 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 给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命令更好的地方在于:

?

  • 它在復制過程中不僅能保留源文件或者文件夾的屬性與權限,還能保留源文件的資源分支結構和文件夾的源結構。

  • 此命令能確保文件或者文件夾被如實復制。

  • 如果目標文件或者文件夾不存在,ditto將直接復制過去或創建新的文件和文件夾,相反,對于已經存在的文件,命令將與目標文件(夾)合并。

  • 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

    ?

    有幾點需要說明的:

    ?

  • 上面命令最后一個路徑(/Users/YDZ/Desktop/app.zip),這個是自定義的,我這里舉的例子是直接放在桌面。除了這里改一下路徑,前面的都不需要改,包括 * 也都不用改。

  • 再來說一下命令里面的 * 的問題。當我們打開自己本地的~/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文件都可以安裝到模擬器。

    ?

    請大家多多指教。

    總結

    以上是生活随笔為你收集整理的给iOS 模拟器“安装”app文件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。