查明 Mac 是不是支持 Force Touch
Posted
技术标签:
【中文标题】查明 Mac 是不是支持 Force Touch【英文标题】:Find out if Mac is Force Touch - capable查明 Mac 是否支持 Force Touch 【发布时间】:2015-11-10 13:13:49 【问题描述】:是否可以通过内置触控板(如新款 MacBook)或蓝牙设备(如 Magic Trackpad 2)来确定 Mac 是否支持 Force Touch?
如果 Mac 支持 Force Touch,我想提供特定于 Force Touch 的首选项,但如果 Force Touch 不可用,则不显示(或禁用)这些首选项。
在分隔符之后的部分,您可以在此处链接的图片中看到我想到的选项。 (抱歉,嵌入图片本身不起作用)。
因此,不显示首选项不会限制没有强制触摸的用户,它只会让拥有它的用户配置它的工作方式,而这些设置对没有它的用户来说毫无用处.
有没有办法做到这一点?
谢谢你和亲切的问候, 马特
编辑:它在 Objective-C 中。
【问题讨论】:
是swift还是obj-c? 我忘了-objective-c 【参考方案1】:我想通了:
+ (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,如果 Force Touch 设备可用(Magic Trackpad 2 或内置的 force-touch-trackpad),它将返回 YES,否则返回 NO。
对于那些对此感兴趣的人,我用一个示例项目写了on my blog。
【讨论】:
我刚拿到 Magic Trackpad 2(带强制触控),您的代码没有检测到它的存在。您是否在最新版本的 OSX 上进行过测试? 在 10.10.3 上使用支持 FT 的外部和内部触控板进行测试。你有 IORegistryExplorer 吗?有了它,您可以浏览连接的设备,看看您的 Magic Trackpad 是否有不同的 Force Touch 键? (而不是“ForceSupported”) 我正在运行 10.11.3(最新)。我会看看你建议的工具。 哦,对不起,我的意思当然是 10.11.3,我很抱歉。 如果您能报告您的发现,我将不胜感激 - 谢谢!以上是关于查明 Mac 是不是支持 Force Touch的主要内容,如果未能解决你的问题,请参考以下文章