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) 区

cmd + opt + 0        隐藏右边的工具 (Utility) 区

ctrl  + 6            列出当前文件中所有的方法,可以输入关键词来过滤。这个相当赞,可以快速定位到想编辑的方法。

                     我直接把这个快键盘改成了 ctrl+o,这样按起来更顺手。

cmd + ctrl + 左 / 右   到上 / 下一次编辑的位置,在 2 个编辑位置跳转的时候很方便。

cmd + opt + j        跳转到文件过滤区

cmd + shift + f      在工程中查找

cmd + r              运行,如果选上直接 kill 掉上次进程的话,每次直接一按就可以重新运行了

cmd + b              编译工程

cmd + shift + k      清空编译好的文件

cmd + .              结束本次调试

ESC                  调出代码补全

cmd + 单击           查看该方法的实现

opt + 单击           查看该方法的文档

cmd + t              新建一个 tab 栏

cmd + shift + [      在 tab 栏之间切换


Debug


Config


插件

  • DyCI :DyCI是一个动态注入工具,用于向iOS应用中注入代码而不用重新启动应用。

  • Quick:测试驱动开发(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 数组键值中添加当前版本 Xcode 的 UUID 即可。

插件推荐


模拟器网络模拟工具

下载地址 安装教程


删除不需要的模拟器

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 区域中即可。xcode 会自动帮你创建一个新的代码片段。

之后你可以单击该代码片段,在弹出的界面中选择 edit,即可为此代码片段设置快捷键等信息。

如果有些地方你想让用户替换掉,可以用 <#被替换的内容#> 的格式。

这样在代码片段被使用后,焦点会自动移到该处,你只需要连贯的键入替换后的内容即可。

关于 xcode 的一些代码片段,这里 有一些用户的总结心得。

使用 Git 管理代码片段

在了解了 code snippet 之后,我在想能不能用 Git 来管理它,于是就研究了一下,发现它都存放于目录 ~/Library/Developer/Xcode/UserData/CodeSnippets 中。于是,我就将这个目录设置成一个 Git 的版本库,然后将自己整理

的代码片段都放到 Github 上了。现在我有 2 台 mac 机器,一台笔记本,一台公司的 iMac,我常常在 2 台机器间切换着工作,由于将代码片段都放在 github 上,所以我在任何一端有更新,另一端都可以很方便的用 git pull 将更新拉到本地。前两天将公司机器升级到 lion,又重装了 lion 版的 xcode,简单设置一下,所有代码片段都回来了,非常方便。


自动化打包

xcodebuild 命令

如何做 daily build 呢?其实 Xcode 就提供了命令行 build 的命令,这个命令是 xcodebuild,用 xcodebuild -usage

可以查看到所有的可用参数,如下所示:


[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 的证书可能会被经常修改。我们可以基于 Release 的 Configuation,建一个专门用于 daily build 的 configuration。方法是:在工程详细页面中,选择 Info 一栏,在 Configurations 一栏的下方点击 “+” 号,然后选择 “Duplicate Release Configuration”, 新建名为 “DailyBuild” 的 Configuration.

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


xcodebuild -configuration DailyBuild -target "YourProduct"

执行完命令后,会在当前工程下的 build/DailyBuild-iphoneos/ 目录下生成一个名为: YourProduct.app 的文件。这个就是我们 Build 成功之后的程序文件。

生成 ipa 文件

接下来我们需要生成 ipa 文件,在生成 ipa 文件这件事情上,xcode 似乎没有提供什么工具,不过这个没什么影响,因为 ipa 文件实际上就是一个 zip 文件,我们使用系统的 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 点钟执行 daily build,则 crontab 的配置如下:


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

失败报警

在 daily build 脚本运行失败时,最好能发报警邮件或者短信,以便能够尽早发现。发邮件可以用 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 协议。如果 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 后,脚本在手动执行时很正常,但是在用 crontab 启动时就会出现找不到开发者证书的错误。在网上搜了很久也没有找到解决办法。最后我试了一下在 “钥匙串访问” 中把开发者证书从 “登录” 那栏拖动到 “系统” 那栏,居然就解决了


设置应用内的系统控件语言

在iOS应用中,有时候会需要调用系统的一些UI控件,例如:

在UIWebView中长按会弹出系统的上下文菜单

在UIImagePickerController中会使用系统的照相机界面

在编译状态下的UITableViewCell,处于待删除时,会有一个系统的删除按钮。

以上这些UI控件中,其显示的语言并不是和你当前手机的系统语言一致的。而是根据你的App内部的语言设置来显示。结果就是,如果你没有设置恰当的话,你的中文App可能会出现一些英文的控件文字。

如何解决这个问题呢?方法如下:

用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启动时间,配置环境变量DYLD_PRINT_STATISTICS
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容