程序調(diào)試 (二) —— Xcode Simulator的高級(jí)功能(一)

版本記錄

版本號(hào) 時(shí)間
V1.0 2021.01.04 星期一

前言

程序總會(huì)有bug必怜,如果有好的調(diào)試技巧和方法养涮,那么就是事半功倍,這個(gè)專題專門(mén)和大家分享下和調(diào)試相關(guān)的技巧罐监。希望可以幫助到大家吴藻。感興趣的可以看下面幾篇文章。
1. 程序調(diào)試 (一) —— App Crash的調(diào)試和解決示例(一)

開(kāi)始

首先看下主要內(nèi)容:

在本教程中弓柱,您將學(xué)習(xí)Xcode Simulator的高級(jí)功能沟堡,以改善您的日常開(kāi)發(fā)經(jīng)驗(yàn)。內(nèi)容來(lái)自翻譯矢空。

下面看下寫(xiě)作環(huán)境:

Swift 5, iOS 14, Xcode 12

接著就是正文了航罗。

Xcode Simulator是開(kāi)發(fā)人員使用最廣泛的工具之一。 在模擬器上運(yùn)行和測(cè)試應(yīng)用程序已成為每個(gè)開(kāi)發(fā)人員日常工作的一部分屁药。 熟悉各種模擬器選項(xiàng)對(duì)于任何開(kāi)發(fā)人員都是至關(guān)重要的粥血。 您知道您也可以從命令行創(chuàng)建和配置模擬器嗎? 在本教程中,您將學(xué)習(xí):

  • 什么是模擬器
  • 深入了解有用的模擬器選項(xiàng)
  • 從命令行創(chuàng)建和配置模擬器
  • 使用命令行流式傳輸和捕獲日志
  • 創(chuàng)建Bash腳本以在不同區(qū)域設(shè)置的模擬器上自動(dòng)啟動(dòng)應(yīng)用程序复亏。

打開(kāi)RayWonders項(xiàng)目趾娃。 構(gòu)建并運(yùn)行。

這個(gè)程序有兩個(gè)tabPhoto and Map缔御。 Photo tab顯示了世界奇觀的照片抬闷。 點(diǎn)擊照片可顯示其詳細(xì)說(shuō)明。 Map tab將世界奇觀的照片顯示為地圖上的注釋刹淌。 這是raywenderlich.com教程之一饶氏,您無(wú)需修改項(xiàng)目。 相反有勾,您將使用此應(yīng)用程序作為基礎(chǔ)來(lái)學(xué)習(xí)各種模擬器選項(xiàng)疹启。 在開(kāi)始世界巡回演唱之前,您需要了解什么是模擬器蔼卡。


What Is a Simulator?

該模擬器是在Mac上模擬iOS喊崖,iPadOS,tvOS和watchOS的絕佳工具雇逞。 它通過(guò)模擬不同的設(shè)備來(lái)幫助快速進(jìn)行原型設(shè)計(jì)和測(cè)試荤懂。 從技術(shù)上講,模擬器是在macOS內(nèi)核上運(yùn)行的獨(dú)立用戶空間塘砸。

User space是分配給運(yùn)行應(yīng)用程序的系統(tǒng)內(nèi)存节仿,而內(nèi)核空間是分配給運(yùn)行OS內(nèi)核和設(shè)備驅(qū)動(dòng)程序的系統(tǒng)內(nèi)存。啟動(dòng)新的模擬器會(huì)創(chuàng)建一個(gè)單獨(dú)的用戶空間掉蔬。

內(nèi)核(kernel)是操作系統(tǒng)的核心組件廊宪。它促進(jìn)了硬件和軟件組件之間的交互。它負(fù)責(zé)管理硬件女轿,分配內(nèi)存并在進(jìn)程之間進(jìn)行仲裁箭启。

這些進(jìn)程之一 —— ** Daemon** —— 在后臺(tái)運(yùn)行。launchd蛉迹,cfprefsd傅寡,distnoted是一些系統(tǒng)daemons程序。

在設(shè)備和模擬器上運(yùn)行的應(yīng)用程序是否相同北救?接下來(lái)荐操,您將學(xué)到。


Running App on a Device vs. a Simulator

在模擬器上測(cè)試應(yīng)用程序非常方便珍策。但是托启,在設(shè)備和模擬器上運(yùn)行的應(yīng)用程序之間存在一些關(guān)鍵差異。

1. Computing Performance

模擬器與Mac共享相同的計(jì)算資源膛壹。這包括內(nèi)存驾中,CPU和網(wǎng)絡(luò)連接唉堪。相反,與Mac相比肩民,物理設(shè)備具有更少的內(nèi)存和計(jì)算能力唠亚。同樣,網(wǎng)絡(luò)可能是物理設(shè)備上不可預(yù)測(cè)的野獸持痰。

2. Display

