iOS6、7、8、9、10主要新特性和注意点

来源:互联网 发布:阿里云干什么的 编辑:程序博客网 时间:2024/06/05 17:35

iOS6新特性


一、关于内存警告

ios6中废除了viewDidUnload,viewWillUnload这两个系统回调,收到内存警告时在didReceiveMemoryWarning中进行相关的处理。

- (void)viewDidUnload {    [super viewDidUnload];    // 处理 ios6 以下的系统内存警告系统回调消息}// 这里处理ios6 的内存警告- (void)didReceiveMemoryWarning {    [super didReceiveMemoryWarning];    float sysVer = [[[UIDevice currentDevice] systemVersion] floatValue];    //ios6 的特殊处理    if (sysVer >= 6.0f) {        // 保证 invisible,  因为即使在当前界面也会收到系统回调        if (self.view.window == nil) {            //.......            // 做相关的释放操作            self.view = nil;   // 确保下次会重新加载        }    }}
二、关于屏幕旋转

同样ios6 废除了shouldAutorotateToInterfaceOrientation这个旋转屏幕的设置接口。

必须在两个新接口中设置旋转属性:shouldAutorotate、supportedInterfaceOrientations。

收到旋转事件后的处理,同样在willRotateToInterfaceOrientation和didRotateFromInterfaceOrientation中进行。

三、UISwitch

ios6下,新增了以下几个属性,可以设置开关的颜色以及背景图。

@property (nonatomic,  retain) UIColor *tintColor;@property (nonatomic,  retain) UIColor *thumbTintColor;@property (nonatomic,  retain) UIImage *onImage;@property (nonatomic,  retain) UIImage *offImage;
四、UINavigationBar

ios6新增了,设置阴影图片的属性。

@property (nonatomic, retain) UIImage *shadowImage;
五、UIImage

可以在ios6下设置图片的scale比例尺寸了。

+ (UIImage *)imageWithData:(NSData *)data scale:(CGFloat)scale;- (id)initWithData:(NSData *)data scale:(CGFloat)scale;
六、UIRefreshControl

之前苹果官方是没有现成的下拉刷新的控件,都是自己实现或者使用比较成熟的开源库。

ios6苹果加入了UIRefreshControl,配合UITableView直接实现下拉刷新。

七、UICollectionView

全新的集合控件,应用场景有类似照片墙,瀑布流等。

iOS7新特性


一、已禁用-[UIDevice uniqueIdentifier]

苹果总是把用户的隐私看的很重要。-[UIDevice uniqueIdentifier]在iOS5实际在iOS5的时候已经被遗弃了,但是iOS7中已经完全的禁用了它。Xcode5甚至不会允许你编译包含了指引到-[UIDevice uniqueIdentifier]的app。

此外,iOS7之前的使用了-[UIDevice uniqueIdentifier] 的app如果在iOS7上运行,它不会返回设备的UUID,而是会返回一串字符串,以FFFFFFFF开头,跟着-[UIDevice identifierForVendor]的十六进制值。

二、UIPasteboard由共享变为沙盒化了

UIPasteboard过去是用来做app之间的数据分享的。UIPasteboard本无问题,但是开发者开始使用它来存储标识符,和其他的相关app分享这些标识符的时候问题就出现了。有一个使用这种把戏的就是OpenUDID。

在iOS7中,使用 +[UIPasteboard pasteboardWithName:create:]和 +[UIPasteboard pasteboardWithUniqueName]创建剪贴板,而且只对相同的app group可见,这样就让OpenUDID不那么有用了。

三、MAC地址不能再用来设别设备

还有一个生成iOS设备唯一标示符的方法是使用iOS设备的Media Access Control(MAC)地址。一个MAC地址是一个唯一的号码,它是物理网络层级方面分配给网络适配器的。这个地址苹果还有其他的名字,比如说是硬件地址(Hardware Address)或是Wifi地址,都是指同样的东西。

有很多工程和框架都使用这个方法来生成唯一的设备ID。比如说ODIN。然而,苹果并不希望有人通过MAC地址来分辨用户,所以如果你在iOS7系统上查询MAC地址,它现在只会返回02:00:00:00:00:00。

现在苹果明确的表明你应该使用-[UIDevice identifierForVendor]或是-[ASIdentifierManager advertisingIdentifier]来作为你框架和应用的唯一标示符。坦白的来说,应对这些变化也不是那么的难,见以下代码片段:

NSString *identifierForVendor = [[UIDevice currentDevice].identifierForVendor UUIDString];NSString *identifierForAdvertising = [[ASIdentifierManager sharedManager].advertisingIdentifier UUIDString];

每种方法都适配一种特别的用法:

identifierForVendor对供应商来说是唯一的一个值,也就是说,由同一个公司发行的的app在相同的设备上运行的时候都会有这个相同的标识符。然而,如果用户删除了这个供应商的app然后再重新安装的话,这个标识符就会不一致。

advertisingIdentifier会返回给在这个设备上所有软件供应商相同的 一个值,所以只能在广告的时候使用。这个值会因为很多情况而有所变化,比如说用户初始化设备的时候便会改变。

四、iOS现在要求app如需使用麦克风,需要征得用户同意

以前如果app需要使用用户的位置,通讯录,日历,提醒以及照片,接受推送消息,使用用户的社交网络的时候需要征得用户的同意。现在在iOS7当中,使用麦克风也需要取得用户同意了。如果用户不允许app使用麦克风的话,那么需要使用麦克风的app就不能接收不到任何声音。

以下的代码是用来查询用户是否允许app使用麦克风:

//第一次调用这个方法的时候,系统会提示用户让他同意你的app获取麦克风的数据// 其他时候调用方法的时候,则不会提醒用户// 而会传递之前的值来要求用户同意[[AVAudioSession sharedInstance] requestRecordPermission:^(BOOL granted) {    if (granted) {        // 用户同意获取数据    } else {        // 可以显示一个提示框告诉用户这个app没有得到允许?    }}];

你同时还要注意,如果你在获得用户的同意之前使用任何方法来使用麦克风的话,会引起iOS系统弹出以下警示栏:


4673_140117110443_1.jpg
五、[NSArray firstObject]的实现

-[NSArray firstObject]可能是Objective-C中被调用做多的API。在Open Radar上一个简单的调查显示有一些需求苹果已经做了记录。好消息是现在这些需求已经得到了解决。. firstObject的使用可以追溯到iOS4.0,但是那时仅仅是一个私有方法。在iOS7以前,工程师用下面的方式来使用它:

NSArray *arr = @[];id item = [arr firstObject];// 在之前你需要做以下工作id item = [arr count] > 0 ? arr[0] : nil;

因为上面的方式很平常,有些人将它作为一个类增加到NSArray中,然后创建他们自己的firstObject方法。

这个方法的问题是这个方法的名字必须是唯一的,否则的话这个方法所引发的问题无法预估。

请确保检查你是否有任何自定义的代码在NSArray上实现了firstObject,如果有的话看看它是否是必须的,不是必须的话就把它全部移除。

六、增加了instancetype

instancetype让iOS7API变得更加难懂。苹果改变了大部分 initializer和简易构造函数(convenience constructors),用instancetype代替id作返回类型。但是这个instancetype是什么呢?

instancetype用来在声明一个方法时告诉编译器其返回类型,它表示返回调用该方法的类的对象。

这比之前返回id的通常做法要好,编译器可以对返回类型做一些检查,如果出现错误,在编译时就能提醒你,而不是在程序运行时发生崩溃。

同时,在调用子类方法时,使用它还可以省去对返回值的强制类型转换,编译器能够正确推断方法的返回值类型。

要说到instancetaype的缺点和优点吗?基本上,在任何可能的情况下都可以使用它。

七、设置UIImage的渲染模式:UIImage.renderingMode

着色(Tint Color)是iOS7界面中的一个重大改变,你可以设置一个UIImage在渲染时是否使用当前视图的Tint Color。

UIImage新增了一个只读属性:renderingMode,对应的还有一个新增方法:imageWithRenderingMode:,它使用UIImageRenderingMode枚举值来设置图片的renderingMode属性。该枚举中包含下列值:

// 根据图片的使用环境和所处的绘图上下文自动调整渲染模式UIImageRenderingModeAutomatic // 始终绘制图片原始状态,不使用Tint ColorUIImageRenderingModeAlwaysOriginal // 始终根据Tint Color绘制图片,忽略图片的颜色信息UIImageRenderingModeAlwaysTemplate

renderingMode属性的默认值是UIImageRenderingModeAutomatic,即UIImage是否使用Tint Color取决于它显示的位置。其他情况可以看下面的图例:


2.png

以下的代码说明了使用一个既定的rendering模式创建图片是多么简单:

UIImage *img = [UIImage imageNamed:@"myimage"];img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
八、tintcolor VS barTintColor

iOS7中你可以使用一个给定的颜色,甚至是记入颜色主题来给整个app着色,帮助你的app脱颖而出。设置app的tint color很简答,只要使用UIView的新属性tintColor即可。

这个属性是否听上去很熟悉呢?应该很熟悉,有些类,比如说UINaviagtionBar,UISearchBar,UITabBar以及UIToolbar已经有了这么命名的属性。他们现在有了一个新的属性:barTintColor。

为了避免使用新属性的时候犯错误,如果你的appp需要支持iOS6以前的系统的时候,请检查一下。

UINavigationBar *bar = self.navigationController.navigationBar;UIColor *color = [UIColor greenColor];if ([bar respondsToSelector:@selector(setBarTintColor:)]) { // iOS 7+    bar.barTintColor = color;} else { // what year is this? 2012?    bar.tintColor = color;}
九、去掉了纹理颜色

纹理颜色?对,不再使用他们了,不能再创建可以展现纹理的颜色。

根据UIInterface.h文件中的注释,-[UIColor groupTableViewBackgroundColor]应该是要在iOS6当中即被删除了,但是它仅仅只是不像之前那样返回纹理颜色了。然而,以下的颜色在iOS7当中被删除了:

+ (UIColor *)viewFlipsideBackgroundColor;+ (UIColor *)scrollViewTexturedBackgroundColor;+ (UIColor *)underPageBackgroundColor;
十、UIButtonTypeRoundRect被UIButtonTypeSystem取代了

4.jpg

在iOS开发刚开始就陪伴着你的老朋友现在也被删除了,它就是UIButtonTypeRoundRect ,被新的UIButtonTypeSystem取代了。

如果每次iOS系统的发布都没有一些新的功能会是什么样子?这些新功能相信大部分开发者已经知道了,你可能会发现一些新颖的方式将它们整合到你的app中去!

十一、检查无线路由是否可用

定制一个视频播放器的能力在iOS版本每次的发布中一直有所进步。比如说,在iOS6之前,你不能在MPVolumeView中改变AirPlay的icon。

在iOS7当中,你可以通过AirPlay,蓝牙或是其他的虚线机制了解是否有一个远程的设备可用。了解它的话,就可以让你的app在恰当的时候做恰当的事,比如说,在没有远程设备的时候就不显示AirPlay的icon。

以下是新增加到MPVolumeView的新属性和推送

@property (nonatomic, readonly) BOOL wirelessRoutesAvailable; //  是否有设备可以连接的无线线路?@property (nonatomic, readonly) BOOL wirelessRouteActive; // 设备现在是否连接上了网络NSString *const MPVolumeViewWirelessRoutesAvailableDidChangeNotification;NSString *const MPVolumeViewWirelessRouteActiveDidChangeNotification;
十二、了解蜂窝网络

在iOS7之前,是使用Reachability来检测设备是否连接到WWAN或是Wifi的。iOS7在这个基础上更进了一步,它会告诉你的设备连接上的是那种蜂窝网络,比如说是Edge网络,HSDPA网络,或是LTE网络。告诉用户他们连接上的是哪种网络可以优化用户体验,因为这样他们会知道网速如何,不会去请求需要高网速的网络请求。

这是CTTelephonyNetworkInfo的部分功能,它是CoreTelephony框架的一部分。iOS7还增加了currentRadioAccessTechnology属性和CTRadioAccessTechnologyDidChangeNotification到这个类。还有一些新的字符串常量来定义可能的值,比如说是CTRadioAccessTechnologyLTE。

以下代码告诉你在app delegate中如何使用这个新功能:

@import CoreTelephony.CTTelephonyNetworkInfo; // new modules syntax!@interface AppDelegate ()// we need to keep a reference to the CTTelephonyNetworkInfo object, otherwise the notifications won't be fired!@property (nonatomic, strong) CTTelephonyNetworkInfo *networkInfo;@end@implementation ViewController- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    // whatever stuff your method does...    self.networkInfo = [[CTTelephonyNetworkInfo alloc] init];    NSLog(@"Initial cell connection: %@", self.networkInfo.currentRadioAccessTechnology);    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(radioAccessChanged) name:     CTRadioAccessTechnologyDidChangeNotification object:nil];    // whatever stuff your method does...}- (void)radioAccessChanged {    NSLog(@"Now you're connected via %@", self.networkInfo.currentRadioAccessTechnology);}@end

注意:研究一下CTTelephonyNetworkInfo.h 文件来看看是否有其他无线网络类型的的字符串常量。如果设备没有连上的话,currentRadioAccessTechnology 则会返回nil。

十三、通过iCloud同步用户设备的密码

iOS7以及Mavericks增加了iCloud Keychain来提供密码,以及iCloud中一些敏感数据的同步。开发者可以通过keychain中的kSecAttrSynchronizable key来遍历dictionary对象。

由于直接处理keychain比较难,封装库提供了一个简单的处理keychain的方法。SSKeychain封装库可能是最有名的的一个,作为一种福利,现在它支持在iCloud同步。

以下代码片段显示了如何使用SSKeychain:

#import <SSKeychain.h>- (BOOL)saveCredentials:(NSError **)error {    SSKeychainQuery *query = [[SSKeychainQuery alloc] init];    query.password = @"MySecretPassword";    query.service = @"MyAwesomeService";    query.account = @"John Doe";    query.synchronizable = YES;    return [query save:&error];}- (NSString *)savedPassword:(NSError **)error {    SSKeychainQuery *query = [[SSKeychainQuery alloc] init];    query.service = @"MyAwesomeService";    query.account = @"John Doe";    query.synchronizable = YES;    query.password = nil;    if ([query fetch:&error]) {        return query.password;    }    return nil;}

不要忘记CocoaPods是快速便捷安装SSKeychian的好方法。

十四、使用NSAttributedString显示HTML

在app中使用webview有时会让人非常沮丧,即使只是显示少量的HTMLneirong ,webview也会消耗大量的内存。现在iOS7让这些变得简单了,你可以从用少量代码在HTML文件中创建一个NSAttributedString,比如:

NSString *html = @"<bold>Wow!</bold> Now <em>iOS</em> can create <h3>NSAttributedString</h3> from HTMLs!";NSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};NSAttributedString *attrString = [[NSAttributedString alloc] initWithData:[html dataUsingEncoding:NSUTF8StringEncoding] options:options documentAttributes:nil error:nil];

现在你可以在任意的UIKit对象上使用NSAttributedString 了,比如说是一个UILabel或是一个UITextField。

注意:NSHTMLTextDocumentType 只是NSDocumentTypeDocumentAttribute key一种可能的值。你还可以使用NSPlainTextDocumentType,NSRTFTextDocumentType或是NSRTFDTextDocumentType。

你还可以从NSAttributedString中创建一个HTML字符串,如下:

NSAttributedString *attrString; // from previous codeNSDictionary *options = @{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType};NSData *htmlData = [attrString dataFromRange:NSMakeRange(0, [attrString length]) documentAttributes:options error:nil];NSString *htmlString = [[NSString alloc] initWithData:htmlData encoding:NSUTF8StringEncoding];

现在你估计在app中会更多的使用HTML了。

十五、使用原生的Base64

Base64是使用ASCII码显示二进制数据的一种流行方法。直到现在,开发者还不得不使用开源的工具来编码解码Base64的内容。

现在iOS7引入了以下四种新的NSData方法来操作Base64编码的数据:

// From NSData.h- (id)initWithBase64EncodedString:(NSString *)base64String options:(NSDataBase64DecodingOptions)options;- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options;- (id)initWithBase64EncodedData:(NSData *)base64Data options:(NSDataBase64DecodingOptions)options;- (NSData *)base64EncodedDataWithOptions:(NSDataBase64EncodingOptions)options;

这些方法可以帮助你轻易的将NSData对象转化为Base64,或者将Base64转化为NSData object。见以下的例子:

NSData* sampleData = [@"Some sample data" dataUsingEncoding:NSUTF8StringEncoding];NSString * base64String = [sampleData base64EncodedStringWithOptions:0];NSLog(@"Base64-encoded string is %@", base64String); // prints "U29tZSBzYW1wbGUgZGF0YQ=="NSData* dataFromString = [[NSData alloc] initWithBase64EncodedString:base64String options:0];NSLog(@"String is %@",[NSString stringWithUTF8String:[dataFromString bytes]]); // prints "String is Some sample data"

如果你需要支持iOS6或者更早以前的系统,你可以使用以下两个方法:

/* These methods first appeared in NSData.h on OS X 10.9 and iOS 7.0. They are deprecated in the same releases in favor of the methods in the <code>NSDataBase64Encoding</code> category. However, these methods have existed for several releases, so they may be used for applications targeting releases prior to OS X 10.9 and iOS 7.0. */- (id)initWithBase64Encoding:(NSString *)base64String;- (NSString *)base64Encoding;
十六、使用UIApplicationUserDidTakeScreenshotNotification来检查截图

在iOS7之前,像Snapshot或是Facebook Poke这样的app是使用一些很精巧的方法来检测用户是否有截图。然而,iOS7提供一个崭新的推送方法:UIApplicationUserDidTakeScreenshotNotification。只要像往常一样订阅即可知道什么时候截图了。

注意:UIApplicationUserDidTakeScreenshotNotification 将会在截图完成之后显示。现在在截图截取之前无法得到通知。希望苹果会在iOS8当中增加UIApplicationUserWillTakeScreenshotNotification。

十七、实现多语言语音合成

如果可以让app说话会不会很好呢?iOS7加入了两个新类:AVSpeechSynthesizer 以及AVSpeechUtterance。这两个类可以给你的app发声。很有意思不是吗?有多种语言可供选择——Siri不会说的语言也有,比如说巴西葡萄牙语。

使用这两个类给app提供语言合成的功能非常简单。AVSpeechUtterance 代表你想说什么,如何说。AVSpeechSynthesizer 用来发出这些声音,见以下代码片段:

AVSpeechSynthesizer *synthesizer = [[AVSpeechSynthesizer alloc] init];AVSpeechUtterance *utterance =[AVSpeechUtterance speechUtteranceWithString:@"Wow, I have such a nice voice!"];utterance.rate = AVSpeechUtteranceMaximumSpeechRate / 4.0f;utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"en-US"]; // defaults to your system language[synthesizer speakUtterance:utterance];
十八、使用了新的UIScreenEdgePanGestureRecognizer

