简书小编,未来辅助的模拟器sdk是玖.贰本子

1.xcodebuild

那是自个儿第2眼想到的点子,写shell脚本,用自行编译的样式检查测试。不过那几个有一点都不小的主题素材:
(一)Xcode7将来支撑的模拟器sdk是玖.二版本,其余sdk需求我们温馨在英特网下载,一般都是从Xcode老版本中拷出来才行,可用xcodebuild
-showsdks 查看补助的sdk,如下图

201601181.png

切实的xcodebuild使用介绍网络海人民广播电视台大,笔者就不演讲了,刘伟先生的1篇小说写得很详细,可参照:xcodebuild
命令详解

(2)其次是编写翻译别的sdk的时刻会十分短(假诺是大项目来说),写二个本子编写翻译也没多大优势。

1.xcodebuild

那是自己先是眼想到的措施,写shell脚本,用自动编写翻译的方式检查实验。然而那么些有十分的大的难题:
(一)Xcode七现在支持的模拟器sdk是9.二本子,其余sdk须求大家团结在英特网下载,一般都是从Xcode老版本中拷出来才行,可用xcodebuild
-showsdks 查看支持的sdk,如下图

图片 1

201601181.png

切实的xcodebuild使用介绍英特网海人民广播电视台湾大学,作者就不演说了,刘伟先生的1篇小说写得很详细,可参考:xcodebuild
命令详解

(2)其次是编写翻译别的sdk的光阴会十分长(假使是大品类以来),写1个剧本编译也没多大优势。

默许大家一创制工程的时候就会定义2个宏而且是Debug方式下才有的宏,正是”DEBUG=一”,这一个的情致是概念了2个宏,宏名叫DEBUG,宏值为一,中间不可能有空格(注意!!!)

缘由

上2遍生产意况大家出现首要bug,因ApplePay上线,个中有2个宏文件我共事忘记加版本决定,测试也没测试(因为是小本子,applepay还未开放),导致线上1天崩溃近万次,多亏了jspatch,用热修复消除了此难点。那么难题来了,怎么让开垦职员提前看看编写翻译警告吗,以致于不犯这种起码错误。

缘由

上三次生产情形大家出现重大bug,因ApplePay上线,在这之中有1个宏文件作者同事忘记加版本决定,测试也没测试(因为是小本子,applepay还未开放),导致线上1天崩溃近万次,多亏了jspatch,用热修复消除了此难点。那么难点来了,怎么让开荒人士提前观看编写翻译警告吗,以致于不犯这种低端错误。

那是iOS定义了那几个宏所以我们得以直接拿来做决断,前面只要把伍改成对应的本子就行了。

demo

具体的demo在我的github上TestApiLevel

2.更加好的消除方式

更加好的化解措施明显是让编写翻译器直接付出警告!那么什么样技巧让编写翻译器给出警告吗?

图片 2

201601182.png

上边的图片引用自Warn about new API Classes and
Methods

对于Xcode中销毁的主意编写翻译器直接付出警告,那么编写翻译器是怎么样给出那一个警告和错误音信的吧?
具体涉及deprecated,unavailable那些用法,可参看

[iOSSimulatorSDK] usr/include/Availability.h
[iOSSimulatorSDK] usr/include/AvailabilityInternal.h

小编在stack overflow上搜到了1篇相当受启发的小说:Is there a way for XCode
to warn about new API
calls?

里头一些个应答都很好,由此找到了开源项目MJGAvailability,
本身修改了那几个头文件,加多了ios七后头的api,但是最后在Xcode七上新建贰个项目测试开掘一向未曾编写翻译警告,可是对自定义标注的性格和情势都有警示,如下图

图片 3

201601184.png

壹初叶小编以为是把UIKit都系统控件是否放在自个儿自定义头文件往日了,前面过了不短日子才感觉应该Xcode中或多或少编写翻译配置的难题,最后查到了是Enable
Modules 和 Link Framwork
automatically的案由,那是Xcode5之后提出的1门技艺,具体可参照[iOS七中Objective-C和Foundation的新本性],最后笔者在Debug情势设置Enable
Modules 和 Link Framework
automatically为NO(也许会冒出编写翻译错误,因为电动延续打消,一些关乎的库文件必要团结手动增多)