Mac和物理設(shè)備上的分辨率和色域可能會(huì)不同灶搜,從而導(dǎo)致圖像和文本出現(xiàn)鋸齒。 在本教程的后面工窍,您將學(xué)習(xí)如何模擬確切的物理設(shè)備大小割卖。

3. Hardware Limitations

模擬器不支持某些硬件組件。 這些包括:

  • 藍(lán)牙
  • 相機(jī)
  • 運(yùn)動(dòng)傳感器患雏,例如加速度計(jì)和陀螺儀
  • 接近傳感器

4. Framework Limitations

模擬器不支持某些框架鹏溯。 這些包括:

  • ARKit
  • HomeKit
  • IOSurface
  • MessageUI

有關(guān)所有差異的更詳盡列表,請(qǐng)通過(guò)在“模擬器”菜單中選擇Help ? Simulator Help來(lái)參考文檔淹仑。

接下來(lái)丙挽,您將學(xué)習(xí)如何組織模擬器。


Organizing Simulators Using Xcode

Xcode附帶了一組默認(rèn)的模擬器匀借。 要查看這些模擬器的列表颜阐,請(qǐng)按照下列步驟操作:

  • 1) 打開(kāi)Xcode
  • 2) 選擇Window菜單選項(xiàng)吓肋。
  • 3) 選擇Devices and Simulators菜單凳怨。
  • 4) 選擇Simulators選項(xiàng)卡。

您會(huì)看到Xcode隨附的模擬器列表是鬼。 如果您過(guò)去曾經(jīng)下載過(guò)其他運(yùn)行時(shí)肤舞,那么也會(huì)看到這些相關(guān)的模擬器。

現(xiàn)在屑咳,您將使用自定義名稱創(chuàng)建一個(gè)新的模擬器萨赁。

按著這些次序:

  • 1) 按下左下方的+按鈕弊琴。
  • 2) 將模擬器名稱設(shè)置為Demo兆龙。
  • 3) 選擇iPhone 12 Pro作為設(shè)備類型。
  • 4) 選擇iOS 14.2作為操作系統(tǒng)版本敲董。
  • 5) 按Create紫皇。

這將創(chuàng)建一個(gè)名為Demo的新模擬器,您現(xiàn)在可以在模擬器列表中找到它腋寨。

取消選中Demo simulatorShow as runtime destination復(fù)選框聪铺。

這隱藏了模擬器。 它不會(huì)顯示在該app scheme旁邊的模擬器列表中萄窜。

按住Control鍵并單擊Demo模擬器铃剔。 出現(xiàn)幾個(gè)選項(xiàng)撒桨,例如DeleteRename

繼續(xù)并通過(guò)單擊Delete來(lái)刪除Demo simulator键兜。 不用擔(dān)心 您很快就會(huì)使用其他方法創(chuàng)建它凤类。

1. Running Older Runtimes

有時(shí),您必須在舊版運(yùn)行時(shí)上運(yùn)行您的應(yīng)用普气。

創(chuàng)建新的模擬器時(shí)谜疤,可以通過(guò)在OS版本下拉菜單中選擇Download more runtimes來(lái)下載較早的運(yùn)行時(shí)。

您也可以從Components窗口下載更多運(yùn)行時(shí)现诀。 選擇Xcode ? Preferences ? Components選項(xiàng)夷磕。

該窗口顯示下載的模擬器運(yùn)行時(shí)以及其他可供下載的運(yùn)行時(shí)的列表。

接下來(lái)仔沿,您將學(xué)習(xí)創(chuàng)建模擬器的另一種方法坐桩。

2. Creating Simulators From the Simulator Menu

構(gòu)建并運(yùn)行。

當(dāng)模擬器正在運(yùn)行時(shí)封锉,請(qǐng)按照下列步驟操作:

  • 1) 從模擬器菜單中選擇File ? New Simulator撕攒。
  • 2) 輸入Demo作為模擬器名稱。
  • 3) 選擇iPhone 12 Pro作為Device Type烘浦。
  • 4) 選擇iOS 14.2作為版本抖坪。
  • 5) 單擊Create

請(qǐng)按照以下步驟打開(kāi)模擬器:

  • 1) 從菜單中選擇File ? Open Simulator闷叉。
  • 2) 選擇iOS 14.2運(yùn)行時(shí)擦俐。
  • 3) 選擇Demo模擬器。

這將啟動(dòng)Demo模擬器握侧。

那又快又簡(jiǎn)單蚯瞧! 接下來(lái),您將了解模擬器中的各種尺寸選項(xiàng)品擎。


Comparing Simulator Size Options

您可以通過(guò)在四個(gè)角之一中單擊并拖動(dòng)來(lái)調(diào)整模擬器的大小埋合。 Window menu選項(xiàng)提供四個(gè)縮放選項(xiàng)。

1. Physical Size