UIScreenEdgePanGestureRecognizer 继承自UIPanGestureRecognizer ,它可以让你从屏幕边界即可检测手势。

使用新的手势识别器很简单,见以下:

UIScreenEdgePanGestureRecognizer *recognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleScreenEdgeRecognizer:)];recognizer.edges = UIRectEdgeLeft;[self.view addGestureRecognizer:recognizer];
十九、使用UIScrollViewKeyboardDismissMode实现了Message app的行为

像Messages app一样在滚动的时候可以让键盘消失是一种非常好的体验。然而,将这种行为整合到你的app很难。幸运的是,苹果给UIScrollView添加了一个很好用的属性keyboardDismissMode,这样可以方便很多。

现在仅仅只需要在Storyboard中改变一个简单的属性,或者增加一行代码,你的app可以和办到和Messages app一样的事情了。

这个属性使用了新的UIScrollViewKeyboardDismissMode enum枚举类型。这个enum枚举类型可能的值如下:

UIScrollViewKeyboardDismissModeNone        // the keyboard is not dismissed automatically when scrollingUIScrollViewKeyboardDismissModeOnDrag      // dismisses the keyboard when a drag beginsUIScrollViewKeyboardDismissModeInteractive // the keyboard follows the dragging touch off screen, and may bepulled upward again to cancel the dismiss

