2015-11-10 50 views
1

是否可以通過內置觸控板(如新MacBook)或藍牙設備(如Magic Trackpad 2)來確定Mac是否具有Force Touch功能?瞭解Mac是否支持Force Touch

我想介紹如果Mac支持Force Touch功能的特定於Force Touch的首選項,但如果Force Touch不可用,則不顯示(或禁用)這些首選項。

在分隔符後面的部分,您會看到我在鏈接的圖片中記住的選項。 (抱歉,嵌入圖片本身不起作用)。

preferences

所以,沒有表現出偏好不會限制沒有力量觸摸誰,它只是讓誰擁有用戶的用戶將其配置應該如何工作的,這些設置將是無用的用戶誰沒有它。

有沒有辦法做到這一點?

謝謝你,親切的問候, 馬特

編輯:這是在Objective-C。

+0

它是swift還是obj-c? –

+0

我忘了 - objective-c –

回答

0

我想通了:

+ (BOOL)isForceTouchCapable 
{ 
    if (![[self class] isAtLeastElCapitan]) 
     return NO; 

    io_iterator_t iterator; 

    //get default HIDDevice dictionary 
    CFMutableDictionaryRef mDict = IOServiceMatching(kIOHIDDeviceKey); 

    //add manufacturer "Apple Inc." to dict 
    CFDictionaryAddValue(mDict, CFSTR(kIOHIDManufacturerKey), CFSTR("Apple Inc.")); 

    //get matching services, depending on dict 
    IOReturn ioReturnValue = IOServiceGetMatchingServices(kIOMasterPortDefault, mDict, &iterator); 

    BOOL result = YES; 
    if (ioReturnValue != kIOReturnSuccess) 
     NSLog(@"error getting matching services for force touch devices"); 
    else 
    { 
     //recursively go through each device found and its children and grandchildren, etc. 
     result = [[self class] _containsForceTouchDevice:iterator]; 
     IOObjectRelease(iterator); 
    } 

    return result; 
} 

+ (BOOL)_containsForceTouchDevice:(io_iterator_t)iterator 
{ 
    io_object_t object = 0; 
    BOOL success = NO; 
    while ((object = IOIteratorNext(iterator))) 
    { 
     CFMutableDictionaryRef result = NULL; 
     kern_return_t state = IORegistryEntryCreateCFProperties(object, &result, kCFAllocatorDefault, 0); 
     if (state == KERN_SUCCESS && result != NULL) 
     { 
      if (CFDictionaryContainsKey(result, CFSTR("DefaultMultitouchProperties"))) 
      { 
       CFDictionaryRef dict = CFDictionaryGetValue(result, CFSTR("DefaultMultitouchProperties")); 
       CFTypeRef val = NULL; 
       if (CFDictionaryGetValueIfPresent(dict, CFSTR("ForceSupported"), &val)) 
       { 
        Boolean aBool = CFBooleanGetValue(val); 
        if (aBool) //supported 
         success = YES; 
       } 
      } 
     } 

     if (result != NULL) 
      CFRelease(result); 

     if (success) 
     { 
      IOObjectRelease(object); 
      break; 
     } else 
     { 
      io_iterator_t childIterator = 0; 
      kern_return_t err = IORegistryEntryGetChildIterator(object, kIOServicePlane, &childIterator); 
      if (!err) 
      { 
       success = [[self class] _containsForceTouchDevice:childIterator]; 
       IOObjectRelease(childIterator); 
      } else 
       success = NO; 

      IOObjectRelease(object); 
     } 
    } 

    return success; 
} 

只需撥打+(BOOL)isForceTouchCapable,如果一個部隊觸摸設備可用,就返回YES(一個魔術觸控板2或內置有效觸摸,觸控板)或者如果沒有則爲否。

對於那些對此感興趣的人,我寫了一個關於它的示例項目on my blog

+0

我剛拿到Magic Trackpad 2(用力觸摸),你的代碼沒有檢測到它的存在。你有沒有測試過最新版本的OSX? – BitBank

+0

使用外部和內部FT功能的觸控板在10.10.3上測試。 你有IORegistryExplorer嗎?有了它,你可以瀏覽你的連接設備,看看你的Magic Trackpad是否有不同的Force Touch鍵? (而不是「ForceSupported」) –

+0

我正在運行10.11.3(最新)。我會檢查你建議的工具。 – BitBank