物理大小會(huì)調(diào)整模擬器的大小萄传,以匹配實(shí)際的設(shè)備大小甚颂。 這可以直觀地顯示您的應(yīng)用在不同屏幕尺寸下的外觀。

2. Point Accurate

點(diǎn)精確模式可調(diào)整窗口大小秀菱,以便在具有不同比例因子的設(shè)備上內(nèi)容具有相同大小振诬。 結(jié)果,顯示為3x的設(shè)備上的圖像與2x顯示器的尺寸相同衍菱。

3. Pixel Accurate

在此模式下赶么,窗口大小更改為與物理設(shè)備相同的像素?cái)?shù)。 模擬設(shè)備上的每個(gè)像素都映射到Mac顯示器上的一個(gè)像素脊串。 如果Mac顯示器的像素密度低于模擬設(shè)備的像素密度辫呻,這會(huì)使模擬器在屏幕上顯得更大清钥。 您可以使用此模式檢查應(yīng)用程序中圖像和控件的對(duì)齊方式。

4. Fit Screen

這會(huì)將模擬器的大小調(diào)整為Mac顯示器的大小放闺。

接下來(lái)循捺,您將學(xué)習(xí)模擬器中提供的各種選項(xiàng)。


Slow Animations

動(dòng)畫(huà)是應(yīng)用程序體驗(yàn)不可或缺的一部分雄人。 在Demo模擬器中構(gòu)建并運(yùn)行RayWonders从橘。

點(diǎn)擊Photos選項(xiàng)卡。 接下來(lái)础钠,點(diǎn)擊一張世界奇觀的照片恰力,以呈現(xiàn)有關(guān)該地方的詳細(xì)信息。 向下滑動(dòng)以消除視圖旗吁。

要模擬慢速動(dòng)畫(huà)踩萎,請(qǐng)?jiān)?code>Simulator菜單中選擇Debug ? Slow Animations選項(xiàng)。

再次點(diǎn)擊圖片很钓。 現(xiàn)在香府,視圖動(dòng)畫(huà)緩慢。

緩慢查看動(dòng)畫(huà)有助于提高清晰度码倦。 另外企孩,它可以幫助檢查渲染和性能方面的問(wèn)題。

接下來(lái)袁稽,您將學(xué)習(xí)模擬Dark Mode勿璃。 在繼續(xù)之前,通過(guò)取消選擇Debug ? Slow Animations菜單選項(xiàng)來(lái)禁用慢動(dòng)畫(huà)推汽。

1. Dark Mode

Dark Mode可在弱光環(huán)境下提供出色的觀看體驗(yàn)补疑。 模擬器提供了在黑暗模式下查看您的應(yīng)用程序的選項(xiàng)。

選擇Features ? Toggle Appearance歹撒。 這會(huì)將外觀切換為Dark Mode莲组。 現(xiàn)在,點(diǎn)擊RayWonders中的Map選項(xiàng)卡暖夭。

您會(huì)注意到地圖已更改為深色外觀锹杈。 很簡(jiǎn)單,不是嗎鳞尔? 這是在黑暗模式下測(cè)試應(yīng)用程序的便捷方法嬉橙。

要將外觀改回默認(rèn)設(shè)置早直,請(qǐng)取消選擇Features ? Toggle appearance寥假。 要了解如何支持暗模式,請(qǐng)查看Supporting Dark Mode: Adapting You App to Support Dark Mode tutorial霞扬。

接下來(lái)糕韧,您將學(xué)習(xí)如何模擬推送通知枫振!


Simulating Push Notifications

推送通知是一種讓用戶知道應(yīng)用程序中新內(nèi)容更新的好方法。 過(guò)去萤彩,測(cè)試推送通知是一個(gè)挑戰(zhàn)粪滤。 您需要物理設(shè)備來(lái)測(cè)試推送通知。 從Xcode 11.4開(kāi)始雀扶,您可以在模擬器上模擬推送通知杖小。

使用以下命令創(chuàng)建一個(gè)名為RayWondersPushNotification.apns的文件:

{
  "Simulator Target Bundle": "com.raywenderlich.RayWonders",
  "aps": {
    "alert": {
      "title": "Hindi language support added!",
      "body": "Checkout RayWonders in Hindi!"
    }
  }
}

這是帶有titlebody的簡(jiǎn)單可見(jiàn)的推送通知有效內(nèi)容。 Simulator Target Bundle是一個(gè)特殊的鍵愚墓。 它指定應(yīng)接收通知的應(yīng)用程序的bundle ID予权。

在嘗試有payload之前,您需要首先在應(yīng)用程序中授予通知權(quán)限浪册。

按著這些次序:

  • 1) 在Demo模擬器中打開(kāi)RayWonders扫腺。
  • 2) 在Photos選項(xiàng)卡中,點(diǎn)擊右上角的響鈴圖標(biāo)村象。
  • 3) 在通知權(quán)限提示中選擇Allow笆环。
  • 4) 從Simulator menu中選擇Device ? Home,將應(yīng)用程序置于后臺(tái)厚者。

接下來(lái)躁劣,將RayWondersPushNotification.apns文件拖放到Demo模擬器上。

出現(xiàn)一個(gè)可見(jiàn)的推送通知库菲。 那很簡(jiǎn)單习绢! 請(qǐng)記住,模擬器只能模擬推送通知蝙昙。 要測(cè)試從Apple推送通知服務(wù)器收到的實(shí)際推送通知闪萄,需要使用物理設(shè)備。

要更深入地了解推送通知奇颠,請(qǐng)閱讀 Push Notifications Tutorial: Getting Started知市。

接下來(lái),您將學(xué)習(xí)如何縮放置鼻。


Zooming In and Out

在模擬器中打開(kāi)RayWonders陋桂。 切換到Map標(biāo)簽。 地圖以世界奇觀為中心并放大荆几。 世界其他奇跡在哪里吓妆?

您需要縮小以查看全景。 在按住Option鍵的同時(shí)單擊并拖動(dòng)吨铸。

單擊和拖動(dòng)很棒行拢,但是很快就會(huì)變得很累。 接下來(lái)诞吱,您將學(xué)到一種更快的去往某個(gè)地點(diǎn)的方法舟奠。


Simulating a Location

模擬器提供了一種簡(jiǎn)單的方法來(lái)模擬位置竭缝。 首先,您需要在RayWonders中授予位置權(quán)限沼瘫。

按著這些次序:

  • 1) 在模擬器中打開(kāi)RayWonders并切換到Map選項(xiàng)卡抬纸。
  • 2) 點(diǎn)擊Map選項(xiàng)卡中的Start Location Services按鈕。
  • 3) 選擇Allow While Using App權(quán)限耿戚。

現(xiàn)在湿故,要模擬位置:

  • 1) 從模擬器菜單中選擇Features ? Location ? Custom Location
  • 2) 輸入41.8902142作為緯度膜蛔,輸入12.4900422作為經(jīng)度晓锻。
  • 3) 單擊OK

這會(huì)將您直接帶到地圖上的羅馬競(jìng)技場(chǎng)-您有史以來(lái)最快的旅程飞几!

但是砚哆,輸入要模擬的每個(gè)位置的坐標(biāo)都需要占用大量?jī)?nèi)存,即您的內(nèi)存即任務(wù)屑墨。 接下來(lái)躁锁,您將學(xué)到解決此問(wèn)題的簡(jiǎn)便方法。

1. Sharing Locations From the Maps App

macOS上的Maps應(yīng)用程序提供了一種與模擬器共享位置的簡(jiǎn)便方法卵史。

按著這些次序:

  • 1) 打開(kāi)Maps應(yīng)用战转。
  • 2) 在搜索文本中輸入Machu Picchu
  • 3) 單擊搜索字段旁邊的Share按鈕以躯。
  • 4) 從下拉菜單中選擇Simulator槐秧。
  • 5) 在位置提示中,選擇Demo作為模擬器忧设。
  • 6) 單擊Send刁标。

您現(xiàn)在位于模擬器的地圖視圖中的Machu Picchu

恭喜你址晕! 您剛剛創(chuàng)造了從羅馬斗獸場(chǎng)到Machu Picchu旅行最快的世界紀(jì)錄膀懈!

要了解有關(guān)更深入地處理應(yīng)用中位置的信息,請(qǐng)查看 MapKit and Core Location谨垃。

現(xiàn)在启搂,該改變一下了。


Simulating Shake Gesture

搖動(dòng)手勢(shì)(Shake gestures)是提示用戶在應(yīng)用程序中提供反饋的絕佳線索刘陶。 但是胳赌,如何搖動(dòng)模擬器? 幸運(yùn)的是匙隔,嚴(yán)格搖動(dòng)Mac不是解決方案疑苫。 模擬器提供了一種簡(jiǎn)單的方法。

Demo模擬器上打開(kāi)RayWonders。 從Simulator菜單中選擇Device ? Shake缀匕。

這模擬了搖動(dòng)手勢(shì)纳决。

RayWonders會(huì)檢測(cè)到晃動(dòng)并向用戶提示alert碰逸。 您可以通過(guò)實(shí)現(xiàn)motionEnded(_:with :)方法來(lái)檢測(cè)和處理應(yīng)用中的搖動(dòng)手勢(shì)乡小。 要了解更多信息,請(qǐng)查閱Apple documentation饵史。

接下來(lái)满钟,您將學(xué)習(xí)如何模擬內(nèi)存警告。


Simulating a Memory Warning

