你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS 10適配以及Xcode8兼容問題總結

iOS 10適配以及Xcode8兼容問題總結

編輯:IOS開發綜合

代碼注釋不能用的解決辦法

這個是因為蘋果解決xcode ghost,把插件屏蔽了。

解決方法

打開終端,命令運行: sudo /usr/libexec/xpccachectl

然後必須重啟電腦後生效

注意:Xcode8內置了開啟注釋的功能,位置在這裡

屏蔽雜亂無章的bug

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

如這些

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,

屏蔽的方法如下:

Xcode8裡邊 Edit Scheme-> Run -> Arguments, 在Environment Variables裡邊添加字典:

(name)OS_ACTIVITY_MODE = (value:)Disable

 

這裡寫圖片描述

 

在設置log選項的時候,發現可以通過在Arguments中設置參數,打印出App加載的時長,包括整體加載時長,動態庫加載時長等。

在Environment Variables中添加DYLD_PRINT_STATISTICS字段,並設置為YES,在控制台就會打印加載時長。

考慮到添加上述內容在Xcode8後,真機調試可能出現異常,大家可以自定義一個宏定義,來做日志輸出。

#ifdef DEBUG

#define DDLOG(…) printf(” %s\n”,[[NSString stringWithFormat:VA_ARGS]UTF8String]);

#define DDLOG_CURRENT_METHOD NSLog(@”%@-%@”, NSStringFromClass([self class]), NSStringFromSelector(_cmd))

#else

#define DDLOG(…) ;

#define DDLOG_CURRENT_METHOD ;

#endif

字體適配的問題

ios 9 之前的lab 字體可以顯示全,但是到了ios10 發覺字體顯示不全了.得適配啊.app 會跟隨手機系統字體大小而改變了.

簡單粗暴地方法就是不讓他跟著手機系統的字體改變而改變.

myLabel.font =[UIFont preferredFontForTextStyle: UIFontTextStyleHeadline];

// UIFont 的preferredFontForTextStyle: 意思是指定一個樣式,並讓字體大小符合用戶設定的字體大小。

/*

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.

*/

//是否更新字體的變化

label.adjustsFontForContentSizeCategory = YES;

字體變大,原有frame需要適配

發現程序內Label標簽原來2個字的寬度是24,現在2個字需要27的寬度來顯示了。。

iOS 10 開始的通知

1.所有相關通知被統一到了UserNotifications.framework框架中。

2.增加了撤銷、更新、中途還可以修改通知的內容。

3.通知不在是簡單的文本了,可以加入視頻、圖片,自定義通知的展示等等。

4.iOS 10相對之前的通知來說更加好用易於管理,並且進行了大規模優化,對於開發者來說是一件好事。

5.iOS 10開始對於權限問題進行了優化,申請權限就比較簡單了(本地與遠程通知集成在一個方法中)。

所有的推送平台,不管是極光還是什麼的,要想收到推送,這個是必須打開的

 

這裡寫圖片描述

 

(void)userNotificationCenter:(UNUserNotificationCenter )center willPresentNotification:(UNNotification )notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {

//應用在前台收到通知 NSLog(@”========%@”, notification);

}

推送的代理iOS10收到通知不再是在[application: didReceiveRemoteNotification:]方法去處理, iOS10推出新的代理方法,接收和處理各類通知(本地或者遠程)

(void)userNotificationCenter:(UNUserNotificationCenter )center didReceiveNotificationResponse:(UNNotificationResponse )response withCompletionHandler:(void (^)())completionHandler {

//點擊通知進入應用 NSLog(@”response:%@”, response);

}

xcode8的注釋快捷鍵注釋不能用了, command+/ 不行了

解決辦法:

因為蘋果解決xcode ghost。把插件屏蔽了。解決方法

命令運行: sudo /usr/libexec/xpccachectl

然後必須重啟電腦後生效

 

這裡寫圖片描述

 

顏色問題, iOS 10 蘋果官方建議我們使用sRGB,因為它性能更好,色彩更豐富。

UIColor類中新增了兩個Api如下:

+ (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);

判斷版本問題

判斷系統版本是我們經常用到的,尤其是現在大家都有可能需要適配iOS 10,那麼問題就出現了,如下圖:

我們得到了答案是:

//值為 1

[[[[UIDevice currentDevice] systemVersion] substringToIndex:1] integerValue]

//值為10.000000

[[UIDevice currentDevice] systemVersion].floatValue,

//值為10.0

[[UIDevice currentDevice] systemVersion]

所以說判斷系統方法最好還是用後面的兩種方法,哦~我忘記說了[[UIDevice currentDevice] systemVersion].floatValue這個方法也是不靠譜的,好像在8.3版本輸出的值是8.2,記不清楚了反正是不靠譜的,所以建議大家用[[UIDevice currentDevice] systemVersion]這個方法!

Swift判斷如下:

