Xcode8以及iOS10问题记录

[toc]不支持目录跳转,好可恶

1.解决工程中输出无关日志

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

Xcode8以及iOS10问题记录_第1张图片
OS_ACTIVITY_MODE
遗留问题:

还会出现下面这个问题

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 classesobjc 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(通知)

  1. 所有相关通知被统一到了UserNotifications.framework框架中
  2. 增加了撤销、更新、中途还可以修改通知的内容
  3. 通知不再是简单的文本,现在还可以是图片、视频,自定义通知的展示等等
  4. iOS10相对之前的通知来说更好用更易于管理,并且进行了大规模优化
  5. iOS10之后,本地与远程通知集成在一个方法中
Xcode8以及iOS10问题记录_第2张图片
不管什么框架,都要开启

而且一般来说,也会开启Remote notifications 的 Background Modes

Xcode8以及iOS10问题记录_第3张图片
Remote notifications

7.ATS的问题

iOS 9中默认非HTTS的网络是被禁止的,当然我们也可以把NSAllowsArbitraryLoads设置为YES禁用ATS。不过iOS 10从2017年1月1日起苹果不允许我们通过这个方法跳过ATS,也就是说强制我们用HTTPS,如果不这样的话提交App可能会被拒绝。但是我们可以通过NSExceptionDomains来针对特定的域名开放HTTP可以容易通过审核。
NSExceptionDomains方式 设置域。可以简单理解成,把不支持https协议的接口设置成http的接口。

具体方法:

  1. 在项目的info.plist中添加一个Key:App Transport Security Settings,类型为字典类型。
  2. 然后给它添加一个Exception Domains,类型为字典类型;
  3. 把需要的支持的域添加給Exception Domains。其中域作为Key,类型为字典类型。
  4. 每个域下面需要设置3个属性:
    NSIncludesSubdomainsNSExceptionRequiresForwardSecrecyNSExceptionAllowsInsecureHTTPLoads
    Xcode8以及iOS10问题记录_第4张图片

在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("");

你可能感兴趣的:(Xcode8以及iOS10问题记录)