當(dāng)iOS的內(nèi)存使用量接近設(shè)備的上限時(shí)胳喷,iOS會(huì)向該應(yīng)用發(fā)送警告湃番。 應(yīng)用程序需要通過(guò)清除緩存數(shù)據(jù)做出響應(yīng),該數(shù)據(jù)可以在以后重新創(chuàng)建吭露。

在演示模擬器上打開(kāi)RayWonders吠撮。 從菜單中選擇Debug ? Simulate Memory Warning

這模擬了內(nèi)存警告讲竿。

RayWonders顯示alert泥兰。 您可以在Responding to Memory Warnings Apple文檔中了解有關(guān)處理內(nèi)存警告的更多信息。

到目前為止题禀,您已經(jīng)看到了一些有用的模擬器選項(xiàng)鞋诗。 本教程未涵蓋其他幾項(xiàng)。 您應(yīng)該根據(jù)自己的應(yīng)用需求將其簽出迈嘹。 其中一些選項(xiàng)包括:

  • 使用Features ? Trigger iCloud Sync來(lái)模擬iCloud同步削彬。
  • 使用Features ? Authorize Apple Pay來(lái)模擬Apple Pay授權(quán)。
  • 使用Device ? Siri觸發(fā)Siri秀仲。
  • 使用Debug ? Open System Log檢查系統(tǒng)日志融痛。

接下來(lái),您將學(xué)習(xí)使用命令行與模擬器進(jìn)行交互神僵。


Organizing Simulators Using the Command Line

到目前為止酌心,您已經(jīng)使用Xcode創(chuàng)建和管理了模擬器。 此外挑豌,您還了解了各種Simulator菜單選項(xiàng)安券。 現(xiàn)在,您將學(xué)習(xí)從命令行管理和使用模擬器氓英。

打開(kāi)終端侯勉。 輸入以下命令:

xcrun simctl --help

然后按Enter

help選項(xiàng)提供了使用simctl可用的所有子命令的列表铝阐。

Simctl是幫助管理模擬器并以編程方式與模擬器交互的工具址貌。 您可以使用xcrun命令行工具訪問(wèn)simctl

現(xiàn)在,您將探索其中的幾個(gè)子命令练对。 運(yùn)行以下命令:

xcrun simctl list

list命令顯示所有可用設(shè)備和運(yùn)行時(shí)的列表遍蟋。

它還顯示了設(shè)備的當(dāng)前狀態(tài),無(wú)論是Booted還是Shutdown螟凭。

接下來(lái)虚青,您將學(xué)習(xí)從命令行創(chuàng)建和啟動(dòng)模擬器。

1. Creating Simulator From the Command Line

在創(chuàng)建新模擬器之前螺男,請(qǐng)刪除通過(guò)Xcode創(chuàng)建的Demo模擬器棒厘。 輸入以下內(nèi)容:

xcrun simctl delete Demo

delete命令標(biāo)識(shí)一個(gè)模擬器并將其刪除。 現(xiàn)在下隧,從命令行創(chuàng)建一個(gè)新的模擬器奢人。

輸入以下內(nèi)容:

xcrun simctl create Demo "iPhone 12 Pro" "iOS14.2"

create命令接受設(shè)備類型和運(yùn)行時(shí),并創(chuàng)建模擬器淆院。 這將創(chuàng)建具有iOS 14.2運(yùn)行時(shí)的iPhone 12 Pro模擬器何乎。

現(xiàn)在,終端顯示新設(shè)備的唯一標(biāo)識(shí)符土辩。

輸入以下內(nèi)容:

xcrun simctl boot Demo

啟動(dòng)演示模擬器支救。 默認(rèn)情況下,它處于關(guān)機(jī)(Shutdown)狀態(tài)脯燃。

現(xiàn)在搂妻,使用命令行安裝RayWonders。 您首先需要該app bundle辕棚。 按著這些次序:

  • 1) 打開(kāi)“項(xiàng)目”導(dǎo)航器欲主,然后選擇Products文件夾中的RayWonders.app
  • 2) 右鍵單擊并選擇在Finder中顯示。
  • 3) 將RayWonders復(fù)制到您的主目錄逝嚎。

打開(kāi)終端并通過(guò)輸入以下內(nèi)容導(dǎo)航到主目錄:

cd ~

接下來(lái)扁瓢,運(yùn)行以下命令:

xcrun simctl install Demo RayWonders.app

install命令將RayWonders安裝在模擬器上。 很好补君!

您甚至可以使用simctl啟動(dòng)該應(yīng)用程序引几。 輸入以下內(nèi)容:

xcrun simctl launch Demo com.raywenderlich.RayWonders

啟動(dòng)(launch)命令將app bundle ID作為參數(shù)。 RayWondersDemo模擬器中啟動(dòng)挽铁。

