原因推測
最近公司項目加入 3D touch 功能上線后, 有用戶反映他們的機器在點擊程序 icon 的時候就直接閃退了, 找了個問題機測試了一下發(fā)現(xiàn)是 3D touch 導致的崩潰. 正規(guī)渠道購買的機器都沒有閃退問題, 某些港版, 日版, 美版機器會出問題, 所以推測是那些機器在購買之前經(jīng)過越獄或是什么原因, 修改了底層 3D touch 某些屬性, 導致本不支持 3D touch 的問題機誤以為自己支持該功能導致崩潰.
- 只是推測, 老鳥歡迎指正
初步方案
shortCutItem
由于沒有那么多問題機測試, 只有兩臺, 只能算一個參考方案吧, 反正這兩臺機器是沒問題了.
方案: 限制機型, 只允許 6S 和 9.0以上系統(tǒng)走 3D Touch 方法.
代碼:
在AppDelegate.m中
首先導入頭文件#import "sys/utsname.h"
pch 文件中定義系統(tǒng)版本號#define IOS_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]
// 獲取機型設備號
struct utsname systemInfo;
uname(&systemInfo);
NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
// 如果系統(tǒng)版本大于9.0
if (IOS_VERSION >= 9.0) {
// 如果設備號是 6S 或者 6S PLUS
if ([deviceString isEqualToString:@"iPhone8,1"] || [deviceString isEqualToString:@"iPhone8,2"]) {
// 創(chuàng)建 shortCutItem 的方法
[self createItemsWithIcons];
if (launchOptions[@"UIApplicationLaunchOptionsShortcutItemKey"] == nil) {
return YES;
} else {
return NO;
}
}
}
至此, 打開就閃退的問題在這兩臺機器上解決了
Preview
在支持 3d touch的視圖控制器.m文件中同樣導入#import "sys/utsname.h"
在設置traitCollection
的方法中同樣用上面的判斷
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
// 獲取設備型號
struct utsname systemInfo;
uname(&systemInfo);
NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
// 判斷系統(tǒng)型號
if (IOS_VERSION >= 9.0) {
if ([deviceString isEqualToString:@"iPhone8,1"] || [deviceString isEqualToString:@"iPhone8,2"]) {
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
[self registerForPreviewingWithDelegate:self sourceView:self.levelCollectionView];
}
}
}
}
如果要預覽的 webView 打開了allowsLinkPreview
同樣需要重復導入上面的頭文件
struct utsname systemInfo;
uname(&systemInfo);
NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
if ([deviceString isEqualToString:@"iPhone8,1"] || [deviceString isEqualToString:@"iPhone8,2"]) {
self.webView.allowsLinkPreview = YES;
}
至此, 這兩臺問題機器的 3D Touch 崩潰問題解決
設備型號(不完全版)
- (NSString*)deviceVersion {
struct utsname systemInfo;
uname(&systemInfo);
NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
NSLog(@"%@",deviceString);
if ([deviceString isEqualToString:@"iPhone1,1"]) return @"iPhone 1G";
if ([deviceString isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
if ([deviceString isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS";
if ([deviceString isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
if ([deviceString isEqualToString:@"iPhone3,2"]) return @"Verizon iPhone 4";
if ([deviceString isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
if ([deviceString isEqualToString:@"iPhone5,2"]) return @"iPhone 5";
if ([deviceString isEqualToString:@"iPhone6,2"]) return @"iPhone 5S";
if ([deviceString isEqualToString:@"iPhone7,2"]) return @"iPhone 6";
if ([deviceString isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus";
if ([deviceString isEqualToString:@"iPhone8,1"]) return @"iPhone 6s";
if ([deviceString isEqualToString:@"iPhone8,2"]) return @"iPhone 6s Plus";
if ([deviceString isEqualToString:@"iPod1,1"]) return @"iPod Touch 1G";
if ([deviceString isEqualToString:@"iPod2,1"]) return @"iPod Touch 2G";
if ([deviceString isEqualToString:@"iPod3,1"]) return @"iPod Touch 3G";
if ([deviceString isEqualToString:@"iPod4,1"]) return @"iPod Touch 4G";
if ([deviceString isEqualToString:@"iPad1,1"]) return @"iPad";
if ([deviceString isEqualToString:@"iPad2,1"]) return @"iPad 2 (WiFi)";
if ([deviceString isEqualToString:@"iPad2,2"]) return @"iPad 2 (GSM)";
if ([deviceString isEqualToString:@"iPad2,3"]) return @"iPad 2 (CDMA)";
if ([deviceString isEqualToString:@"iPad3,4"]) return @"iPad 4 (WiFi)";
if ([deviceString isEqualToString:@"i386"]) return @"Simulator";
if ([deviceString isEqualToString:@"x86_64"]) return @"Simulator";
return deviceString;
}
-
iPhone 7,2
是6,7,1
是6Plus
這個方案還不是很確定, 如果我說的有問題, 歡迎來糾錯, 謝謝
補充一下, 不管上一頁有沒有設置preView, 只要下一頁的webView打開了allowsLinkPreview
屬性, 也會導致問題機型的崩潰