iOS開發(fā)3DTouch導(dǎo)致Crush

原因推測

最近公司項目加入 3D touch 功能上線后, 有用戶反映他們的機器在點擊程序 icon 的時候就直接閃退了, 找了個問題機測試了一下發(fā)現(xiàn)是 3D touch 導(dǎo)致的崩潰. 正規(guī)渠道購買的機器都沒有閃退問題, 某些港版, 日版, 美版機器會出問題, 所以推測是那些機器在購買之前經(jīng)過越獄或是什么原因, 修改了底層 3D touch 某些屬性, 導(dǎo)致本不支持 3D touch 的問題機誤以為自己支持該功能導(dǎo)致崩潰.

  • 只是推測, 老鳥歡迎指正

初步方案

shortCutItem

由于沒有那么多問題機測試, 只有兩臺, 只能算一個參考方案吧, 反正這兩臺機器是沒問題了.
方案: 限制機型, 只允許 6S 和 9.0以上系統(tǒng)走 3D Touch 方法.
代碼:
在AppDelegate.m中
首先導(dǎo)入頭文件#import "sys/utsname.h"
pch 文件中定義系統(tǒng)版本號#define IOS_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]

// 獲取機型設(shè)備號
struct utsname systemInfo;
    uname(&systemInfo);
    NSString *deviceString = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    
    // 如果系統(tǒng)版本大于9.0
    if (IOS_VERSION >= 9.0) {
        
        // 如果設(shè)備號是 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文件中同樣導(dǎo)入#import "sys/utsname.h"
在設(shè)置traitCollection的方法中同樣用上面的判斷

- (void)viewWillAppear:(BOOL)animated {
    
    [super viewWillAppear:animated];
    
    // 獲取設(shè)備型號
    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];
            }
        }
    }
}

如果要預(yù)覽的 webView 打開了allowsLinkPreview
同樣需要重復(fù)導(dǎo)入上面的頭文件

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 崩潰問題解決


設(shè)備型號(不完全版)

- (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

這個方案還不是很確定, 如果我說的有問題, 歡迎來糾錯, 謝謝
補充一下, 不管上一頁有沒有設(shè)置preView, 只要下一頁的webView打開了allowsLinkPreview屬性, 也會導(dǎo)致問題機型的崩潰

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,169評論 25 708
  • 記得以前看《新戀愛時代》時,很喜歡鄭海潮在劇中說的一段話: " 如果一個人說喜歡你,請等到他對你百般照顧時再相信;...
    虹姐有話說閱讀 1,352評論 0 4
  • 11.4 我開始懷念17歲里陽光的香味,裹著干凈的散發(fā)著洗衣液味道校服的笑臉,比如今的我要真誠燦爛許多。
    詩酒年華閱讀 236評論 0 1
  • 文:miya | 圖:caipang 這世上,最不能直視的東西有兩樣 太陽和人心 講真,若非工作所需 恐怕到現(xiàn)在你...
    海韻夢都閱讀 312評論 0 0

友情鏈接更多精彩內(nèi)容