恭喜你伟桅! 現(xiàn)在,您已經(jīng)從命令行創(chuàng)建叽掘,啟動(dòng)楣铁,安裝并啟動(dòng)了模擬器。 您可以嘗試以下其他選項(xiàng):

  • terminate:這將使用bundle identifier終止應(yīng)用程序更扁。
  • erase:這將擦除設(shè)備內(nèi)容盖腕。
  • uninstall:這將卸載應(yīng)用程序赫冬。 您需要指定應(yīng)用程序的bundle identifier

接下來(lái)溃列,您將學(xué)習(xí)一些適用于您的應(yīng)用的出色命令劲厌。

2. Taking Screenshots

您的應(yīng)用的屏幕截圖在幾種情況下很有用。 例如听隐,在AppStore中提交應(yīng)用程序時(shí)需要截圖补鼻。

輸入以下命令:

xcrun simctl io Demo screenshot screenshot.png --type="png"

這將獲取當(dāng)前屏幕的屏幕截圖,并將其保存到文件screenshot.png中遵绰。 除了png外辽幌,screenshot命令還支持其他文件格式增淹,例如TIFF椿访,BMP,GIF和JPEG虑润。

屏幕快照可以顯示您的應(yīng)用程序的外觀成玫,而一張圖片值一千字。 但是拳喻,視頻的價(jià)值更高哭当。

3. Recording Video

您可以使用simctl錄制應(yīng)用程序的視頻。 要開(kāi)始記錄冗澈,請(qǐng)輸入以下命令:

xcrun simctl io Demo recordVideo Demo.mov --codec="h264"

在模擬器上與RayWonders進(jìn)行交互钦勘。 完成后,在終端中按Control-C亚亲。 這會(huì)將視頻保存在Demo.mov中彻采。

另外,您可以在錄制時(shí)指定所需的編解碼器捌归。 默認(rèn)編解碼器為hevc肛响。

recordVideo命令有助于避免使用QuickTime播放器錄制應(yīng)用程序的視頻。

4. Customizing the Status Bar

在模擬器中檢查應(yīng)用程序的狀態(tài)欄惜索。 您會(huì)看到電池已充滿特笋,設(shè)備具有最佳信號(hào),并且模擬器上的時(shí)間是本地Mac時(shí)間巾兆。 如果要覆蓋這些內(nèi)容怎么辦猎物?

在終端中輸入以下命令:

xcrun simctl status_bar Demo override \
  --dataNetwork 4g --cellularBars 2 --batteryState charging \
  --batteryLevel 25 --time 12:05

這會(huì)覆蓋要設(shè)置的狀態(tài)欄:

  • 數(shù)據(jù)網(wǎng)絡(luò)為4G
  • 蜂窩信號(hào)到兩個(gè)條形圖
  • 電池狀態(tài)為充電狀態(tài),電池電量為25%
  • 在模擬器上的時(shí)間為12:05

在自己的項(xiàng)目中執(zhí)行此操作時(shí)角塑,可以將狀態(tài)欄信息設(shè)置為所需的任何內(nèi)容蔫磨。

當(dāng)您要自定義應(yīng)用屏幕截圖和視頻的外觀時(shí),status_bar命令可能非常方便吉拳。

完成后质帅,通過(guò)輸入以下命令將狀態(tài)欄恢復(fù)為默認(rèn)外觀:

xcrun simctl status_bar Demo clear

Debugging and Diagnosing

Simctl還提供了一些命令來(lái)幫助調(diào)試和診斷問(wèn)題。

返回終端,然后輸入以下內(nèi)容:

xcrun simctl get_app_container Demo com.raywenderlich.RayWonders

get_app_container打印app bundle的路徑煤惩。

您可以使用此路徑檢查應(yīng)用容器中的數(shù)據(jù)嫉嘀。 此外,在調(diào)試問(wèn)題時(shí)魄揉,模擬器日志確實(shí)非常有用剪侮。

現(xiàn)在,在終端中鍵入以下內(nèi)容:

xcrun simctl spawn Demo log stream

這將開(kāi)始從Demo模擬器流式傳輸所有日志洛退。

但是瓣俯,這可能是要檢查的數(shù)據(jù)過(guò)多。 按Control-C停止流兵怯。

請(qǐng)嘗試以下操作:

xcrun simctl spawn Demo log stream | grep com.raywenderlich.RayWonders

這將過(guò)濾日志并僅顯示來(lái)自RayWonders的日志彩匕。

與應(yīng)用互動(dòng)時(shí),您會(huì)在終端中看到更多日志媒区。 在提交bug或向Apple提供反饋時(shí)驼仪,這些日志非常有用。

輸入以下內(nèi)容:

xcrun simctl diagnose

diagnose命令收集一堆數(shù)據(jù)袜漩,包括日志和崩潰绪爸。 它還會(huì)生成可幫助Apple調(diào)試問(wèn)題的文件。 默認(rèn)情況下宙攻,收集的日志用于引導(dǎo)的設(shè)備奠货。 通過(guò)指定設(shè)備的UDID,您可以將日志收集限制到該特定設(shè)備座掘。

