[toc]不支持目录跳转,好可恶
1.解决工程中输出无关日志
Edit Scheme -> Run -> Arguments, 在Environment Variables里边添加 OS_ACTIVITY_MODE
disable
遗留问题:
还会出现下面这个问题Class PLBuildVersion is implemented in both
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/AssetsLibraryServices.framework/AssetsLibraryServices (0x112b58910) and /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/PrivateFrameworks/PhotoLibraryServices.framework/PhotoLibraryServices (0x112982210).
One of the two will be used. Which one is undefined.
在模拟器中、发现One of the two will be used. Which one is undefined.
日志
查找资料发现原因:objc runtime
对所用App使用同一个命名空间(flat namespace),运行机制如下:
首先二进制映像被加载,检查程序依赖关系
每一个二进制映像被加载的同时,程序的objc classes
在objc runtime
命名空间中注册
如果具有相同名称的类被再次加载,objc runtime
的行为是不可预知的。一种可能的情况是任意一个程序的该类会被加载(这应该也是默认动作)
2.注释快捷键⌘+/失效
重启电脑,如果还不能使用的话就启用命令工具(命令运行 sudo /usr/libexec/xpccachectl),然后重启电脑
3.对于插件无法使用
网上推荐的是将Xcode拷贝一份可以使用插件的Xcode(在应用程序中),但是这个Xcode不能打包上传等,建议不要使用这种方法
三方插件解决方法(fix method):让你的Xcode8继续使用插件
但是看到文章最后的解释,我们知道如果用插件的话,可能安全上会有问题、并且提交审核会被拒绝,所以建议大家还是不要用了,解决办法总是有的,比如在Xcode中添加注释的代码块也是很方便的。
另外:Xcode 推出来快速文本注释:Command +Option +/
<#Description#> @param frame
<#frame description#> @return
<#return value description#>
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]){
[self initUiConfig];
}
return self;
}
4.iOS10隐私权限问题
OS10中调用相机相册等系统功能时,需要在info.plist文件中添加字段,否则会出现闪退的情况
NSPhotoLibraryUsageDescription
App需要您的同意,才能访问相册
NSCameraUsageDescription
App需要您的同意,才能访问相机
NSMicrophoneUsageDescription
App需要您的同意,才能访问麦克风
NSLocationUsageDescription
App需要您的同意,才能访问位置
NSLocationWhenInUseUsageDescription
App需要您的同意,才能在使用期间访问位置
NSLocationAlwaysUsageDescription
App需要您的同意,才能始终访问位置
NSCalendarsUsageDescription
App需要您的同意,才能访问日历
NSRemindersUsageDescription
App需要您的同意,才能访问提醒事项
NSMotionUsageDescription
App需要您的同意,才能访问运动与健身
NSHealthUpdateUsageDescription
App需要您的同意,才能访问健康更新
NSHealthShareUsageDescription
App需要您的同意,才能访问健康分享
NSBluetoothPeripheralUsageDescription
App需要您的同意,才能访问蓝牙
NSAppleMusicUsageDescription
App需要您的同意,才能访问媒体资料库
5.label中的文字显示变化
Xcode8与Xcode7.3的文字宽度变化(英文字母没有问题,只有汉字有问题)
当我们手机系统字体改变了之后,那我们App的label也会跟着一起变化,这需要我们写很多代码来进一步处理才能实现,但是iOS 10 提供了这样的属性adjustsFontForContentSizeCategory
来设置,
UILabel *myLabel = [UILabel new];
// UIFont 的preferredFontForTextStyle:意思是指定一个样式,并让字体大小符合用户设定的字体大小
myLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
myLabel.adjustsFontForContentSizeCategory = YES; // 是否更新字体的变化
6.Notification(通知)
- 所有相关通知被统一到了UserNotifications.framework框架中
- 增加了撤销、更新、中途还可以修改通知的内容
- 通知不再是简单的文本,现在还可以是图片、视频,自定义通知的展示等等
- iOS10相对之前的通知来说更好用更易于管理,并且进行了大规模优化
- iOS10之后,本地与远程通知集成在一个方法中
而且一般来说,也会开启Remote notifications 的 Background Modes
7.ATS的问题
iOS 9中默认非HTTS的网络是被禁止的,当然我们也可以把NSAllowsArbitraryLoads
设置为YES禁用ATS。不过iOS 10从2017年1月1日起苹果不允许我们通过这个方法跳过ATS,也就是说强制我们用HTTPS,如果不这样的话提交App可能会被拒绝。但是我们可以通过NSExceptionDomains
来针对特定的域名开放HTTP可以容易通过审核。
NSExceptionDomains
方式 设置域。可以简单理解成,把不支持https协议的接口设置成http的接口。
具体方法:
- 在项目的info.plist中添加一个Key:App Transport Security Settings,类型为字典类型。
- 然后给它添加一个Exception Domains,类型为字典类型;
- 把需要的支持的域添加給Exception Domains。其中域作为Key,类型为字典类型。
- 每个域下面需要设置3个属性:
NSIncludesSubdomains
、NSExceptionRequiresForwardSecrecy
、NSExceptionAllowsInsecureHTTPLoads
。
在iOS9以后的系统中如果使用到网络图片,也要注意网络图片是否是HTTP,如果是,也要把图片的域设置!
8.iOS10中UICollectionView性能优化
具体查看WWDC2016 Session笔记 - iOS 10 UICollectionView新特性
9.iOS10 UIColor新增方法
iOS10苹果建议我们使用DisplayP3,因为它性能更好,色彩更丰富。
+ (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
10.iOS10 UIScrollView新增refreshControl
就是说以后只要是继承UIScrollView就支持刷新功能
@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(10_0) __TVOS_PROHIBITED;
- (void)viewDidLoad {
[super viewDidLoad];
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 500)];
scrollView.backgroundColor = [UIColor redColor];
scrollView.contentSize = CGSizeMake(self.view.bounds.size.width, 1000);
[self.view addSubview:scrollView];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"1"]];
[scrollView addSubview:imageView];
// 添加下拉刷新控件
UIRefreshControl *ref = [[UIRefreshControl alloc] init];
// 监听刷新方法
[ref addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
scrollView.refreshControl = ref;
self.view.backgroundColor = [UIColor redColor];
}
- (void)refresh:(UIRefreshControl *)ref {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(22 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 结束刷新
[ref endRefreshing];
});
}
11.iOS10判断系统版本正确姿势
NSLog(@"%zd\n%f\n%@",
[[[[UIDevice currentDevice] systemVersion] substringToIndex:1] integerValue],
//1
[[UIDevice currentDevice] systemVersion].floatValue,
//10.100000
[[UIDevice currentDevice] systemVersion]);
//10.1
所以建议大家用[[UIDevice currentDevice] systemVersion]这个方法!
Swift判断如下:
if #available(iOS 10.0, *) {
// iOS 10.0
print("iOS 10.0");
}
else { }
12.UIStatusBar的问题
在iOS10中,如果还是用以前设置UIStatusBar类型或者控制隐藏还是显示的方法,会报警告,方法过期,如下图:
要想修改UIStatusBar的样式或者状态使用下图中所示的属性或方法:
@property(nonatomic, readonly) UIStatusBarStyle preferredStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarStyleDefault
@property(nonatomic, readonly) BOOL prefersStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to NO
- (UIStatusBarStyle)preferredStatusBarStyle NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarStyleDefault
- (BOOL)prefersStatusBarHidden NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to NO
// Override to return the type of animation that should be used for status bar changes for this view controller. This currently only affects changes to prefersStatusBarHidden.
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED; // Defaults to UIStatusBarAnimationFade
13.UITextField新增字段
在iOS10中,UITextField新增了textContentType
字段,是UITextContentType
类型,它是一个枚举,作用是可以指定输入框的类型,以便系统可以分析出用户的语义,是电话类型就建议一些电话,是地址类型就建议一些地址。可以在#import
文件中,查看textContentType
字段,有以下可以选择的类型:
UIKIT_EXTERN UITextContentType const UITextContentTypeName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeNamePrefix NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeGivenName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeMiddleName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeFamilyName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeNameSuffix NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeNickname NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeJobTitle NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeOrganizationName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeLocation NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeFullStreetAddress NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeStreetAddressLine1 NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeStreetAddressLine2 NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeAddressCity NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeAddressState NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeAddressCityAndState NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeSublocality NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeCountryName NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypePostalCode NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeTelephoneNumber NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeEmailAddress NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeURL NS_AVAILABLE_IOS(10_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeCreditCardNumber NS_AVAILABLE_IOS(10_0);
14.蓝牙相关
CBCentralManagerState废弃,使用CBManagerState替代
CBCentralManager直接继承于CBManager,里面直接声明的属性:
@property(nonatomic, assign, readonly) CBManagerState state;
15.Application openURL的方法被遗弃
使用其替换方法
- (void)openURL:(NSURL*)url options:(NSDictionary *)options completionHandler:(void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS("");