以下是让键盘可以在滚动的时候消失需要设置的属性:


5.png
二十、使用Core Image来检测眨眼以及微笑

iOS给Core Image增加了两种人脸检测功能:CIDetectorEyeBlink以及CIDetectorSmile。这也就是说你现在可以在照片中检测微笑以及眨眼。

以下是在app中使用它的方法:

UIImage *image = [UIImage imageNamed:@"myImage"];CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace                                          context:nil                                          options:@{CIDetectorAccuracy: CIDetectorAccuracyHigh}];NSDictionary *options = @{ CIDetectorSmile: @YES, CIDetectorEyeBlink: @YES };NSArray *features = [detector featuresInImage:image.CIImage options:options];for (CIFaceFeature *feature in features) {    NSLog(@"Bounds: %@", NSStringFromCGRect(feature.bounds));    if (feature.hasSmile) {        NSLog(@"Nice smile!");    } else {        NSLog(@"Why so serious?");    }    if (feature.leftEyeClosed || feature.rightEyeClosed) {        NSLog(@"Open your eyes!");    }}
二十一、给UITextView增加了链接

现在在iOS添加你自己的Twitter账户更加简单了,现在你可以给一个NSAttributedString增加链接了,然后当它被点击的时候唤起一个定制的action。

首先,创建一个NSAttributedString然后增加给它增加一个NSLinkAttributeName 属性,见以下:

NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"This is an example by @marcelofabri_"];[attributedString addAttribute:NSLinkAttributeName                         value:@"username://marcelofabri_"                         range:[[attributedString string] rangeOfString:@"@marcelofabri_"]];NSDictionary *linkAttributes = @{NSForegroundColorAttributeName: [UIColor greenColor],                                 NSUnderlineColorAttributeName: [UIColor lightGrayColor],                                 NSUnderlineStyleAttributeName: @(NSUnderlinePatternSolid)};// assume that textView is a UITextView previously created (either by code or Interface Builder)textView.linkTextAttributes = linkAttributes; // customizes the appearance of linkstextView.attributedText = attributedString;textView.delegate = self;

这样就可以让链接在文本中显示。然而,你也可以控制当链接被点击的时候会发生什么,实现这个可以使用UITextViewDelegate协议的新的shouldInteractWithURL方法,就像这样:

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {    if ([[URL scheme] isEqualToString:@"username"]) {        NSString *username = [URL host];        // do something with this username        // ...        return NO;    }    return YES; // let the system open this URL}

iOS8新特性

一、UIAlertController对alert&actionSheet的封装

UIAlertController.h

提示框按钮的选择

typedef NS_ENUM(NSInteger, UIAlertActionStyle) {    UIAlertActionStyleDefault = 0,    UIAlertActionStyleCancel,    UIAlertActionStyleDestructive} NS_ENUM_AVAILABLE_IOS(8_0);

提示框的样式

typedef NS_ENUM(NSInteger, UIAlertControllerStyle) {    UIAlertControllerStyleActionSheet = 0,    UIAlertControllerStyleAlert} NS_ENUM_AVAILABLE_IOS(8_0);NS_CLASS_AVAILABLE_IOS(8_0) @interface UIAlertAction : NSObject <NSCopying>

创建提示框按钮

+ (instancetype)actionWithTitle:(NSString *)title style:(UIAlertActionStyle)style handler:(void (^)(UIAlertAction *action))handler;@property (nonatomic, readonly) NSString *title;@property (nonatomic, readonly) UIAlertActionStyle style;@property (nonatomic, getter=isEnabled) BOOL enabled;@endNS_CLASS_AVAILABLE_IOS(8_0) @interface UIAlertController : UIViewController

创建提示框

+ (instancetype)alertControllerWithTitle:(NSString *)title message:(NSString *)message preferredStyle:(UIAlertControllerStyle)preferredStyle;

添加按钮

- (void)addAction:(UIAlertAction *)action;@property (nonatomic, readonly) NSArray *actions;

添加文本输入框

- (void)addTextFieldWithConfigurationHandler:(void (^)(UITextField *textField))configurationHandler;@property (nonatomic, readonly) NSArray *textFields;@property (nonatomic, copy) NSString *title;@property (nonatomic, copy) NSString *message;@property (nonatomic, readonly) UIAlertControllerStyle preferredStyle;

简单实用示例:

// 1.创建提示框对象,默认是actionSheet效果UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"注意" message:@"我的呈现方式变了" preferredStyle:UIAlertControllerStyleAlert];// 2.创建取消按钮并添加到提示框上[alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {    NSLog(@"取消按钮被点击了");}]];// 3.呈现提示框[self presentViewController:alert animated:YES completion:nil];
二、UIPopoverController直接通过present方式呈现

UIViewController.h

typedef NS_ENUM(NSInteger, UIModalPresentationStyle) {    UIModalPresentationFullScreen = 0,    UIModalPresentationPageSheet NS_ENUM_AVAILABLE_IOS(3_2),    UIModalPresentationFormSheet NS_ENUM_AVAILABLE_IOS(3_2),    UIModalPresentationCurrentContext NS_ENUM_AVAILABLE_IOS(3_2),    UIModalPresentationCustom NS_ENUM_AVAILABLE_IOS(7_0),    UIModalPresentationOverFullScreen NS_ENUM_AVAILABLE_IOS(8_0),    UIModalPresentationOverCurrentContext NS_ENUM_AVAILABLE_IOS(8_0),    UIModalPresentationPopover NS_ENUM_AVAILABLE_IOS(8_0),    UIModalPresentationNone NS_ENUM_AVAILABLE_IOS(7_0) = -1,};@property (nonatomic,readonly) UIPopoverPresentationController *popoverPresentationController NS_AVAILABLE_IOS(8_0);

使用示例:

// 1.创建内容控制器UITableViewController *contentVc = [[UITableViewController alloc] init];// 2.1 设置呈现方式contentVc.modalPresentationStyle = UIModalPresentationPopover;// 2.2设置在导航栏的左边按钮呈现contentVc.popoverPresentationController.barButtonItem = self.navigationItem.leftBarButtonItem;// 3.呈现[self presentViewController:contentVc animated:YES completion:nil];

以前的方式:

// 1.创建内容控制器UITableViewController *contentVc = [[UITableViewController alloc] init];// 2.创建popoverUIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:contentVc];popover.popoverContentSize = CGSizeMake(100, 100);// 3.呈现[popover presentPopoverFromBarButtonItem:self.navigationItem.leftBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
三、获取用户授权的用户隐私保护

地图定位示例 :

// 导入定位框架#import <CoreLocation/CoreLocation.h>@interface ViewController ()<CLLocationManagerDelegate>// 设置定位对象@property(nonatomic,strong)CLLocationManager* maneger;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // 当使用iOS8定位的时候需要请求用户授权,且在info.plist里添加字段NSLocationAlwaysUsageDescription 请求用户授权的描述    // iOS7仅仅需要在info.plist里添加字段Privacy - Location Usage Description 请求用户授权的描述    // 不需要再写下面的代码    if (IOS8) {        [self.maneger requestAlwaysAuthorization];//请求用户授权     }    // 开启定位    [self.maneger startUpdatingLocation];}
四、针对屏幕适配应运而生的size classes

size classes是为了解决storyboard只能订制一种屏幕样式的问题,它不再是具体的尺寸,而是抽象尺寸通过宽/高 的compact、any、regular 组成了九种组合包含了所有苹果设备的尺寸。

iOS9新特性


一、网络适配

iOS9系统发送的网络请求将统一使用TLS 1.2 SSL。采用TLS 1.2 协议,目的是强制增强数据访问安全,而且系统Foundation框架下的相关网络请求,将不再默认使用HTTP等不安全的网络协议,而默认采用TLS 1.2。服务器因此需要更新,以解析相关数据。如不更新,可通过在 info.plist 中声明,倒退回不安全的网络请求。

什么是SSL/TLS?跟HTTP和HTTPS有什么关系?

跟往常一样,先说结论:

HTTP + SSL/TLS + TCP = HTTPS

TLS 是 SSL 新的别称。举个例子:

“TLS1.0”之于“SSL3.1”,犹“公元2015”之于“民国104”,或者是“一千克”之于“一公斤”,或者是“半斤”之于“八两”:称呼不同,但意思相同。

SSL 3.0版本之后的迭代版本被重新命名为TLS 1.0,也就是说:

TLS 1.0 = SSL 3.1

所以他们是一个东西,我们平常也经常简单见到 “SSL/TLS” 这种说法。常用的是下面这些:

SSL 2.0SSL 3.0TLS 1.0 (SSL 3.1)TLS 1.1 (SSL 3.1)TLS 1.2 (SSL 3.1)

那为什么标题是“使用HTTPS”而没有提及SSL和TLS什么事? 要理解这个,要看下一个公式:

HTTP + SSL/TLS + TCP = HTTPS

打个比方:如果原来的 HTTP 是塑料水管,容易被戳破;那么如今新设计的 HTTPS 就像是在原有的塑料水管之外,再包一层金属水管。一来,原有的塑料水管照样运行;二来,用金属加固了之后,不容易被戳破。

目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。但是,主流浏览器都已经实现了TLS 1.2的支持。Apple让你的HTTP采用SSL/TLS协议,就是让你从HTTP转到HTTPS。

以前的HTTP不是也能用吗?为什么要用SSL/TLS,闲得慌?!Apple是不是又在反人类?

不使用SSL/TLS的HTTP通信,就是不加密的通信!

所有信息明文传播,带来了三大风险:

窃听风险(eavesdropping):第三方可以获知通信内容。

篡改风险(tampering):第三方可以修改通信内容。

冒充风险(pretending):第三方可以冒充他人身份参与通信。

SSL/TLS协议是为了解决这三大风险而设计的,希望达到:

所有信息都是加密传播,第三方无法窃听。

具有校验机制,一旦被篡改,通信双方会立刻发现。

配备身份证书,防止身份被冒充。

如何适配?---弱弱地问下:加班要多久?

正如文章开头所说:

TLS 1.2 协议 强制增强数据访问安全 系统 Foundation 框架下的相关网络请求,将不再默认使用 HTTP 等不安全的网络协议,而默认采用 TLS 1.2。服务器因此需要更新,以解析相关数据。如不更新,可通过在 Info.plist 中声明,倒退回不安全的网络请求。

方案一:立即让公司的服务端升级使用TLS 1.2。

方案二:虽Apple不建议,但可通过在 Info.plist 中声明,倒退回不安全的网络请求依然能让App访问指定http,甚至任意的http。

info.plist 配置中的XML源码如下所示:


6.jpg

上面是比较严谨的做法,指定了能访问哪些特定的HTTP。当然也有暴力的做法: 彻底倒退回不安全的HTTP网络请求,能任意进行HTTP请求,比如你在开发一款浏览器App,或者你想偷懒,或者后台想偷懒,或者公司不给你升级服务器。但目前Apple的官方文档并未提及如何在 info.plist 配置可以参考本文:http://blog.6ag.cn/1065.html

二、更灵活的后台定位

如果不适配iOS9,就不能偷偷在后台定位。不过苹果将允许出现这种场景:

同一App中的多个location manager,一些只能在前台定位,另一些可在后台定位,并可随时开启或者关闭特定location manager的后台定位。

如何偷偷在后台定位:

// 1. 实例化定位管理器_locationManager = [[CLLocationManager alloc] init];// 2. 设置代理_locationManager.delegate = self;// 3. 定位精度[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];// 4.请求用户权限:分为:?只在前台开启定位?在后台也可定位,//注意:建议只请求?和?中的一个,如果两个权限都需要,只请求?即可,//??这样的顺序,将导致bug:第一次启动程序后,系统将只请求?的权限,?的权限系统不会请求,只会在下一次启动应用时请求?if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {    //[_locationManager requestWhenInUseAuthorization];//?只在前台开启定位    [_locationManager requestAlwaysAuthorization];//?在后台也可定位}// 5.iOS9新特性:将允许出现这种场景:同一app中多个location manager:一些只能在前台定位,另一些可在后台定位(并可随时禁止其后台定位)。if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {    _locationManager.allowsBackgroundLocationUpdates = YES;}// 6. 更新用户位置[_locationManager startUpdatingLocation];

但是如果照着这种方式尝试,而没有配置info.plist,100%你的程序会崩溃掉,并报错:

* Assertion failure in -[CLLocationManager setAllowsBackgroundLocationUpdates:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/CoreLocationFramework_Sim/CoreLocation-1808.1.5/Framework/CoreLocation/CLLocationManager.m:593

要将 info.plist 配置如下:


7.png

对应的 Info.plist 的XML源码是:


8.jpg
三、Bitcode

bitcode的理解应该是把程序编译成的一种过渡代码,然后苹果再把这个过渡代码编译成可执行的程序。bitcode也允许苹果在后期重新优化我们程序的二进制文件,有类似于App瘦身的思想。未来Watch应用须包含Bitcode,iOS不强制,但Xcode7默认会开启Bitcode。

用了xcode7的编译器编译之前没问题的项目可能会出现下列报错。

XXXX’ does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode forthistarget. forarchitecture arm64

问题的原因是:某些第三方库还不支持bitcode。要不然是等待库的开发者升级了此项功能我们更新库,要不就是把这个bitcode禁用。禁用Bitcode,方法见下图:


9.png
四、企业级分发

iOS9之前,企业级分发十分方便:点击App出现“信任按钮”。

iOS9以后,企业级分发ipa包将遭到与Mac上dmg安装包一样的待遇。默认不能安装,也不再出现“信任按钮”,必须让用户进行gif图中的设置。


10.gif
五、URL scheme

URL scheme一般使用的场景是应用程序有分享或跳其他平台授权的功能,分享或授权后再跳回来。在iOS8并没有做过多限制,在iOS9中,如果使用URL scheme必须在"info.plist"中将你要在外部调用的URL scheme列为白名单,否则不能使用。

canOpenURL: failed forURL : "mqzone://qqapp"- error: "This app is not allowed to query for scheme mqzone"

具体的解决方案也是要在info.plist中设置 LSApplicationQueriesSchemes 类型为数组,下面添加所有你用到的scheme


11.png

推荐一篇博客: http://awkwardhare.com/post/121196006730/quick-take-on-ios-9-url-scheme-changes

其中最关键的是以下部分:

If you call the “canOpenURL” method on a URL that is not in your whitelist, it will return “NO”, even if there is an app installed that has registered to handle this scheme. A “This app is not allowed to query for scheme xxx” syslog entry will appear.

If you call the “openURL” method on a URL that is not in your whitelist, it will fail silently. A “This app is not allowed to query for scheme xxx” syslog entry will appear.

六、新字体

iOS8中,字体是Helvetica,中文的字体有点类似于“华文细黑”。只是苹果手机自带渲染,所以看上去可能比普通的华文细黑要美观。iOS9中,中文系统字体变为了专为中国设计的“苹方” 有点类似于一种word字体“幼圆”。字体有轻微的加粗效果,并且最关键的是字体间隙变大了!

所以很多原本写死了width的label可能会出现“...”的情况。


12.png

13.png

上面这两张图也可以直观的看出同一个界面,同一个label的变化。

所以为了在界面显示上不出错,就算是固定长度的文字也还是建议使用sizetofit 或者ios向上取整 ceilf() 或者提前计算。

CGSize size = [title sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14.0f]}];CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));
七、tableview