图片 4

201601185.png

注意:是因为我们重定义了系统宏,在release下不该这样做,因为这么做也许会招致有个别无法预言的难题,所以你能够在pch文件添加debug决断

  • 壹、在真机的时候供给编写翻译含有人脸识别的代码,定义这些宏
  • 二、在模拟器的时候不须要编写翻译含有人脸识其他代码,不定义该宏

贰.更加好的化解方法

更加好的化解格局明显是让编译器直接交给警告!那么怎么着才具让编写翻译器给出警告吗?

201601182.png

地点的图纸引用自Warn about new API Classes and
Methods

对此Xcode中销毁的点子编写翻译器直接交给警告,那么编写翻译器是什么样给出这一个警告和错误音信的啊?
切实涉及deprecated,unavailable这么些用法,可参考

[iOSSimulatorSDK] usr/include/Availability.h
[iOSSimulatorSDK] usr/include/AvailabilityInternal.h

自家在stack overflow上搜到了一篇相当受启发的稿子:Is there a way for XCode
to warn about new API
calls?

里面一些个应答都很好,因而找到了开源项目MJGAvailability,
本身修改了这些头文件,增添了ios七事后的api,可是最后在Xcode7上新建三个品种测试开采从来没有编写翻译警告,不过对自定义标注的性子和艺术都有警告,如下图

201601184.png

一起首自己感觉是把UIKit都系统控件是或不是放在作者自定义头文件从前了,前边过了非常长日子才感觉应该Xcode中一些编写翻译配置的标题,最终查到了是Enable
Modules 和 Link Framwork
automatically的来头,那是Xcode5之后建议的一门才干,具体可参看[iOS七中Objective-C和Foundation的新脾性],最终本身在Debug情势设置Enable
Modules 和 Link Framework
automatically为NO(大概会产出编写翻译错误,因为机关延续撤除,一些提到的库文件要求谐和手动增添)

201601185.png

注意:由于大家重定义了系统宏,在release下不应有如此做,因为如此做大概会促成有的无法预言的主题素材,所以您可以在pch文件增加debug判别

文/青花瓷的平方(简书小编)
原著链接:http://www.jianshu.com/p/b2e30cad2a0d
小说权归笔者全部,转发请联系作者得到授权,并标明“简书小编”。

开宗明义,版本调整有以下二种机遇:

解决

解决

要么应用以下也OK

demo

具体的demo在我的github上TestApiLevel

if (@available(iOS 9.0, *)) {
     // Fallback on this or after versions
} else {
     // Fallback on earlier versions
}

能够窥见互相的分别仅在于TA福特ExplorerGET_IPHONE_SIMULATOR
的值,而TARGET_OS_IPHONE 则是同样,都以真。

请详见iOS开发之Build
Setting设置

#if TARGET_IPHONE_SIMULATOR  
    NSLog(@"运行在模拟器上");  
    //不定义FACE_RECOGNITION_CODE这个宏
#else  
    NSLog(@"运行在真机上");  
    //定义FACE_RECOGNITION_CODE这个宏
    #define FACE_RECOGNITION_CODE
#endif

图片 5

再来看真机sdk中的定义:

做法比方如下:
笔者们付出进度中必要用到人脸识别,我们在 PCH(precompile prefix header)
文件中定义3个宏:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_5_0
    // This code will compile on versions >= ios5.0
    //这里面的代码在iOS5.0版本以上包括5.0才会编译
#else
    // This code will compile on versions<5.0
    //这里面的代码在iOS5.0版本以下才会编译
#endif
#define TARGET_OS_IPHONE            1     
#define TARGET_IPHONE_SIMULATOR     0 

预管理命令简要介绍
iOS编写翻译期和平运动转时系统版本决断代码
3个有趣的情状(苹果的bug Or
坑?),关于界别真机和模拟器的预编写翻译宏

iOS开采必备–景况变量配置(Debug &
Release)

手把手教你给1个iOS
app配置三个蒙受变量

