冷雨之家

Dying is the day worth living for

Xcodebuild 使用注意事项

| Comments

1.xcodebuild cocoapod CONFIGURATION_BUILD_DIR

现象

xcodebuild命令用法示例
1
xcodebuild -sdk iphoneos -configuration ${BUILD_CONFIGURATION} -derivedDataPath="../build" -workspace '../SohuInk.xcworkspace' -scheme 'SohuInk_Jenkins' -archivePath "../SohuInk_Jenkins.xcarchive" archive

如果项目中使用了cocoapod并且xcodebuild 命令参数中指定了CONFIGURATION_BUILD_DIR并且值为相对路径,此时在Xcode Tools Version 5.0下的xcodebuild构建会报如下错误:

error_info
1
2
3
4
5
6
7
8
9
10
ld: warning: directory not found for option '-L/XXXX/XXXX/pop'
ld: library not found for -lAFNetworking
clang: error: linker command failed with exit code 1 (use -v to see invocation)

** ARCHIVE FAILED **

The following build commands failed:
  Ld /Users/XXXX/XXXX/Objects-normal/arm64/SohuInk normal arm64
  Ld /Users/XXXX/XXXX normal armv7
(2 failures)

解决方案

方案1,不好用

Xcode Tools version 5.0 支持参数 derivedDataPath 可以放弃CONFIGURATION_BUILD_DIR配置指定该参数,我实际操作是发现使用相对路径的情况下,虽然可以archive success,但是build的目录没有改变,依然在xcode默认的derivedData目录下.

方案2,OK

CONFIGURATION_BUILD_DIR的值指定为绝对路径,一切OK,可成功archive.

结论

xcodebuild中的CONFIGURATION_BUILD_DIR值需要使用绝对路径

参考链接

Stackoverflow上关于使用xcodebuild CONFIGURATION_BUILD_DIR最好使用绝对路径的说明 @Chilloutman
https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html

Mac Terminal 快捷键记录

| Comments

Mac 命令行编辑快捷键的方法,对Mac的应用有所帮助。

Mac 命令行命令

Command Description
history 显示命令历史列表
↑(Ctrl+p) 显示上一条命令
↓(Ctrl+n) 显示下一条命令
clear 清除 shell 提示屏幕
exit 注销
history 显示命令历史
reset 刷新 shell 提示屏幕


Mac 命令行编辑快捷键

Command Description
↑(Ctrl+p) 显示上一条命令
↓(Ctrl+n) 显示下一条命令
!num 执行命令历史列表的第num条命令
!! 执行上一条命令
!?string? 执行含有string字符串的最新命令
Ctrl+r 然后输入若干字符,开始向上搜索包含该字符的命令,继续按 Ctrl+r,搜索上一条匹配的命令
Ctrl+s 与Ctrl+r类似,只是正向检索
→(Ctrl+f) 光标向前移动一个字符,相当与->
←(Ctrl+b) 光标向后移动一个字符,相当与<-
opt+← 光标向前移动一个单词
opt+→ 光标向后移动一个单词
ls !$ 执行命令ls,并以上一条命令的参数为其参数
Ctrl+a 移动到当前行的开头
Ctrl+e 移动到当前行的结尾
Esc+b 移动到当前单词的开头
Esc+f 移动到当前单词的结尾
Ctrl+l 清屏
Ctrl+u 剪切命令行中光标所在处之前的所有字符(不包括自身)
Ctrl+k 剪切命令行中光标所在处之后的所有字符(包括自身)
Ctrl+d 删除光标所在处字符
Ctrl+h 删除光标所在处前一个字符
Ctrl+y 粘贴刚才所删除的字符
Ctrl+w 剪切光标所在处之前的一个词(以空格、标点等为分隔符)
Ctrl+t 颠倒光标所在处及其之前的字符位置,并将光标移动到下一个字符
Ctrl+v 插入特殊字符,如Ctrl+v+Tab加入Tab字符键 ,先按下Ctrl+V,抬起后再按下Tab
Esc+t 颠倒光标所在处及其相邻单词的位置
Ctrl+c 删除整行
Ctrl+(x u) 按住Ctrl的同时再先后按x和u,撤销刚才的操作
Ctrl+s 挂起当前shell
Ctrl+q 重新启用挂起的shell


下面的应用可能稍稍高级一点点