if #available(iOS 10.0, *) {

print(“iOS 10.0”); // iOS 10.0啊

} else{ };

https的問題

iOS 9中默認非HTTS的網絡是被禁止的,當然我們也可以把NSAllowsArbitraryLoads設置為YES禁用ATS。不過iOS 10從2017年1月1日起蘋果不允許我們通過這個方法跳過ATS,也就是說強制我們用HTTPS,如果不這樣的話提交App可能會被拒絕。但是我們可以通過NSExceptionDomains來針對特定的域名開放HTTP可以容易通過審核。

隱私權限

iOS 10 開始對隱私權限更加嚴格,如果你不設置就會直接崩潰,現在很多遇到崩潰問題了,一般解決辦法都是在info.plist文件添加對應的Key-Value就可以了。

 

這裡寫圖片描述

 

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需要您的同意,才能訪問媒體資料庫

權限以及相關設置

iOS10調用相冊會Crash下面信息:

This app has crashed because it attempted to access privacy-sensitive data without a usage description.

The app’s Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

大體意思就是這個App缺少一個獲取私有(敏感)數據的權限描述,需要我們在info.plist文件中必須含有一個名字叫做NSPhotoLibraryUsageDescription的值來解釋為什麼應用需要使用這個數據,沒錯,獲取相冊資源的鍵值就是NSPhotoLibraryUsageDescription

去plist文件中添加了下面的鍵值:

 

這裡寫圖片描述

 

再點擊獲取圖片資源,就彈出了一個獲取權限的問候,不會發生崩潰了:

 

這裡寫圖片描述

 

Privacy - Microphone Usage Description //麥克風權限

Privacy - Contacts Usage Description //通訊錄權限

Privacy - Camera Usage Description //攝像頭權限

Privacy - NSSiriUsageDescription //Siri的權限

Privacy - Bluetooth Peripheral Usage Description //藍牙

Privacy - Reminders Usage Description //提醒事項

Privacy - Motion Usage Description //運動與健康

Privacy - Media Libaray Usage Description //媒體資源庫

Privacy - Calendars Usage Description //日歷

xib設定好固定尺寸在代碼中獲取控件尺寸都變成(0,0,1000,1000)

UIView中要從- (void)updateConstraints或者- (void)drawRect:(CGRect)rect獲取控件尺寸。

(void)updateConstraints

{

[super updateConstraints];

}

(void)drawRect:(CGRect)rect

{

[super drawRect:rect];

}

UIViewController中要從- (void)viewDidLayoutSubviews獲取控件尺寸。

(void)viewDidLayoutSubviews

{

[super viewDidLayoutSubviews];

}

Xcode 8使用Xib awakeFromNib的警告問題

在Xcode 8之前我們使用Xib初始化- (void)awakeFromNib {}都是這麼寫也沒什麼問題,但是在Xcode 8會有如下警告:

 

這裡寫圖片描述

 

如果不喜歡這個警告的話,應該明確的加上[super awakeFromNib];我們來看看官方說明:

隱藏狀態欄的功能壞掉:

升級到 iOS 10.0後,在查看全屏圖片的時候,需要在 Present 之前給要 present 的 view controller 設置 modalPresentationCapturesStatusBarAppearance = true。然後就好啦

TestViewController *testVC = [[TestViewController alloc] init];

testVC.modalPresentationCapturesStatusBarAppearance = true;

[self presentViewController:testVC animated:YES completion:nil];

//iOS 10 狀態欄的設置

- (UIStatusBarStyle)preferredStatusBarStyle {

return UIStatusBarStyleDefault;

}

************iOS 10 UITextContentType

// The textContentType property is to provide the keyboard with extra information about the semantic intent of the text document.

@property(nonatomic,copy) UITextContentType textContentType NS_AVAILABLE_IOS(10_0); // default is nil

在iOS 10 UITextField添加了textContentType枚舉,指示文本輸入區域所期望的語義意義。

使用此屬性可以給鍵盤和系統信息,關於用戶輸入的內容的預期的語義意義。例如,您可以指定一個文本字段,用戶填寫收到一封電子郵件確認 uitextcontenttypeemailaddress。當您提供有關您期望用戶在文本輸入區域中輸入的內容的信息時,系統可以在某些情況下自動選 擇適當的鍵盤,並提高鍵盤修正和主動與其他文本輸入機會的整合。

UIScrollView自帶刷新功能

iOS 10 以後只要是繼承UIScrollView那麼就支持刷新功能:

@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(10_0) __TVOS_PROHIBITED;

ImagePickerController.cameraViewTransform問題

(本條更新於:2016-09-21) 很多人反映自定義相機出現了問題,cameraViewTransform不能用了,其實網上關於這個的資料不是很多,在這裡提供參考辦法如下:

通過監聽AVCaptureSessionDidStartRunningNotification來解決

//#import

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved