Xcode


快捷鍵


cmd + 1              切換成 Project Navigator (cmd + 2~7 也可以做相應切換,不過不常用)

cmd + ctrl + 上     在 .h 和 .m 文件之間切換

cmd + enter          切換成 standard editor

cmd + opt + enter    切換成 assistant editor

cmd + shift + y      切換 Console View 的顯示或隱藏

cmd + 0              隱藏左邊的導航 (Navigator) 區(qū)

cmd + opt + 0        隱藏右邊的工具 (Utility) 區(qū)

ctrl  + 6            列出當前文件中所有的方法,可以輸入關鍵詞來過濾。這個相當贊,可以快速定位到想編輯的方法。

                     我直接把這個快鍵盤改成了 ctrl+o,這樣按起來更順手。

cmd + ctrl + 左 / 右   到上 / 下一次編輯的位置,在 2 個編輯位置跳轉的時候很方便。

cmd + opt + j        跳轉到文件過濾區(qū)

cmd + shift + f      在工程中查找

cmd + r              運行,如果選上直接 kill 掉上次進程的話,每次直接一按就可以重新運行了

cmd + b              編譯工程

cmd + shift + k      清空編譯好的文件

cmd + .              結束本次調試

ESC                  調出代碼補全

cmd + 單擊           查看該方法的實現(xiàn)

opt + 單擊           查看該方法的文檔

cmd + t              新建一個 tab 欄