虽然现在的iOS9已经推送正式版了,但是iOS9使用时还是会感觉到App比以前更加卡顿了,tableView拖动时卡顿显示的最为明显。 并且之前遇到一个bug,原本好的项目用xcode7一编译,tableView刷新出了问题 ,[tableView reloadData]无效,有一行cell明明改变了但是刷新不出来。 感觉可能是这个方法和某种新加的特性冲突了,猜测可能是reloadData的操作被推迟到下一个RunLoop执行最终失效。

解决的方法是,注释[tableView reloadData],改用局部刷新,问题居然就解决了。

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

iOS 10新特性以及适配点

SiriKit

所有第三方应用都可以用Siri,支持音频、视频、消息发送接收、搜索照片、预订行程、管理锻炼等


Proactive Suggestions系统预先建议

背景就是iOS9的时候系统给予的主动建议通过:Spolight搜索,Safari搜索,Handoff,或者siri建议。

在iOS10之后新增了,键盘QuickType建议,地图,车载娱乐,应用切换,siri交互,锁屏播放。eg:你正在一个应用里看一个酒店,可以使用mapitem属性保存正在查看的这个酒店的位置,然后你切换旅行或地图App时这个位置可以自动提供使用。

如果你需要这样利用系统来共享一个位置,那你需要指定这个位置的经纬度、地名、电话等属性来便于siri的直接调起。