Command Description
# !! 上一条命令
# !-n 倒数第N条历史命令
# !-n:p 打印上一条命令(不执行)
# !?string? 最新一条含有“string”的命令
# !-n:gs/str1/str2/ 将倒数第N条命令的str1替换为str2,并执行(若不加g,则仅替换第一个)

参考

http://notes.11ten.net/mac-command-line-editing-commonly-used-shortcut-keys.html

Git Commands 使用手记

| Comments

本文主要用来记录自己在使用Git的过程遇到的一些问题及解决方案.

1.Git push error: dst refspec dev_1.0 matches more than one.

导火索

Git 删除远程库中的一个分支的时候报错,如下:

  git push origin --delete dev_1.0
  error: dst refspec dev_1.0 matches more than one.
  error: failed to push some refs to 'git@xxxxx:xxx/xxx.git'

出现这个错误的原因是在于远程Git服务器上名称为dev_1.0的有两个对象:一个是tag,一个是branch;在执行 git push origin –delete dev_1.0这个命令时Git服务器不知道要删除哪个。

解决办法

删除名称为dev_1.0的branch:

1
git push origin :refs/heads/dev_1.0

删除名称为dev_1.0的tag:

1
git push origin :refs/tags/dev_1.0

获取mobileprovision文件的UUID

| Comments


Provision Profile 文件在Mac OS中的默认存放位置:

~/Library/MobileDevice/Provisioning Profiles

1.通过GUI的工具查看:

iPhone配置实用工具

2.命令行工具

0xc010d/mobileprovision-read
安装方法
在 Terminal中键入下面的命令并回车

Terminal
1
curl https://raw.githubusercontent.com/0xc010d/mobileprovision-read/master/main.m | clang -framework Foundation -framework Security -o /usr/local/bin/mobileprovision-read -x objective-c -

mobileprovision-read 命令介绍

Terminal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
➜  ~ mobileprovision-read
mobileprovision-read -- mobileprovision files querying tool.

USAGE
mobileprovision-read -f fileName [-o option]

OPTIONS
    type – prints mobileprovision profile type (debug, ad-hoc, enterprise, appstore)
    appid – prints application identifier
Will print raw provision's plist if option is not specified.
You can also use key path as an option.

EXAMPLES
mobileprovision-read -f test.mobileprovision -o type
    Prints profile type

mobileprovision-read -f test.mobileprovision -o UUID
    Prints profile UUID

mobileprovision-read -f test.mobileprovision -o ProvisionedDevices
    Prints provisioned devices UDIDs

mobileprovision-read -f test.mobileprovision -o Entitlements.get-task-allow
    Prints 0 if profile doesn't allow debugging 1 otherwise
➜  ~

eg:
mobileprovision-read -f “filepath” -o UUID -> 打印输出mobileprovision的UUID
mobileprovision-read -f “provisoning-profile-file-path” -o ProvisionedDevices -> 列出描述文件所包含的device UUID列表

3.自定义脚本

使用了苹果的security和PlistBuddy工具.
mobileapp.sh
使用方法:
./mobileapp.sh “provisoning-profile-file-path”
注意,如果filepath中含有空格,请将filepath加上双引号.

eg:

Terminal
1
2
3
4
➜  Desktop ./mobilepp.sh "/Users/newspring/Library/MobileDevice/Provisioning Profiles/1213b96b-4ac1-4365-ae45-350eb6beadf2.mobileprovision"
security: SecPolicySetValue: One or more parameters passed to a function were not valid.
UUID is:
1213b96b-4ac1-4365-ae45-350eb6beadf2

参考链接

https://my.oschina.net/ioslighter/blog/494342

Install macOS by U Disk

| Comments

动手之前,TimeMachine备份数据!
动手之前,TimeMachine备份数据!
动手之前,TimeMachine备份数据!

  • 1.8GB或者更大容量的U盘,Apple建议不小于12G
  • 2.使用 应用程序–>实用工具–>磁盘工具 格盘 (参考图片 格盘)
    • 名称 Sierra 使用其它名称注意在后面的Terminal命令中作出替换
    • 格式 Mac OS 扩展 (日志式)
    • 方案 GUID 分区图
  • 3.AppStore中下载Sierra系统.下载耗时较长,可以冲杯咖啡,休息一下去了.(参照图片 原版安装包)
  • 4.使用Terminal(应用程序→实用工具→终端),输入命令
    sudo /Applications/Install\ macOS\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/Sierra --applicationpath /Applications/Install\ macOS\ Sierra.app --nointeraction 耐心等待,直至出现Done.启动U盘制作结束.
  • 5.重新启动PC,按照Option不放,直到出现启动菜单选项. 启动菜单项