逾期警告:
当大家在动用API的历程中难免会蒙受一些过期的API,那编写翻译器在编写翻译的时候就会报告警察方告,就算你做了版本调控,但要么会有很讨厌的警戒现身,那怎么消除那种过期的API警告呢?



if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
   //设备系统为IOS 7.0或者以上的
}else{
   //设备系统为IOS 7.0以下的
}

诸如此类警告就烟消云散了,那么也就不会那么烦心了,作为一个强迫症的自家,很有须要!

参考

也足以用以下的主意:


那么在Build Setting处怎么增添自身定义的呢?

Xcode在Build Setting里面就有2个是有关设定全局宏的,大家未来来解读一下:

  • 三、在切实可行代码中选择到的时候经过判定该宏是还是不是有定义过该宏来奉行人脸识别代码

预编译

Snip20170908_179.png

扩充一:真机和宪章器宏

扩展四:Build Setting设置

有心人看其模拟器sdk中的定义:

#define TARGET_OS_IPHONE            1     
#define TARGET_IPHONE_SIMULATOR     1 
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
    //xcode baseSDK为7.0或者以上
#else
    //xcode baseSDK为7.0以下的
#endif

就此,大家分别真机模拟器的时候必须用TAOdysseyGET_IPHONE_SIMULATOR来判断,使用TARGET_OS_IPHONE将不会有效果。
PS: 二个妙趣横生的情景(苹果的bug Or
坑?),关于界别真机和模拟器的预编写翻译宏

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
        //此处写你过期API相关的代码
#pragma clang diagnostic pop

那么大家就足以行使那个宏来做作业了,那么在动用的时候有以下二种写法:

扩展二:Xcode宏定义



在编写翻译在此以前运用预编写翻译指令来判定当前装备版本,不相同版本实施不一的主意以便到达版本调控的目标。(iOS预编写翻译指令)

运维的时候大家一般会用上面包车型地铁那种措施赢得系统版本来剖断:

iOS打字与印刷Debug日志的法子

在真机sdk中位于iOS->usr/include/targetconditionals.h中,
在模拟器sdk中位居simulator->usr/include/targetconditionals.h中

PS:iOS剖断真机依旧模拟器的使用

#ifdef DEBUG  
#define NSLog(...) NSLog(__VA_ARGS__)  
#else  
#define NSLog(...) {}  
#endif  

#if DEBUG == 1  
#define NSLog(...) NSLog(__VA_ARGS__)  
#else  
#define NSLog(...) {}  
#endif  

运行时

Snip20170721_151.png

  • TARGET_IPHONE_SIMULATOR
  • TARGET_OS_IPHONE
#ifdef FACE_RECOGNITION_CODE
       //书写人脸识别代码
#endif
#if DEBUG==1
   //需要编译的代码
#endif

//或者加上空格
#ifdef DEBUG == 1
   //需要编译的代码
#endif

#ifdef DEBUG
   //需要编译的代码
#endif

苹果关于真机和模拟器有三个宏定义

//方式一:宏名=宏值(只能是数字)
KODDEBUG=10

//方式二:宏名
KODDEBUG

留神:假如要增进宏值,等号前后都以不能够丰硕空格的!!!
PS:PReprocessor Macros :
全局宏命令的使用

笔者们在Build Setting里面输入”Preprocessor
Macros”就可以看到地方截图红框中的内容。

如故选取私下认可的DEBUG=一这一个来判断也是OK的,在PCH文件中加多:

真机和模拟器的应用情状:
我们有时会用到真机调试,比方说:用到摄像头.不过多多益善场馆下大家不供给用真机,只需求模拟器就OK,所觉得了防止在付出的进度中不会因为有个别部分要求真机的成效而致使程序崩溃,大家就须求做真机和模拟器判定而实践区别代码。

#ifndef __DEBUG_LOG__  
#define NSLog(...) NSLog(__VA_ARGS__)  
#else  
#define NSLog(...) {}  
#endif  

PS:关于Build Setting中的设置,请参考
Build settings
reference

iOS开发之Build Setting设置

  • 预编译
  • 运行时

图片 6

做法只须要在Build
Setting的Release填上DEBUG_LOG那几个字段就能够,然后再在PCH文件上充分上面这一段

恢宏三:调节和测试输出日志

相关文章