Message App Extension

在iOS 10里面开发者可以给Message.app提供两种App Extension,分别是可以提供一个表情包(没错,英文名就叫Sticker Pack),和一个自定义的界面,用于表情搜索等

User Notifications用户通知

iOS 10中以前杂乱的和通知相关的API都被统一了,现在开发者可以使用独立的UserNotifications.framework来集中管理和使用iOS系统中通知的功能。

在iOS 10中,开发者的服务器有机会在本地或者远程通知发送给用户之前再进行修改。

在此基础上,Apple还增加了撤回单条通知,更新已展示通知,中途修改通知内容,在通知中展示图片视频,自定义通知UI等一系列新功能,非常强大。

Speech Recognition语音识别

IOS 10引入Speech.framework用来支持语音识别,在app中可以识别语音并转成文本,语音来源可以是实时的也可以是录音。

Wide Color广色域

包括Core Graphics,Core Image,Metal,AVFoundation在内的图像框架极大的改善了对更加广泛的像素格式和宽色域色彩空间的支持。

Adapting to the True Tone Display真色调展示

真色调(True Tone)显示使用环境光传感器,可以做到配合当前环境的光线条件自动调节显示的颜色和强度。如果你的应用是阅读类,和环境中的白点保持一致对用户来说就是有益的。

App Search Enhancements应用搜索增强功能

新的CSSearchQuery类支持搜索那些你用Core Spotlight API指出的应用内内容。

使用这些API可以淘汰你应用中单独的搜索索引,以及更好的利用Spotlight强大的搜索技术,同时,匹配规则允许用户在不离开你应用的条件下搜索内容,就像他们在Mail,Messages和Notes中体验到的一样。

Widget Enhancements widget增强功能

iOS10引入了一个新的锁屏设计,新的锁屏现在会显示各种widget。

Apple Pay Enhancements

在iOS10中,用户可以从网页上,或通过Siri和地图的互动来使用Apple Pay进行简单和安全的支付。

对于开发者来说,iOS10引入了可以同时在iOS和watchOS上使用的新API,支持动态支付网络的能力,和新的沙盒测试环境。

Security and Privacy Enhancements

iOS10引入几个变化来帮助您提高代码的安全和维护用户数据的隐私性。

想了解更多,请查阅 https://developer.apple.com/security/

CallKit来电拦截相关

CallKit框架(CallKit.framework)使得VoIP应用能与iPhone UI整合到一起,从而给用户带来更好的体验。

使用这个框架来让用户在锁屏页面查看和接听打来的VoIP电话,并在Phone应用的个人收藏和最近通话视图中管理来自VoIP通话的联系人。