cmd + shift + [      在 tab 欄之間切換


Debug


Config


插件

  • DyCI :DyCI是一個動態(tài)注入工具,用于向iOS應用中注入代碼而不用重新啟動應用。

  • Quick:測試驅動開發(fā)(Test Driven Development,簡稱為TDD)


Alcatraz管理Xcode插件

Alcatraz 是一個幫你管理 Xcode 插件、模版以及顏色配置的工具。它可以直接集成到 Xcode 的圖形界面中,讓你感覺就像在使用 Xcode 自帶的功能一樣。

安裝

mkdir -p ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins;

curl -L http://git.io/lOQWeA | tar xvz -C ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins

刪除

rm -rf ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/Alcatraz.xcplugin

rm -rf ~/Library/Application\ Support/Alcatraz

使用

安裝成功后重啟 Xcode,就可以在 Xcode 的頂部菜單中找到 Alcatraz,如下所示:

點擊 “Package Manager”,即可啟動插件列表頁面,如下所示:

之后你可以在右上角搜索插件,對于想安裝的插件,點擊其左邊的圖標,即可下載安裝,如下所示,我正在安裝KImageNamed插件:

安裝完成后,再次點擊插件左邊的圖標,可以將該插件刪除。

插件路徑

Xcode 所有的插件都安裝在目錄~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/下,你也可以手工切換到這個目錄來刪除插件。

插件失效

當 Xcode 升級后,插件因為 UUID 問題而失效,我們該怎么解決呢?

首先通過 Mac 終端命令查看當前版本 Xcode 的 UUID,輸入如下命令:


defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID

然后在插件程序的 info.plist 文件中的 DVTPlugInCompatibilityUUIDs 數(shù)組鍵值中添加當前版本 Xcode 的 UUID 即可。

插件推薦


模擬器網(wǎng)絡模擬工具

下載地址 安裝教程


刪除不需要的模擬器

In Xcode 6 and above, you can find and delete the simulators from the path /Library/Developer/CoreSimulator/Profiles/Runtimes

Restart Xcode in order to take effect (may not be needed).


Mac OS X wants to use system keychain when compiling the project

  1. open your key chain access.
  2. on top left corner unlock the key chain (if it is locked).
  3. click system from top left corner.
  4. then click your distribution certificate dropdown.
  5. Double click private key under your distribution certificate.
  6. pop up is shown. In that go to access control.
  7. select allow all applications to access this item.
  8. then click save changes.
  9. close all windows,
  10. run application.

Git 管理 Xcode 代碼片段

xcode4 引入了一個新 feature: code snippets,在整個界面的右下角,可以通過快捷鍵:cmd + ctrl + opt + 2 調出來。

code snippets 是一些代碼的模版,對于一些常見的編程模式,xcode 都將這些代碼抽象成模版放到 code snippet 中,使用的時候,只需要鍵入快捷鍵,就可以把模版的內容填到代碼中。

例如,在引入 GCD(Grand Central Dispatch) 后,當我們需要一個延時的操作時,只需要在 xcode 中鍵入:dispatch

, 就可以看到 xcode 中彈出一個上下文菜單,第一項就是相應的代碼片段。

那么如何自定義 code snippet 呢,相當簡單,當你覺得某段代碼很有用,可以當作模版的時候,將其整塊選中,

拖動到 xcode 右下角的 code snippets 區(qū)域中即可。xcode 會自動幫你創(chuàng)建一個新的代碼片段。

之后你可以單擊該代碼片段,在彈出的界面中選擇 edit,即可為此代碼片段設置快捷鍵等信息。

如果有些地方你想讓用戶替換掉,可以用 <#被替換的內容#> 的格式。

這樣在代碼片段被使用后,焦點會自動移到該處,你只需要連貫的鍵入替換后的內容即可。

關于 xcode 的一些代碼片段,這里 有一些用戶的總結心得。

使用 Git 管理代碼片段

在了解了 code snippet 之后,我在想能不能用 Git 來管理它,于是就研究了一下,發(fā)現(xiàn)它都存放于目錄 ~/Library/Developer/Xcode/UserData/CodeSnippets 中。于是,我就將這個目錄設置成一個 Git 的版本庫,然后將自己整理

的代碼片段都放到 Github 上了。現(xiàn)在我有 2 臺 mac 機器,一臺筆記本,一臺公司的 iMac,我常常在 2 臺機器間切換著工作,由于將代碼片段都放在 github 上,所以我在任何一端有更新,另一端都可以很方便的用 git pull 將更新拉到本地。前兩天將公司機器升級到 lion,又重裝了 lion 版的 xcode,簡單設置一下,所有代碼片段都回來了,非常方便。


自動化打包

xcodebuild 命令

如何做 daily build 呢?其實 Xcode 就提供了命令行 build 的命令,這個命令是 xcodebuild,用 xcodebuild -usage

可以查看到所有的可用參數(shù),如下所示:


[tangqiao ~]$xcodebuild -usage

Usage: xcodebuild [-project <projectname>] [[-target <targetname>]...|-alltargets] [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [<buildsetting>=<value>]... [<buildaction>]...

       xcodebuild [-project <projectname>] -scheme <schemeName> [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [<buildsetting>=<value>]... [<buildaction>]...

       xcodebuild -workspace <workspacename> -scheme <schemeName> [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [<buildsetting>=<value>]... [<buildaction>]...

       xcodebuild -version [-sdk [<sdkfullpath>|<sdkname>] [<infoitem>] ]

       xcodebuild -list [[-project <projectname>]|[-workspace <workspacename>]]

       xcodebuild -showsdks

一般情況下的命令使用如下:


xcodebuild -configuration Release -target "YourProduct"

但在 daily build 中,用 Release 用為 configuration 其實不是特別好。因為 Release 的證書可能會被經(jīng)常修改。我們可以基于 Release 的 Configuation,建一個專門用于 daily build 的 configuration。方法是:在工程詳細頁面中,選擇 Info 一欄,在 Configurations 一欄的下方點擊 “+” 號,然后選擇 “Duplicate Release Configuration”, 新建名為 “DailyBuild” 的 Configuration.

之后就可以用如下命令來做 daily build 了


xcodebuild -configuration DailyBuild -target "YourProduct"

執(zhí)行完命令后,會在當前工程下的 build/DailyBuild-iphoneos/ 目錄下生成一個名為: YourProduct.app 的文件。這個就是我們 Build 成功之后的程序文件。

生成 ipa 文件

接下來我們需要生成 ipa 文件,在生成 ipa 文件這件事情上,xcode 似乎沒有提供什么工具,不過這個沒什么影響,因為 ipa 文件實際上就是一個 zip 文件,我們使用系統(tǒng)的 zip 命令來生成 ipa 文件即可。需要注意的是,ipa 文件并不是簡單地將編輯好的 app 文件打成 zip 文件,它需要將 app 文件放在一個名為 Payload 的文件夾下,然后將整個 Payload 目錄打包成為 .ipa 文件,命令如下:


cd $BUILD_PATH

mkdir -p ipa/Payload

cp -r ./DailyBuild-iphoneos/$PRODUCT_NAME ./ipa/Payload/

cd ipa

zip -r $FILE_NAME *

定時運行

這一點非常簡單,使用 crontab -e 命令即可。大家可以隨意 google 一下 crontab 命令,可以找到很多相關文檔。假如我們要每周 1-5 的早上 9 點鐘執(zhí)行 daily build,則 crontab 的配置如下:


0 9 * * * 1-5 /Users/tangqiao/dailybuild.sh >> /Users/tangqiao/dailybuild.log 2>&1

失敗報警

在 daily build 腳本運行失敗時,最好能發(fā)報警郵件或者短信,以便能夠盡早發(fā)現(xiàn)。發(fā)郵件可以用 python 的 smtplib 來寫,示例如下:


import smtplib

sender = 'sender@devtang.com'

receivers = ['receiver@devtang.com']

message = """From: Alert <sender@devtang.com>

To: Some one <receiver@devtang.com>

Subject: SMTP email sample

Hope you can get it.

"""

try:

    obj = smtplib.SMTP('server.mail.devtang.com')

    obj.sendmail(sender, receivers, message)

    print 'OK: send mail succeed'

except Exception:

    print 'Error: unable to send mail'

上傳

daily build 編譯出來如果需要單獨上傳到另外一臺 web 機器上,可以用 ftp 或者 scp 協(xié)議。如果 web 機器悲劇的是 windows 機器的話,可以在 windows 機器上開一個共享,然后用 mount -t smbfs 來將這個共享 mount 到本地,相關的示例代碼如下:


mkdir upload

mount -t smbfs //$SMB_USERNAME:$SMB_PASSWORD@$SMB_TARGET ./upload

if [ "$?" -ne 0 ]; then

    echo "Failed to mount smb directory"

    exit 1

fi

mkdir ./upload/$FOLDER

cp $FILE_NAME ./upload/$FOLDER/

if [ "$?" -eq 0 ]; then

    echo "[OK] $FILE_NAME is uploaded to $SMB_TARGET" 

else

    echo "[ERROR] $FILE_NAME is FAILED to  uploaded to $SMB_TARGET" 

fi

umount ./upload

遇到的問題

本來我寫的自動化腳本在 Mac OS X 10.6 下運行得很好。但是升級到 lion 后,腳本在手動執(zhí)行時很正常,但是在用 crontab 啟動時就會出現(xiàn)找不到開發(fā)者證書的錯誤。在網(wǎng)上搜了很久也沒有找到解決辦法。最后我試了一下在 “鑰匙串訪問” 中把開發(fā)者證書從 “登錄” 那欄拖動到 “系統(tǒng)” 那欄,居然就解決了


設置應用內的系統(tǒng)控件語言

在iOS應用中,有時候會需要調用系統(tǒng)的一些UI控件,例如:

在UIWebView中長按會彈出系統(tǒng)的上下文菜單

在UIImagePickerController中會使用系統(tǒng)的照相機界面

在編譯狀態(tài)下的UITableViewCell,處于待刪除時,會有一個系統(tǒng)的刪除按鈕。

以上這些UI控件中,其顯示的語言并不是和你當前手機的系統(tǒng)語言一致的。而是根據(jù)你的App內部的語言設置來顯示。結果就是,如果你沒有設置恰當?shù)脑挘愕闹形腁pp可能會出現(xiàn)一些英文的控件文字。

如何解決這個問題呢?方法如下:

用vim直接打開工程的Info.plist文件,在文件中增加如下內容即可:


<key>CFBundleLocalizations</key>       

<array>

        <string>zh_CN</string>

        <string>en</string>

</array>


在 XCode 中,點擊一個小眼睛圖標,就直接預覽 UIImage 的內容


在 LLDB 中輸入 fr v -R foo,可以查看 foo 這個變量的內存構成


let a: Int? = 1

let b: Int?? = a

let c: Int??? = b

(lldb) fr v -R a

(Swift.Optional<Swift.Int>) a = Some {

  Some = {

    value = 1

  }

}

(lldb) fr v -R b

(Swift.Optional<Swift.Optional<Swift.Int>>) b = Some {

  Some = Some {

    Some = {

      value = 1

    }

  }

}

(lldb) fr v -R c

(Swift.Optional<Swift.Optional<Swift.Optional<Swift.Int>>>) c = Some {

  Some = Some {

    Some = Some {

      Some = {

        value = 1

      }

    }

  }

}


Xcode磁盤空間大清理

  1. 移除對舊設備的支持
    影響:可重新生成;再連接舊設備調試時,會重新自動生成。我移除了4.3.2, 5.0, 5.1等版本的設備支持。
    路徑:~/Library/Developer/Xcode/iOS DeviceSupport

  2. 移除舊版本的模擬器支持
    影響:不可恢復;如果需要舊版本的模擬器,就需要重新下載了。我移除了4.3.2, 5.0, 5.1等舊版本的模擬器。
    路徑:~/Library/Application Support/iPhone Simulator

  3. 移除模擬器的臨時文件
    影響:可重新生成;如果需要保留較新版本的模擬器,但tmp文件夾很大。放心刪吧,tmp文件夾里的內容是不重要的。在iOS Device中,存儲空間不足時,tmp文件夾是可能被清空的。
    路徑:~/Library/Application Support/iPhone Simulator/6.1/tmp (以iOS Simulator 6.1為例)

  4. 移除模擬器中安裝的Apps
    影響:不可恢復;對應的模擬器中安裝的Apps被清空了,如果不需要就刪了吧。
    路徑:~/Library/Application Support/iPhone Simulator/6.1/Applications (以iOS Simulator 6.1為例)

  5. 移除Archives
    影響:不可恢復;Adhoc或者App Store版本會被刪除。建議備份dSYM文件夾
    路徑:~/Library/Developer/Xcode/Archives

  6. 移除DerivedData
    影響:可重新生成;會刪除build生成的項目索引、build輸出以及日志。重新打開項目時會重新生成,大的項目會耗費一些時間。
    路徑:~/Library/Developer/Xcode/DerivedData

  7. 移除舊的Docsets
    影響:不可恢復;將刪除舊的Docsets文檔
    路徑:~/Library/Developer/Shared/Documentation/DocSets


更新Storyboard多語言的文件

  1. Select your base storyboard file from the Project Navigator
  2. Find the Localization section in the File Inspector
  3. If your file is currently a [Localizable Strings], change it to [Interface Builder Cocoa Touch Storyboard] or vice-versa.
  4. Then change back again!

Tips

  • 日志輸出App啟動時間,配置環(huán)境變量DYLD_PRINT_STATISTICS
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容