快捷鍵
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
插件
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 即可。
插件推薦
- JSPatchX
- 《那些不能錯過的 Xcode 插件》
模擬器網(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
- open your key chain access.
- on top left corner unlock the key chain (if it is locked).
- click system from top left corner.
- then click your distribution certificate dropdown.
- Double click private key under your distribution certificate.
- pop up is shown. In that go to access control.
- select allow all applications to access this item.
- then click save changes.
- close all windows,
- 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磁盤空間大清理
移除對舊設備的支持
影響:可重新生成;再連接舊設備調試時,會重新自動生成。我移除了4.3.2, 5.0, 5.1等版本的設備支持。
路徑:~/Library/Developer/Xcode/iOS DeviceSupport移除舊版本的模擬器支持
影響:不可恢復;如果需要舊版本的模擬器,就需要重新下載了。我移除了4.3.2, 5.0, 5.1等舊版本的模擬器。
路徑:~/Library/Application Support/iPhone Simulator移除模擬器的臨時文件
影響:可重新生成;如果需要保留較新版本的模擬器,但tmp文件夾很大。放心刪吧,tmp文件夾里的內容是不重要的。在iOS Device中,存儲空間不足時,tmp文件夾是可能被清空的。
路徑:~/Library/Application Support/iPhone Simulator/6.1/tmp (以iOS Simulator 6.1為例)移除模擬器中安裝的Apps
影響:不可恢復;對應的模擬器中安裝的Apps被清空了,如果不需要就刪了吧。
路徑:~/Library/Application Support/iPhone Simulator/6.1/Applications (以iOS Simulator 6.1為例)移除Archives
影響:不可恢復;Adhoc或者App Store版本會被刪除。建議備份dSYM文件夾
路徑:~/Library/Developer/Xcode/Archives移除DerivedData
影響:可重新生成;會刪除build生成的項目索引、build輸出以及日志。重新打開項目時會重新生成,大的項目會耗費一些時間。
路徑:~/Library/Developer/Xcode/DerivedData移除舊的Docsets
影響:不可恢復;將刪除舊的Docsets文檔
路徑:~/Library/Developer/Shared/Documentation/DocSets
更新Storyboard多語言的文件
- Select your base storyboard file from the Project Navigator
- Find the Localization section in the File Inspector
- If your file is currently a [Localizable Strings], change it to [Interface Builder Cocoa Touch Storyboard] or vice-versa.
- Then change back again!
Tips
- 日志輸出App啟動時間,配置環(huán)境變量
DYLD_PRINT_STATISTICS