附几张网络图片,仅供参考

格盘
U盘格盘 原版安装包
原版安装包 步骤4,参考图 terminal-createinstallmedia

参考资料

创建可引导的macOS安装器,https://support.apple.com/zh-cn/HT201372
iPlaySoft简单制作 macOS Sierra 正式版U盘USB启动安装盘方法教程

MacBook Pro (13-inch Mid 2012) 升级SSD和16G内存

| Comments

我的MacBook Pro

电脑配置
机器型号: MacBook Pro (13-inch, Mid 2012) 普通屏
根据苹果官网的查询 苹果官网的MBP型号查询 型号应该是MD101或者MD102
处理器: 2.5 GHz Intel Core i5
原配内存: 2G*2 1600Hz DDR3
原配硬盘: 500G 机械硬盘

虽然现在来看,这个配置可以卡出翔来,厚度堪当砖,但是回想一下,对于当时还是在装有Windows系统的Samsung本子上, 用GNUstep来Build&Run Objective_C 的我来说, 这简直就是女神一般的存在.

在升级到macOS Sierra后,我已经再也无法忍受启动Xcode时候的无限风火轮.原来打算购买新的MacBook Pro,去官网看了一下,新的本子为了追求超薄,内存什么的都采用了焊接的工艺,换句话说,要买就得直接上顶配,不然以后没法升级.大体预算了一下,需要软妹币小两万.摸了摸自己的口袋,想了想老丈人的礼金,含着泪默默地关闭了apple.com.打开了京东.

升级方案

SSD的升级方案,按照网上的介绍有三种:

  • 1.主硬盘位保持原装机械硬盘不动,光驱位替换为SSD
  • 2.主硬盘位换为SSD,光驱位换为拆下来的机械硬盘
  • 3.主硬盘位换为SSD,光驱位不动.

在此,我的建议是,如果是Fusion类型的话(机械硬盘和SSD混用,方案1或者方案2),首先查看一下光驱位和主硬盘位的SATA串口的类型.
如果只有一个是SATA3,那么SSD放在SATA3串口的位置.
如果都是SATA3,那么主硬盘位放机械硬盘,光驱位放SSD,因为主硬盘会有SMS保护(SMS是什么后面会有介绍).但具体的要根据自己的实际情况,比如说因为光驱位的供电模式等原因造成的SSD不识别,那只能把SSD放在主硬盘位.
对我来说,我采用的是方案3,主要原因有下:
1.主硬盘位对于硬盘的保护比较好,垂直位置上和键盘不重叠,而光驱位位于键盘的正下方,相对来说不如主硬盘位稳定.
2.哥是一个纯粹的人,要什么Fusion啊,要存储的话直接上外置硬盘就好了.

查看主硬盘位和光驱位SATA类型的方法

关于本机–>概览–>系统报告–>SATA/SATA Express. 如图,看链接速度,SATA3为6千兆位. SATA2为3千兆位. 我的CD-ROM的协商的链接速度:1.5 千兆位. 原装硬盘的协商的链接速度为3千兆位,说明原装的机械硬盘上的串口速度最高到SATA2.
SATA_disk
SATA_cd-rom

购买的SSD和内存

购买时间正巧赶上了京东618店庆搞活动.
SSD我买的是 SAMSUNG 850 EVO 250G SATA3
JD Samsumg SSD
内存我买的是金士顿的8G内存条.买两条.按照Apple官网的内存升级指南2012Mid的MBP最高可以升级到4G*2,可能是当年的单条8G还不是很流行,我实测直接升级到8G*2没有任何问题.
JD Kingston Memory
另外还购买了SSK的2.5英寸的USB 3.0硬盘盒,用于装替换下来的原装硬盘.


替换SSD

