Xcode 8 iOS Simulator正常启动打印一堆log:
2016-09-18 01:29:58.361152 rrr[5309:313188] subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-09-18 01:29:58.362535 rrr[5309:313188] subsystem: com.apple.UIKit, category: HIDEventIncoming, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-09-18 01:29:58.397011 rrr[5309:313184] subsystem: com.apple.BaseBoard, category: MachPort, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0
2016-09-18 01:29:58.460411 rrr[5309:313100] subsystem: com.apple.UIKit, category: StatusBar, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0
2016-09-18 01:29:58.523324 rrr[5309:313100] subsystem: com.apple.BackBoardServices.fence, category: App, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0
Message from debugger: Terminated due to signal 9
关闭log:
在Edit scheme —> Run —>Arguments —> Environment Variables中添加 OS_ACTIVITY_MODE = disable
Xcode 8解决真机测试Log被屏蔽的问题
上面办法解决了在iOS 10模拟器上是正常的,可是在iOS 10真机测试所有的Log日志全部被屏蔽了!大家误以为是之前的设置导致这种问题的出现,其实不然。这个问题应该是iOS 10开始为了在真机上提高性能,所以把Log日志给屏蔽了。
对我们来说真机测试也是离不开Log日志的,那我们就来解决这个问题。首先我们最初自定义的Log日志是这样的:
#ifdef DEBUG
#define LRString [NSString stringWithFormat:@"%s", __FILE__].lastPathComponent
#define LRLog(...) NSLog(@"%@ 第%d行 \n %@\n\n",LRString,__LINE__,[NSString stringWithFormat:__VA_ARGS__])
#else
#define LRLog(...)
#endif
系统的NSLog()已经不好使了,这个只能在iOS 9之前的系统管用,如果想要在iOS 10系统的手机也能打印日志,我们需要用到printf()如下:
#ifdef DEBUG
#define LRString [NSString stringWithFormat:@"%s", __FILE__].lastPathComponent
#define LRLog(...) printf("%s: %s 第%d行: %s\n\n",[[NSString lr_stringDate] UTF8String], [LRString UTF8String] ,__LINE__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String]);
#else
#define LRLog(...)
#endif
1.[[NSString lr_stringDate] UTF8String]是打印的时间,如果不喜欢打印这个时间可以去掉:
+ (NSString *)lr_stringDate {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY-MM-dd hh:mm:ss"];
NSString *dateString = [dateFormatter stringFromDate:[NSDate date]];
return dateString;
}
2.使用UTF8String
的原因就是printf
是C
语言的,所以需要通过这个方法转换一下才能打印。
Xcode8可以支持swift2.3和swift3(默认)语法,
把Use Legacy Swift Language Version 设置为YES
然后在Edit-->Convert-->to current swift syntax可以修改
ATS
WWDC 15 提出的 ATS (App Transport Security) 是 Apple 在推进网络通讯安全的一个重要方式。在 iOS 9 和 OS X 10.11 中,默认情况下非 HTTPS 的网络访问是被禁止的。当然,因为这样的推进影响面非常广,作为缓冲,我们可以在 Info.plist 中添加 NSAppTransportSecurity 字典并且将NSAllowsArbitraryLoads 设置为 YES 来禁用 ATS。
不过,WWDC 16 中,Apple 表示将继续在 iOS 10 和 macOS 10.12 里收紧对普通 HTTP 的访问限制。从 2017 年 1 月 1 日起,所有的新提交 app 默认是不允许使用 NSAllowsArbitraryLoads 来绕过 ATS 限制的,也就是说,我们最好保证 app 的所有网络请求都是 HTTPS 加密的,否则可能会在应用审核时遇到麻烦。
以下代码是NSAppTransportSecurity字典的结构模型。该模型列举了所有可能的键值对,这些键值对都是非必须的。您可以根据这个结构中所示的键值对的信息来编辑Info.plist中的NSAppTransportSecurity字典。
NSAppTransportSecurity : Dictionary {
NSAllowsArbitraryLoads : Boolean
NSAllowsArbitraryLoadsInMedia : Boolean
NSAllowsArbitraryLoadsInWebContent : Boolean
NSAllowsLocalNetworking : Boolean
NSExceptionDomains : Dictionary {
<domain-name-string> : Dictionary {
NSIncludesSubdomains : Boolean
NSExceptionAllowsInsecureHTTPLoads : Boolean
NSExceptionMinimumTLSVersion : String
NSExceptionRequiresForwardSecrecy : Boolean // Default value is YES
NSRequiresCertificateTransparency : Boolean
}
}
}
iOS 10 中新加入了的键:
- NSAllowsArbitraryLoadsInMedia
- NSAllowsArbitraryLoadsInWebContent
- NSAllowsLocalNetworking
| (none) | Boolean | An optional Boolean value that, when set to Employ this key only for loading media that are already encrypted, such as files protected by FairPlay or by secure HLS, and that do not contain personalized information. If you add this key to your Default value is Available starting in iOS 10.0 and macOS 10.12. |
| (none) | Boolean | An optional Boolean value that applies only to content to be loaded into an instance of the following classes: Set this key’s value to Default value is To support older versions of iOS and macOS, you can employ this key and still manually configure ATS. To do so, set this key’s value to If you add this key to your Available starting in iOS 10.0 and macOS 10.12. |
| (none) | Boolean | An optional Boolean value that, when set to If you set this key’s value to Default value is Available starting in iOS 10.0 and macOS 10.12. |
更严格的隐私权限
在iOS10访问麦克风时crash,log:
This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSMicrophoneUsageDescription key with a string value explaining to the user how the app uses this data.
这个应用程序崩溃了,因为它试图访问隐私敏感的数据,而没有使用描述。应用程序的Info.plist必须包含一个字符串值,解释如何使用这些数据的应用程序的用户NSMicrophoneUsageDescription关键。
iOS10对用户的安全和隐私的增强,在申请私有权限的时候都需要添加描述,iOS10以前使用系统的权限通知框.
但iOS10需要在info.plist添加相应的key, value自己随意填写就可以,例如:
麦克风权限: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 我们需要通过您的地理位置信息获取您周边的相关数据
其实crash的时候看log就知道需要添加哪个key了。
xcode7.3.1 远程推送通知 编译支持iOS10 (兼容ios78910)
iOS10中处理:
//在iOS10中kill app,点通知进入app,发现- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);
不走了,又走didFinishLaunchingWithOptions了
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if ([super application:application didFinishLaunchingWithOptions:launchOptions]) {
......
if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){10, 0, 0}]) {
NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
.....
}
......
return YES;
}
return NO;
}
//在iOS10中,app在后台,点击通知进入app,发现- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);不走了,又走原来的方法了
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
......
if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){10, 0, 0}]) {
........
}else {
.......
}
}
......
}
这也是临时解决的,尽快升级吧
iOS10 推送通知整理 http://justsee.iteye.com/blog/2326605
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIDeviceRGBColor countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x608000877e00'
*** First throw call stack:
(
……
16 UIKit 0x000000010de20300 -[UINib instantiateWithOwner:options:] + 1249
17 UIKit 0x000000010dbb3ff5 -[UIViewController _loadViewFromNibNamed:bundle:] + 386
18 UIKit 0x000000010dbb4917 -[UIViewController loadView] + 177
19 UIKit 0x000000010dbb4c4c -[UIViewController loadViewIfRequired] + 201
20 UIKit 0x000000010dbb54a0 -[UIViewController view] + 27
22 Demo 0x000000010986b8dc -[XxxxxViewController initWithNibName:bundle:] + 108
……….
)
libc++abi.dylib: terminating with uncaught exception of type NSException
用xcode8 run 老项目运行到- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 就crash了,错误如上。
在老xcode上显示:
在xcode8上显示:
需要把Build for更新为"iOS 7.0 and Later"或更高。
Xcode8打开xib
使用Xcode8打开xib文件后,会出现下图的提示:
大家选择Choose Device即可。 之后大家会发现布局啊,frame乱了,只需要更新一下frame即可。
注意:如果按上面的步骤操作后,在用Xcode7打开Xib会报一下错误,
解决办法:需要删除Xib里面
<code>
<capability name="documents saved in the Xcode 8 format" mintoolsversion="8.0"/>
</code>
这句话,以及把中的toolsVersion和中的version改成你正常的xib文件中的值
UIColor提高了对扩展像素和宽色域色彩空间的支持
官方文档中说:大多数core开头的图形框架和AVFoundation都提高了对扩展像素和宽色域色彩空间的支持.通过图形堆栈扩展这种方式比以往支持广色域的显示设备更加容易。现在对UIKit扩展可以在sRGB的色彩空间下工作,性能更好,也可以在更广泛的色域来搭配sRGB颜色.如果你的项目中是通过低级别的api自己实现图形处理的,建议使用sRGB,也就是说在项目中使用了RGB转化颜色的建议转换为使用sRGB,在UIColor类中新增了两个api:
- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
+ (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
真彩色的显示
真彩色的显示会根据光感应器来自动的调节达到特定环境下显示与性能的平衡效果,如果需要这个功能的话,可以在info.plist里配置(在Source Code模式下):
<key>UIWhitePointAdaptivityStyle</key>
它有五种取值,分别是:
<string>UIWhitePointAdaptivityStyleStandard</string> // 标准模式 <string>UIWhitePointAdaptivityStyleReading</string> // 阅读模式 <string>UIWhitePointAdaptivityStylePhoto</string> // 图片模式 <string>UIWhitePointAdaptivityStyleVideo</string> // 视频模式 <string>UIWhitePointAdaptivityStyleStandard</string> // 游戏模式
也就是说如果你的项目是阅读类的,就选择UIWhitePointAdaptivityStyleReading这个模式,五种模式的显示效果是从上往下递减,也就是说如果你的项目是图片处理类的,你选择的是阅读模式,给选择太好的效果会影响性能.
UIScrollView新增refreshControl:UIRefreshControl的使用
在iOS 10 中, UIRefreshControl可以直接在UICollectionView和UITableView中使用,并且脱离了UITableViewController.现在RefreshControl是UIScrollView的一个属性. 使用方法:
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(loadData) forControlEvents:UIControlEventValueChanged];
collectionView.refreshControl = refreshControl;
UITextField新属性textContentType
在iOS 10 中,UITextField新增了textContentType字段,是UITextContentType类型,它是一个枚举,作用是可以指定输入框的类型,以便系统可以分析出用户的语义.是电话类型就建议一些电话,是地址类型就建议一些地址.
字体随着手机系统字体而改变
当我们手机系统字体改变了之后,那我们App的label也会跟着一起变化,这需要我们写很多代码来进一步处理才能实现,但是iOS 10 提供了这样的属性adjustsFontForContentSizeCategory来设置。
/*
UIFont 的preferredFontForTextStyle: 意思是指定一个样式,并让字体大小符合用户设定的字体大小。
*/
myLabel.font =[UIFont preferredFontForTextStyle: UIFontTextStyleHeadline];
/*
Indicates whether the corresponding element should automatically update its font when the device’s UIContentSizeCategory is changed.
For this property to take effect, the element’s font must be a font vended using +preferredFontForTextStyle: or +preferredFontForTextStyle:compatibleWithTraitCollection: with a valid UIFontTextStyle.
*/
//是否更新字体的变化
myLabel.adjustsFontForContentSizeCategory = YES;
UIViewPropertyAnimator属性动画器
那么在iOS 10之前,我们使用UIView 做动画效果或者自定义一些layer 的动画,如果开始了,一般无法进行停止操作更不能暂停操作,而且一些非常复杂的动画处理也比较麻烦,但是在iOS10,苹果退出了一个全新的API UIViewPropertyAnimator,可供我们处理动画操作UIViewPropertyAnimator 是 iOS 10 中新增的一个执行 View 动画的类,具有以下特点: 可中断性 ,可擦除 ,可反转性, 丰富的动画时间控制功能
demo:
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,strong)UIView *myView;
@property(nonatomic,strong)UIViewPropertyAnimator *myViewPro;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建一个View对象
UIView *Views =[[UIView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
Views.backgroundColor =[UIColor yellowColor]; [self.view addSubview:Views];
//2.创建一个外部的变量进行引用
self.myView = Views;
//3.创建一个view 动画器
UIViewPropertyAnimator *viewPro =[UIViewPropertyAnimator runningPropertyAnimatorWithDuration:1.0 delay:30.0 options:UIViewAnimationOptionCurveLinear animations:^{
//使用View动画器修改View的frame
self.myView.frame = CGRectMake(230, 230, 130, 130); } completion:nil];
self.myViewPro = viewPro;
}
//结束
- (IBAction)stop:(id)sender{
// YES 和NO 适用于设置当前这个属性动画器是否可以继续使用 [self.myViewPro stopAnimation:YES];
}
//继续
- (IBAction)continued:(id)sender {
//UITimingCurveProvider /**
@property(nullable, nonatomic, readonly) UICubicTimingParameters *cubicTimingParameters; @property(nullable, nonatomic, readonly) UISpringTimingParameters *springTimingParameters; **/
//设置弹簧效果 DampingRatio取值范围是 0-1
//这个取值 决定弹簧抖动效果 的大小 ,越往 0 靠近那么就越明显
UISpringTimingParameters *sp =[[UISpringTimingParameters alloc] initWithDampingRatio:0.01];
//设置一个动画的效果//
UICubicTimingParameters *cub =[[UICubicTimingParameters alloc] initWithAnimationCurve:UIViewAnimationCurveEaseInOut];
//durationFactor 给一个默认值 1就可以
[self.myViewPro continueAnimationWithTimingParameters:sp durationFactor:1.0];
}
//暂停
- (IBAction)puase:(id)sender {
[self.myViewPro pauseAnimation];
}
//开始
- (IBAction)start:(id)sender {
[self.myViewPro startAnimation];
}
UIApplication对象中openUrl被废弃
在iOS 10.0以前的年代,我们要想使用应用程序去打开一个网页或者进行跳转,直接使用[[UIApplication sharedApplication] openURL 方法就可以了,但是在iOS 10 已经被废弃了,因为使用这种方式,处理的结果我们不能拦截到也不能获取到,对于开发是非常不利的,在iOS 10全新的退出了 。
[[UIApplication sharedApplication] openURL:nil options:nilcompletionHandler: nil];有一个成功的回调block 可以进行监视。
[[UIApplication sharedApplication] openURL:nil options:nil completionHandler:^(BOOL success) {
}];
项目迁移Swift 3后, 如果一个目标(Target)需要支持 Swift 2.3, 需要在目标(Target)的编译设置里把Use Legacy Swift Language Version 设置成Yes。
- target的Build Setting的Use Legacy Swift Language Version选项的作用是设置当前target对应的文件是采用Swift2.3的语法编译还是Swift3.0的语法编译。当选择为Yes时,采用Swift2.3的语法编译;当选择是No时,采用Swift3.0的语法编译。
- 新建的项目中,编译设置的原则为:所有的第三方中只要有一个第三方使用了Swift2.3的语法,那么所有的target的编译设置都应为Yes。如果都支持Swift3.0的语法,那么就可以设置为No。并且不能选择
http://www.jianshu.com/p/cbd650c9daad
Speech Framework是SDK10新增framework
Speech Framework 是Apple公司在2016年WWDC上介绍的一个语音识别的API。它是Siri用来做语音识别的框架。在你的应用里面可以使用 Speech APIs 来拓展和提高语音识别功能,而不仅仅是单纯的使用键盘。
Xcode8兼容iOS7以及低版本
我们使用Xcode8新建的工程,默认支持的最低系统是iOS8,我们可以手动更改版本到7.0,但是不支持真机调试。
我们在升级Xcode8之前,可以先将调试需要的配置文件拷贝出来,方法finder中前往文件夹/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport进入,将里面如下图所示的文件夹拷贝出来,如果已经升级了Xcode8,里面就没有这些配置,可以这里下载:https://pan.baidu.com/s/1i5j0M1Z
升级到Xcode8之后,将之前拷贝出来的文件放入之前的文件夹中,在finder中前往文件夹到/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport,之后我们需要配置一下Xcode,同样的在finder中前往文件夹,打开以下路径/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk ,用Xcode打开SDKSettings.plist这个文件,加入如下图所示的配置,保存之后重启Xcode8,之后在工程的Deployment Target里面就可以选择7.0了。(如果SDKSettings.plist这个文件提示无法修改的话,可以先讲这个文件拷贝一份到桌面,修改后再覆盖进去即可。)
参考:http://www.jianshu.com/p/d22c19812d43
CAAnimationDelegate在SDK10中由category变成了协议,所以需要适配兼容:
#if defined(__IPHONE_10_0) && (__IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0)
@interface ViewController () <CALayerDelegate>
#else
@interface ViewController ()
#endif
@end