您現(xiàn)在已成為模擬器命令行專家递惋! 您可以通過(guò)使用Bash腳本自動(dòng)執(zhí)行常見(jiàn)操作來(lái)更進(jìn)一步。


Automating Using a Bash Script

現(xiàn)在雹顺,您將創(chuàng)建一個(gè)腳本來(lái)克隆模擬器并在其他區(qū)域啟動(dòng)RayWonders丹墨。

首先,打開(kāi)終端嬉愧,然后輸入以下內(nèi)容:

touch sim_utility.sh

這將創(chuàng)建一個(gè)名為sim_utility的新文件贩挣。 .sh擴(kuò)展名表示它是一個(gè)shell腳本。

注意:您可以在文件系統(tǒng)中的任何位置創(chuàng)建腳本没酣。 為了便于示例項(xiàng)目的組織王财,該腳本位于“Scripts”文件夾下。

接下來(lái)裕便,運(yùn)行:

chmod +x sim_utility.sh

這使sim_utility.sh可執(zhí)行绒净,因此您可以運(yùn)行它。

在編輯器中打開(kāi)sim_utility.sh偿衰,并添加以下內(nèi)容:

#!/bin/bash

#1
COMMAND="$1"
SIMULATOR_NAME="$2"

#2
get_id_of_simulator() {
  #TODO
}

get_status_of_simulator() {
  #TODO
}

launch() {
  #TODO
}

#3
case $COMMAND in
"launch") launch "$3" "$4" "$5" ;;
*)
  launch_help
  exit 1
  ;;
esac

這是怎么回事:

  • 1) 該腳本采用命令名稱和模擬器名稱作為命令行參數(shù)挂疆。
  • 2) get_id_of_simulator改览,get_status_of_simulatorlaunch是接下來(lái)要實(shí)現(xiàn)的空存根。
  • 3) 該腳本當(dāng)前支持一個(gè)名為launch的命令缤言。 此launch使用三個(gè)附加參數(shù)宝当,您將很快實(shí)現(xiàn)這些參數(shù)。

get_id_of_simulator中胆萧,將#TODO替換為以下內(nèi)容:

xcrun simctl list | grep "$SIMULATOR_NAME" | \
awk 'match($0, /\(([-0-9A-F]+)\)/) {print substr( $0, RSTART + 1, RLENGTH-2 )}'

get_id_of_simulator搜索模擬器列表以匹配指定為參數(shù)的名稱庆揩。 如果找到匹配項(xiàng),則子字符串操作將獲得模擬器的唯一標(biāo)識(shí)符跌穗。

get_status_of_simulator方法中订晌,將#TODO替換為以下內(nèi)容:

xcrun simctl list | grep "$SIMULATOR_NAME" | \
awk 'match($0, /\(([a-zA-Z]+)\)/) {print substr( $0, RSTART + 1, RLENGTH - 2 )}'

get_status_of_simulator在設(shè)備列表中搜索名稱匹配的模擬器。 如果找到匹配項(xiàng)蚌吸,它將獲得模擬器的狀態(tài) —— bootedshutdown锈拨。 您將在launch中使用它們。

1. Implementing Launch

launch時(shí)套利,將#TODO替換為以下內(nèi)容:

#1
BUNDLE_ID="$1"
LOCALE="$2"
LANGUAGE="$3"
CLONE_NAME="$LOCALE"

#2
SIMULATOR_ID=$(get_id_of_simulator)
if [ -z "$SIMULATOR_ID" ]; then
  echo "No device matching the name: $SIMULATOR_NAME"
  return
fi

echo "Simulator id: $SIMULATOR_ID"
echo "Bundle id: $BUNDLE_ID"
echo "Locale: $LOCALE"

#3
SIMULATOR_STATUS=$(get_status_of_simulator)
echo "Simulator Status: $SIMULATOR_STATUS"
if [ "$SIMULATOR_STATUS" = "Booted" ]; then
  echo "Making sure the device is shutdown first..."
  xcrun simctl shutdown "$SIMULATOR_NAME"
fi

#4
echo "Cloning the device with name $LOCALE..."
xcrun simctl clone "$SIMULATOR_NAME" "$CLONE_NAME"

#5
echo "Booting device..."
xcrun simctl boot "$SIMULATOR_NAME"
xcrun simctl boot "$CLONE_NAME"

#6
echo "Launching app..."
xcrun simctl launch "$SIMULATOR_NAME" "$BUNDLE_ID"

#7
xcrun simctl launch "$CLONE_NAME" "$BUNDLE_ID" -AppleLocale "$LOCALE" \
  -AppleLanguages "($LANGUAGE)"