先来一张拆机前的准备图:
ready
做好Time Machine后,开始更换SSD,先拆开后盖,注意拆机前先洗手,祷告,触摸金属,释放自身静电,祈求上帝保佑:
The location of screws
拆下来的螺丝,按照相对位置放好,便于以后重新安装上去. 后壳周边没有任何的暗扣,用塑料吸盘轻轻一吸就能起来. 螺丝排列
我曾经拆过三星,宏碁还有联想的笔记本(为了清灰,说多了都是泪),但是不得不说MBP内部光驱,硬盘,主板,风扇,电池的排列和构造简直是太完美了, 没有一处的细节不完美,没有一处的空间被浪费掉,且容我慢慢欣赏20s.
断开内存条右边的电池电源线,撬开光驱右边最下面的硬盘数据线. 拆开后盖总览
拆下硬盘上方的小的固定条,一共两个螺丝.
硬盘固定条
利用翘起的塑料小片, 轻轻拉出硬盘(注意藏在硬盘下面的排线,不要扯断了).
轻轻拔出左侧的SATA3接口,整个机械硬盘就完全拆下来了. 被拉出来的硬盘
按照上图的1,2,3,4的位置,把这四个螺丝拆下来,同样的位置安装到SSD上.
将SSD轻轻的装回原硬盘的位置,如下图所示,安装好以后,SSD会比原有的机械硬盘略薄一些,不过有螺丝的固定,没有影响.
换为SSD以后效果图


替换内存

内存条的替换没有什么可说的,具体的可以参加Apple的指南.Apple MBP 安装和拆卸内存指南
这里放一张基本流程的图:
替换内存条基本流程,引用自Apple
需要注意的一点是,一共上下两根条子,由于这两根条子挨得过于靠近,安装下面的条子的时候,不要把上面的条子的两边的压脚给弄坏了,金手指对齐插好以后,两边轻轻一按就能就位,要用巧劲,不要用蛮力. 替换内存


数据恢复

插入启动U盘,开机启动,先利用磁盘工具将SSD抹掉格式化为:OS X 扩展 (日志式),GUID 分区图.然后插入Time Machine的外置硬盘,选择将Time Machine备份的最新内容恢复到刚刚格式化的SSD分区中.
小技巧:合上后盖后,先不要着急上螺丝,先插U盘,点亮机器,识别出来SSD,确认机器不报警以后,再断电上螺丝.
制作启动U盘,参见另一篇blog 传送门U盘安装macOS系统


后续配置

开启Trim

TRIM 是系统级的命令,可以允许操作系统与固态硬盘通信,判断 SSD 上哪些区域没有使用,并准备好擦除和复写。如果缺少 TRIM 支持,系统会在 SSD 可用容量减少时遇到写入速度变慢的现象.
可以在「关于本机」里查看系统有没有开启 TRIM 支持:
SATA_disk

1
sudo trimforce enable

命令执行后会出现警告语,根据提示输入两次「Y」以后,如图显示,就说明 TRIM 支持开启成功了(命令执行完成后会自动重启) :
Trim_Start

注意,旧版本的OS X系统可能需要先禁用rootless

1
sudo nvram boot-args=rootless=0

据说 OS X El Capitan以后不需要,我当前用的Sierra不需要这个.

关闭突发移动感应器(Sudden Motion Sensor, SMS)

突发移动感应器 (SMS) 技术是针对硬盘设计的内建保护功能,有助于防止电脑在掉落或遭遇异常强烈的振动时出现磁盘问题。目前普遍的观点是MBP的SMS功能在主硬盘位上有,光驱位上没有,由于SMS对SSD没有任何的保护作用,为了防止SMS对主硬盘位上SSD造成数据损坏,建议关闭.
SMS的详细介绍可以在Apple的官方文档上查看 Mac 笔记本电脑:关于突发移动感应器

1
2
3
sudo pmset -g  //查看看sms的状态,1为开启,0位关闭  
sudo pmset sms -a 0 //关闭sms  
sudo pmset -g  //重新查看sms的状态是否为0.  

SMS_shutdown

关于是否需要关闭SMS的讨论,可以参见这里,http://bbs.feng.com/read-htm-tid-4285975.html

关闭Time Machine的本地快照

本地快照的详情,同样参见Apple Time Machine 官方介绍
这个功能会增加SSD的写入量,降低SSD的寿命.

1
2
sudo tmutil disablelocal //禁用本地快照
sudo tmutil enablelocal  //启用本地快照

在Time Machine的偏好设置中可以查看,本地快照的状态,出现了红色的部分即为启用,不出现即为禁用.
timemachine_local_shutdown

最终成果

开机10s以内,Xcode工程秒开,硬盘读写速度爽的飞起.
SSD_Speed

参考链接