CallKit框架同样也引入了应用扩展(appextensions),这个扩展可以进行呼叫拦截和来电识别。你可以创建一个应用扩展来将电话号码和名称关联起来,或是告诉系统什么样的号码需要被拦截。

News Publisher Enhancements

News Publisher使用Apple NewsFormat来让发表设计精美的新闻、杂志、网页内容到Apple News变的简单。

从各大杂志或新闻机构这种独立出版商,到个人博客,任何人都可以注册。

Video Subscriber Account

iOS10引入了Video SubscriberAccount框架(VideoSubscriberAccount.framework)来帮助应用支持流媒体认证或认证视频点播(也被称为TV Everywhere)与他们的有线电视或卫星电视供应商认证。

对于那些用户注册一次就能解锁流媒体订阅服务的应用来说,使用这个框架中的API可以帮助你支持单一登录体验。


增加的库

CallKit

iAd

Intents(Siri相关)

IntentsUI(Siri相关)

Messages

Speech

UserNotifications

UserNotificationsUI

VideoSubscriberAccount

移除的库

iAdJS

Twitter

变化的接口

AVKit、Core Image、GameKit、GameplayKit、HealthKit、HomeKit、Metal、ModelIO、Photos、ReplayKit、ReplayKit、SpriteKit均有不同程度的改动。详细请参考官方 iOS 9.3 toiOS 10.0 API Differences



需要关注的地方

1. UITabBarController中的改进

在iOS 10之前,tabBarItem上的文字颜色,默认是蓝色,上面的新消息提醒数字badge默认是红色的,未选中的TabBarItem的文字颜色默认是黑色的,我们修改的话,也只能修改它的默认颜色,其它的就不能进行个性化定制,使用起来非常的不方便,iOS10之后我们可以轻松个性化定制了。

2. iOS10.0中字体跟随系统设置变化大小

在以前如果说我们想改变APP中程序的字体大小,我们只能自定义字体或者使用runtime进行处理,或者都得设置UIFont,非常的不方便,从iOS 10苹果官方允许我们自定义设置代码:self.labels.adjustsFontForContentSizeCategory = YES;

3. UIViewPropertyAnimator属性动画器

那么在iOS 10之前,我们使用UIView做动画效果或者自定义一些layer的动画,如果开始了,一般无法进行停止操作更不能暂停操作,而且一些非常复杂的动画处理也比较麻烦,但是在iOS10,苹果推出了一个全新的APIUIViewPropertyAnimator,可供我们处理动画操作

4. UIColor新增方法

在iOS10之前,UIColor中设置颜色只能通过RGB来表示,在iOS原生还不支持#16进制写法,还得自己写分类去处理,我们知道RGB表示的颜色是优先的,而且也是不精准的,那么在iOS10中,苹果官方新增了colorWithDisplayP3Red方法

5. UIApplication对象中openUrl被废弃