保存文件推励。這是逐步執(zhí)行的操作鹤耍。它:

  • 1) 提供其他launch參數(shù)肉迫,包括應(yīng)用程序的bundle ID,語(yǔ)言環(huán)境和啟動(dòng)應(yīng)用程序所使用的語(yǔ)言稿黄。它聲明一個(gè)本地變量CLONE_NAME喊衫,它是克隆設(shè)備的名稱。在這種情況下杆怕,克隆設(shè)備的名稱就是您指定的語(yǔ)言環(huán)境族购;
  • 2) 通過(guò)調(diào)用get_id_of_simulator來(lái)獲取模擬器的ID。然后陵珍,將結(jié)果存儲(chǔ)在SIMULATOR_ID中寝杖。如果沒(méi)有匹配的模擬器,則退出程序互纯。
  • 3) 通過(guò)調(diào)用get_status_of_simulator獲取模擬器的狀態(tài)瑟幕。如果狀態(tài)為Booted,則它將運(yùn)行shutdown命令將其關(guān)閉留潦。要克隆只盹,必須關(guān)閉設(shè)備。
  • 4) 使用clone命令克隆模擬器兔院;
  • 5) 使用boot命令引導(dǎo)原始模擬器和克隆的模擬器殖卑;
  • 6) 使用launch命令在原始模擬器上啟動(dòng)應(yīng)用程序;
  • 7) 使用克隆的模擬器上的launch命令啟動(dòng)應(yīng)用程序坊萝。它指定啟動(dòng)應(yīng)用程序的語(yǔ)言環(huán)境和語(yǔ)言孵稽。

2. Launching RayWonders in a Different Locale

打開(kāi)終端许起,然后運(yùn)行以下命令:

./sim_utility.sh launch Demo com.raywenderlich.RayWonders hi_IN hi

RayWonders在印地語(yǔ)上使用克隆的模擬器hi_IN啟動(dòng)。

無(wú)需再進(jìn)行設(shè)置并切換設(shè)備語(yǔ)言來(lái)測(cè)試您的應(yīng)用菩鲜。 現(xiàn)在街氢,您可以同時(shí)以多種語(yǔ)言查看您的應(yīng)用。 很好睦袖!

注意:如果在運(yùn)行腳本時(shí)遇到問(wèn)題珊肃,請(qǐng)確保只有一個(gè)名為Demo的模擬器。 您可以通過(guò)運(yùn)行xcrun simctl list | grep Demo檢查可用的模擬器數(shù)量馅笙。刪除所有重復(fù)的模擬器伦乔,然后重試。

RayWonders還支持其他幾種語(yǔ)言董习。 運(yùn)行以下命令:

./sim_utility.sh launch Demo com.raywenderlich.RayWonders ja_Jp ja

RayWonders現(xiàn)在在新的模擬器上以日語(yǔ)啟動(dòng)烈和。

作為一個(gè)有趣的挑戰(zhàn),在sim_utility腳本中實(shí)現(xiàn)另外兩個(gè)命令皿淋。

  • Cleanup:這將刪除給定模擬器名稱的模擬器招刹。
  • Help:這將打印腳本支持的所有命令的菜單。

您可以在下載資料的Scripts文件夾中找到該腳本的最終版本以及所有這些選項(xiàng)窝趣。

在本教程中疯暑,您學(xué)習(xí)了很多有用的模擬器和命令行選項(xiàng)。 要了解更多信息哑舒,請(qǐng)觀看以下WWDC視頻:

后記

本篇主要講述了Xcode Simulator的高級(jí)功能妇拯,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市洗鸵,隨后出現(xiàn)的幾起案子越锈,更是在濱河造成了極大的恐慌,老刑警劉巖膘滨,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甘凭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡火邓,警方通過(guò)查閱死者的電腦和手機(jī)丹弱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贡翘,“玉大人蹈矮,你說(shuō)我怎么就攤上這事∶” “怎么了泛鸟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)踊东。 經(jīng)常有香客問(wèn)我北滥,道長(zhǎng)刚操,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任再芋,我火速辦了婚禮菊霜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘济赎。我一直安慰自己鉴逞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布司训。 她就那樣靜靜地躺著构捡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壳猜。 梳的紋絲不亂的頭發(fā)上勾徽,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音统扳,去河邊找鬼喘帚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咒钟,可吹牛的內(nèi)容都是我干的吹由。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盯腌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼溉知!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起腕够,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舌劳,沒(méi)想到半個(gè)月后帚湘,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡甚淡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年大诸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贯卦。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡资柔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撵割,到底是詐尸還是另有隱情贿堰,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布啡彬,位于F島的核電站羹与,受9級(jí)特大地震影響故硅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纵搁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一吃衅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腾誉,春花似錦徘层、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至眼耀,卻和暖如春英支,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哮伟。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工干花, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人楞黄。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓池凄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親鬼廓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肿仑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容