http://www.superqq.com/blog/2015/08/27/macbook-replace-ssd-solid-state/
http://chaishiwei.com/blog/972.html
https://www.zhihu.com/question/21100176

iOS 操作系统目录说明

| Comments

iOS的设备越狱后,安装openssh,可以通过ssh连接工具(Mac OS 下直接使用Terminal)连接到手机上查看相关的系统目录: ssh 连接命令常用格式: `ssh [-l login_name] [-p port] [user@]hostname
示例:
$ ssh root@10.2.98.87
默认的openssh连接密码为:alpine

一、iPhone的图片是放在:/private /var/ mobile/Media /DCIM当中的。

Block 声明语法 简记

| Comments

本地变量(Local Variable)

returnType (^blockName)(parameterTypes) = ^returnType(parameters) {…};

属性(Property)

@property (nonatomic, copy, nullability) returnType (^blockName)(parameterTypes);

方法参数(method parameter)

  • (void)someMethodThatTakesABlock:(returnType (^nullability)(parameterTypes))blockName;

方法调用的时候的参数

[someObject someMethodThatTakesABlock:^returnType (parameters) {…}];

重定义(typedef)

typedef returnType (^TypeName)(parameterTypes); TypeName blockName = ^returnType(parameters) {…};

参考资料

http://fuckingblocksyntax.com/

Apple远程推送Pem证书生成-命令备忘

| Comments

Develoepr Environment

  1. 去Apple Develop 网站申请Push证书并下载导入到Keychain中.
  2. 从Keychain中分别导出证书和密钥的.p12文件:cer.p12 key.p12
    交换密码为:123456
  3. 使用openssl 将cer.p12及key.p12转成cer.pem和key.pem
    命令如下:

    $ openssl pkcs12 -clcerts -nokeys -out cer.pem -in cer.p12
    $ openssl pkcs12 -nocerts -out key.pem -in key.p12
    

    转换密钥文件时候,提示输一个pem的密码,转换完成后清除pem密码的命令:

    $ openssl rsa -in key.pem -out key.pem  
    
  4. 合并cer.pem及key.pem

    $ cat cer.pem key.pem > cer_key.pem
    

Release Environment 过程同上

PS.
测试生成的cer.pem及key.pem是否可用

1
$ openssl s_client -connect gateway.push.apple.com:2195  -cert cer.pem -key key.pem 

注:gateway.push.apple.com:2195用于appStore app;
gateway.sandbox.push.apple.com:2195用于沙盒app;
以上命令执行后会打印一大罗信息,最后处于可输入状态,打几个字符回车后自动断开连接即为正常。

使用CocoaLumberjack和XcodeColors实现分级Log和控制台打印彩色日志

| Comments

本文是基于:https://blog.cnbluebox.com/blog/2014/06/06/shi-yong-cocoalumberjackhe-xcodecolorsshi-xian-fen-ji-loghe-kong-zhi-tai-yan-se/ 的改动.

Xcode是一款非常优秀的IDE,但是在日志打印上貌似没有那么多高级的特性,比如分级打印,显示颜色。本博客就介绍下两个开源组件结合使用达到如下效果:

1.CocoaLumberjack

1.1基本介绍

CocoaLumberjack是一个开源工程,为Xcode提供分级打印的策略,源码地址:CocoaLumberjack

CocoaLumberjack包含几个对象分别可以把Log输出到不同的地方:

  • DDASLLogger 输出到Console.app
  • DDTTYLogger 输出到Xcode控制台
  • DDLogFileManager 输出到文件
  • DDAbstractDatabaseLogger 输出到DB

通过ddLogLevel的int型变量或常量来定义打印等级

  • LOG_LEVEL_OFF 关闭Log
  • LOG_LEVEL_ERROR 只打印Error级别的Log
  • LOG_LEVEL_WARN 打印Error和Warning级别的Log
  • LOG_LEVEL_INFO 打印Error、Warn、Info级别的Log
  • LOG_LEVEL_DEBUG 打印Error、Warn、Info、Debug级别的Log
  • LOG_LEVEL_VERBOSE 打印Error、Warn、Info、Debug、Verbose级别的Log

使用不同的宏打印不同级别的Log

  • DDLogError(frmt, …) 打印Error级别的Log
  • DDLogWarn(frmt, …) 打印Warn级别的Log
  • DDLogInfo(frmt, …) 打印Info级别的Log
  • DDLogDebug(frmt, …) 打印Debug级别的Log
  • DDLogVerbose(frmt, …) 打印Verbose级别的Log

如果,现在想往已有的工程中引入CocoaLumberjack,可以使用下面的宏定义,

1
#define NSLog(...) DDLogInfo(__VA_ARGS__)

1.2设置LogFormatter

我们可以定制自己的Log的方式。通过创建一个类实现DDLogFormatter协议的方法- (NSString *)formatLogMessage:(DDLogMessage *)logMessage;,如下创建一个LogFormatter类,并实现如下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
...
NSDateFormatter *threadUnsafeDateFormatter;
threadUnsafeDateFormatter = [[NSDateFormatter alloc] init];
        [threadUnsafeDateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss:SSS"];
...  
    
-(NSString *)formatLogMessage:(DDLogMessage *)logMessage{
    
    NSString *levelStr = nil;
    NSString *dateAndTime = [threadUnsafeDateFormatter stringFromDate:(logMessage->_timestamp)];
    
    switch (logMessage.flag) {
        case DDLogFlagError:
        {
            levelStr=@"[ERROR]";
            break;
        }
        case DDLogFlagWarning:{
            levelStr=@"[WARN ]";
            break;
        }
        case DDLogFlagDebug:{
            levelStr=@"[DEBUG]";
            break;
        }
        case DDLogFlagInfo:
        {
            levelStr=@"[INFO ]";
            break;
        }
        default:
            levelStr=@"[VBOSE]";
            break;
    }
    
    return [NSString stringWithFormat:@"%@ %@ > %@ [line %d] %@",levelStr,dateAndTime,logMessage.function,logMessage.line,logMessage.message];
}

上面的例子中我们定制了Log能打印自己的等级、类和方法、代码行数。

1.3初始化

CocoaLumberjack的引擎需要我们自己来启动。下面的示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 DDFileLogger *filelogger = [[DDFileLogger alloc] init];
    filelogger.rollingFrequency = 60*60*24;//1h滚动一次
    filelogger.logFileManager.maximumNumberOfLogFiles = 24;//最大文件数量24个
    
    [[DDTTYLogger sharedInstance] setColorsEnabled:YES];
    [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor blackColor] backgroundColor:nil forFlag:DDLogFlagVerbose];
    [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor blueColor] backgroundColor:nil forFlag:DDLogFlagDebug];
    [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor purpleColor] backgroundColor:nil forFlag:DDLogFlagInfo];
    [[DDTTYLogger sharedInstance] setForegroundColor:[UIColor orangeColor] backgroundColor:nil forFlag:DDLogFlagWarning];

    [DDLog addLogger:[DDTTYLogger sharedInstance]];//写入xCode控制台
    [DDLog addLogger:[DDASLLogger sharedInstance]];//写入到苹果的日志
    [DDLog addLogger:filelogger];//写入到文件系统 Cache/Library/Log
    filelogger.logFormatter = [[SHDDLogFormatter alloc] init];
    [DDTTYLogger sharedInstance].logFormatter = [[SHDDLogFormatter alloc] init];
    
    DDLogError(@"DDLogError 中文错误");      // red
    DDLogWarn(@"DDLogWarn 中文警告");        // orange
    DDLogDebug(@"DDLogDebug 中文调试");      // blue
    DDLogInfo(@"DDLogInfo 中文信息");        // purple
    DDLogVerbose(@"DDLogVerbose 中文详细");  // black
    

2.XcodeColors

2.1安装

XcodeColors是一个Xcode插件,源码地址:XcodeColors; 代码下下来后打开工程run一次,插件就自动安装到了~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins/XcodeColors.xcplugin路径下.
安装完成重启Xcode
也可以通过Alcatraz来安装,具体的参见Xcode常用插件集合

2.2配置scheme

在Scheme中配置Environment Variables, 添加参数XcodeColors为YES.如下图

2.3为DDLog打开颜色

1
[[DDTTYLogger sharedInstance] setColorsEnabled:YES];

2.4为特定的Log级别设定颜色

1
[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor orangeColor] backgroundColor:nil forFlag:DDLogFlagWarning];

完成以上步骤就可以看到控制台的不同颜色的打印了。。

参考文章

https://blog.cnbluebox.com/blog/2014/06/06/shi-yong-cocoalumberjackhe-xcodecolorsshi-xian-fen-ji-loghe-kong-zhi-tai-yan-se/