在iOS 10.0以前的年代,我们要想使用应用程序去打开一个网页或者进行跳转,直接使用[[UIApplication sharedApplication] openURL方法就可以了,但是在iOS10已经被废弃了,因为使用这种方式,处理的结果我们不能拦截到也不能获取到,对于开发是非常不利的,在iOS 10全新的推出了[UIApplication sharedApplication] openURL:nil options:nilcompletionHandler:^(BOOL success);有一个成功的回调block可以进行监视。

6. CoreData提升了并发访问性能

7.刷新控件(UIRefreshControl)

iOS系统自带的刷新控件支持所有的UIScrollView以及其子类,比如说UICollectionView,UITableView。

8. GCD多线程支持创建私有队列

9. iOS10对隐私权限的管理

比如访问的摄像头、麦克风等硬件,都需要提前请求应用权限、允许后才可以使用,或者现在要提前声明,虽然以往要求不严格。比如在iOS10中访问通讯录时,强制必须在Info.plist中加入NSContactsUsageDescription等描述,否则应用会崩溃。

崩溃日志:

***This app has crashed because itattempted to access privacy-sensitive data without a usage description. Theapp's Info.plist must contain an NSCameraUsageDescriptionkey with a stringvalue explaining to the user how the app uses this data.


10.证书签名

在Xcode 8中,代码签名错误的情况应该不会存在了。在每一个targe中,你都可以在框中打勾来告诉Xcode让它来代表你管理代码签名。对于新项目这个选项默认是打开的。

打勾以后,Xcode为你管理certificates,provisioning profiles和application identifiers。


11. Xib兼容问题

Xcode8上打开项目要小心,尤其是对于xib过程,在变动后可不要随意点保存,否则当你回头用Xcode7打开时时发现报错了,Xcode保存的xib在xcode7上是识别不了的,如果你在Xcode8中打开或者xib文件,会弹出如下提示框,忽视他


12.运行时问题Runtime Issues

这Xcode新特性,自动识别跟踪找到漏洞并且报告问题,有些很难跟踪的bug,直到您的应用程序到了用户手中,也可能没有被发现。

Thread Sanitizer spots:新的线程污点清理器,解决多线程情况下的资源竞争条件,数据的变化和其它相关线程的

bug View Debugger:使用更新的带有更大的保真度和视觉精度检查UI约束问题的视图调试器

Memory Debugger:可以用新的内存调试跟踪器跟踪发出的内存泄漏警报。



iOS 10兼容适配点

1. iOS 10对隐私权限的管理(必须要改否则会crash)

比如访问的摄像头、麦克风等硬件,都需要提前请求应用权限、允许后才可以使用,或者现在要提前声明,虽然以往要求不严格。比如在iOS10中访问通讯录时,强制必须在Info.plist中加入NSContactsUsageDescription等描述,否则应用会崩溃。

崩溃日志:

***This app has crashed because itattempted to access privacy-sensitive data without a usage description. Theapp's Info.plist must contain an NSCameraUsageDescriptionkey with a stringvalue explaining to the user how the app uses this data.

Photo Library

NSPhotoLibraryUsageDescription

Camera

NSCameraUsageDescription

Microphone

NSMicrophoneUsageDescription

Location

NSLocationUsageDescription

Location When In Use

NSLocationWhenInUseUsageDescription

Location Always

NSLocationAlwaysUsageDescription

Calendars

NSCalendarsUsageDescription

Reminders

NSRemindersUsageDescription

Motion

NSMotionUsageDescription

Health Update

NSHealthUpdateUsageDescription

Health Share

NSHealthShareUsageDescription

Bluetooth Peripheral

NSBluetoothPeripheralUsageDescription



相关的字段:

麦克风权限:Privacy - Microphone Usage Description 是否允许此App使用你的麦克风?

相机权限: Privacy - Camera Usage Description 是否允许此App使用你的相机?

相册权限: Privacy - Photo Library Usage Description 是否允许此App访问你的媒体资料库?通讯录权限: Privacy - Contacts Usage Description 是否允许此App访问你的通讯录?

蓝牙权限:Privacy - Bluetooth Peripheral Usage Description 是否许允此App使用蓝牙?

语音转文字权限:Privacy - Speech Recognition Usage Description 是否允许此App使用语音识别?

日历权限:Privacy - Calendars Usage Description 是否允许此App使用日历?

定位权限:Privacy - Location When In Use Usage Description 我们需要通过您的地理位置信息获取您周边的相关数据

定位权限: Privacy - Location Always Usage Description 我们需要通过您的地理位置信息获取您周边的相关数据


2. Xib兼容问题

Xcode8上打开项目要小心,尤其是对于xib过程,在变动后可不要随意点保存,否则当你回头用Xcode7打开时时发现报错了,Xcode8保存的xib在xcode7上是识别不了的,如果你在Xcode8中打开或者xib文件,会弹出如下提示框,忽视他



3. UIApplication对象中openUrl被废弃(不改也可以用)

在iOS 10.0以前的年代,我们要想使用应用程序去打开一个网页或者进行跳转,直接使用[[UIApplication sharedApplication] openURL方法就可以了,但是在iOS

10已经被废弃了,因为使用这种方式,处理的结果我们不能拦截到也不能获取到,对于开发是非常不利的,在iOS 10全新的推出了[UIApplication sharedApplication] openURL:nil options:nil

completionHandler:^(BOOL success);有一个成功的回调block可以进行监视。

4.安全和保密性

使用改进后的SecKey API而不是过时的CDSA API。

安全传输API中不再支持SSLv3,建议你们尽快停用SHA1和3DES加密算法。

5. widget锁屏界面

现在锁屏界面有了新的设计,建议我们废弃以前的notificationCenterVibrancyEffect改用widgetPrimaryVibrancyEffect或者widgetSecondaryVibrancyEffect,并且窗口的小部件可以让你描述有多少东西可用,支持紧凑和扩展两种形态。

6. AVFoundation不改也可以用

AVCaptureStillImageOutput废弃了,用AVCapturePhotoOutput替换.

7. IOS版本检查

下面的写法会返回NO

#define IsIOS7 ([[[[UIDevice currentDevice]systemVersion] substringToIndex:1] intValue]>=7)

因为substringToIndex:1 in SDK 'iOS 10.0'(Xcode 8) means SDK 'iOS 1.0'

8.废弃的API(不改也可以用)

CloudKit中废弃的

CKDiscoverAllContactsOperation

CKDiscoveredUserInfo

CKDiscoverUserInfosOperation

CKFetchRecordChangesOperation

CKSubscription中废弃的

initWithRecordType:predicate:options:

initWithRecordType:predicate:subscriptionID:options:

initWithZoneID:options:

initWithZoneID:subscriptionID:options:

zoneID

recordType

predicate

subscriptionOptions

CKSubscriptionOptions

initWithCoder:

NSPersistentStoreCoordinator中废弃的

removeUbiquitousContentAndPersistentStoreAtURL:options:error:

lock

tryLock

unlock

metadataForPersistentStoreWithURL:error:

setMetadata:forPersistentStoreOfType:URL:error:

metadataForPersistentStoreOfType:URL:error:

NSPersistentStoreUbiquitousTransitionType

NSPersistentStoreDidImportUbiquitousContentChangesNotification

setStoresFastSyncDetailsAtURL:forPersistentStore:

syncWithClient:inBackground:handler:error:

UIViewController中废弃的

ADBannerView

ADInterstitialAd

SKUniform中废弃的

uniformWithName:floatVector2:

uniformWithName:floatVector3:

uniformWithName:floatVector4:

uniformWithName:floatMatrix2:

uniformWithName:floatMatrix3:

uniformWithName:floatMatrix4:

initWithName:floatVector2:

initWithName:floatVector3:

initWithName:floatVector4:

initWithName:floatMatrix2:

initWithName:floatMatrix3:

initWithName:floatMatrix4:

floatVector2Value

floatVector3Value

floatVector4Value

floatMatrix2Value

floatMatrix3Value

floatMatrix4Value

UIKit中废弃的

UILocalNotification

UIMutableUserNotificationAction

UIMutableUserNotificationCategory

UIUserNotificationAction

UIUserNotificationCategory

UIUserNotificationSettings

WatchKit中废弃的

handleActionWithIdentifier:forLocalNotification:

handleActionWithIdentifier:forRemoteNotification:

didReceiveLocalNotification:withCompletion:

didReceiveRemoteNotification:withCompletion:

WKExtensionDelegate

didReceiveRemoteNotification:

handleActionWithIdentifier:forRemoteNotification:


9.屏蔽杂乱无章的bug

更新Xcode8之后,新建立工程,都会打印一堆莫名其妙看不懂的Log.

屏蔽的方法如下:

Xcode8里边 Edit Scheme-> Run -> Arguments, 在Environment Variables里边添加

OS_ACTIVITY_MODE = Disable


10.代码注释不能用的解决办法

这个是因为苹果解决xcode ghost,把插件屏蔽了。

解决方法

打开终端,命令运行: sudo /usr/libexec/xpccachectl

然后必须重启电脑后生效

注意:Xcode8内置了开启注释的功能,位置在这里




1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 甲方不退保证金怎么办 押金不给退怎么办 在夏门办加急居住证怎么办 学车证明丢失怎么办? 哈尔滨空挂户口怎么办 厦大学生怎么办厦门居住证 厦门网上办理居住证怎么办 宝宝风热咳嗽怎么办 小孩感冒后鼻炎怎么办 小孩感冒引起鼻炎怎么办 婴幼儿喉咙有痰怎么办 驾校的居住证明怎么办 去韩国留学护照怎么办 去韩国签证怎么办d4 出国留学拒签怎么办 高中毕业考不上大学怎么办 深圳怎么办客运营运证 深圳龙岗怎么办居住证 想去日本怎么办签证 孩子没有出生证怎么办通行证 去日本旅游怎么办签证 去美国旅游签证怎么办 我想去泰国怎么办签证 怎么办去泰国的签证 去韩国工作怎么办签证 去越南打工怎么办签证 越南到中国签证怎么办 去越南工作签证怎么办 马来西亚留学签证过期后怎么办 日本留学存款不够怎么办 没有工作单位怎么办签证 深户日本签证怎么办 土耳其跟团签证怎么办 公司取消交通车职工怎么办 出国健康证丢失怎么办 大三阳怎么办健康证 办不了健康证怎么办 办健康证不合格怎么办 美团健康证怎么办 便检取样很多怎么办 拉不出大便怎么办马上解决方法