关于 Quick Touch & Touch Bar

Touch Bar 其实就是在原来 MBP 的按键区顶部新增了一个长条形的OLED触控屏,提供一些常用的快捷键。(iMessage 选表情那个真的非常好 ~)

Quick Touch 这个应用的 idea 是受 Touch Bar 激发的。当然,在我看来,Quick Touch 的功能可以比 Touch Bar 更强大,可以远程控制、自定义命令(不用等应用适配 Touch Bar)、几乎可以执行所有 MacBook 的操作。

Quick Touch 的功能

Quick Touch 的 github 地址 :https://github.com/xurunkang/QuickTouch

目前的 Quick Touch 界面是十分简陋的,不过功能基本都实现。

具体功能功能可以参考 Quick Touch 介绍,也可以看演示视频 Quick Touch 演示

http://www.bilibili.com/video/av7107528/

Quick Touch 的实现

大体思路:利用局域网的 socket 连接,iOS 设备与 MacBook 之间通过 UDP 发送信息。

需要解决的问题有:

1.Mac 切换 app 要及时通知 iPhone,iPhone 再相应地切换每个 app 对应的快捷键

Mac 提供了系统通知 NSWorkspaceDidActivateApplicationNotification 来使得这一功能实现

Mac 发送通知,这里只是监听了切换应用的事件,有更多通知可以监听。需要监听更多事件可以进入 NSWorkspace.h 来查看通知的名字。

// 监听事件

[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self selector:@selector(sendMacInfos) name:NSWorkspaceDidActivateApplicationNotification object:nil];

#pragma mark - Send Mac Infos

- (void)sendMacInfos{

NSDictionary *macInfos = @{

@"currentAppName":[NSWorkspace sharedWorkspace].frontmostApplication.localizedName,

};

NSData *macInfosData = [NSJSONSerialization dataWithJSONObject:macInfos options:NSJSONWritingPrettyPrinted error:nil];

[_udpSocket sendData:macInfosData toHost:QTHOST port:QTSENDPORT withTimeout:1.0 tag:0];

}

iOS 接收信息

#pragma mark - GCDAsyncUdpSocketDelegate

- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext{

NSDictionary *macInfos = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

_appNameLabel.text = macInfos[@"currentAppName"];

[_appQTTableView reloadData];

}

2.iOS 控制 Mac 端的命令

由于这里涉及操作过多,就简单介绍一下,详细可以看 Github / QuickTouch (https://github.com/xurunkang/QuickTouch)的源码。

  • 执行快捷键:可以使用 CGEventCreateKeyboardEvent 来创建键盘事件,从而执行应用的快捷键。

// 创建点击键盘事件

CGEventRef eventDown, eventUp;

eventDown = CGEventCreateKeyboardEvent(nil, keyCode, YES);

eventUp = CGEventCreateKeyboardEvent(nil, keyCode, NO);

CGEventPost(kCGHIDEventTap, eventDown);

sleep(0.0001);

CGEventPost(kCGHIDEventTap, eventUp);

CFRelease(eventUp);

CFRelease(eventDown);

  • 输出命令:如 git log / pwd,原理同上。

  • 点击 Menu Bar 的功能:由于某些功能并没有快捷键,所以要操作 Menu Bar,这里是使用 Apple Script。

// 创建点击 Menu Bar 事件

NSString *scriptStr = [NSString stringWithFormat:@"tell application \"System Events\" to tell process \"%@\"\

\nset frontmost to true\

\nclick menu item \"%@\" of menu \"%@\" of menu bar %ld\

\nend tell",appName,item,menu,(long)menuBar];

NSAppleScript *clickMenuBarItemScript = [[NSAppleScript alloc] initWithSource:scriptStr];

[clickMenuBarItemScript executeAndReturnError:nil];

  • 系统设置: 如亮度调节/启动 app,则需要使用系统中的 API

// 调节系统亮度

io_iterator_t iterator;

kern_return_t result = IOServiceGetMatchingServices(kIOMasterPortDefault, IOServiceMatching("IODisplayConnect"), &iterator);

if (result == kIOReturnSuccess) {

io_object_t service;

while ((service = IOIteratorNext(iterator))) {

IODisplaySetFloatParameter(service, kNilOptions, CFSTR(kIODisplayBrightnessKey), level);

IOObjectRelease(service);

return;

}

}

// 启动 app

[[NSWorkspace sharedWorkspace] launchApplication:name];

3.自定义命令

  • 自定义键盘事件:QTKey 中提供了三个方法使用

+ (void)pressNormalKey:(CGKeyCode) keyCode;

+ (void)pressNormalKey:(CGKeyCode)keyCode withFlag:(NSString *)flag;

+ (void)pressNormalKey:(CGKeyCode) keyCode withFlags:(NSArray *)flags;

  • 自定义系统设置:QTSystemSetting 中提供了一系列方法

// 设置系统亮度

+ (void)setSystemBrightness:(float)level;

// 设置/获取系统音量

+ (void)setSystemVolume:(int)level;

+ (SInt32)getSystemVolume;

// 使 Mac 休眠

+ (void)sleepWithDelay:(int)delay;

+ (void)sleepNow;

// 获取某个 APP menuItem 的全部名称

+ (void)fetchAllMenuItemNameOfApp:(NSString *)appName;

// 模拟点击 MenuItem

+ (void)clickMenuItem:(NSString *)item

ofMenu:(NSString *)menu

ofMenuBar:(NSInteger)menuBar

ofApplication:(NSString *)appName;

// 模拟点击 SubMenuItem

+ (void)clickSubMenuItem:(NSString *)subItem

ofMenuItem:(NSString *)item

ofMenu:(NSString *)menu

ofMenuBar:(NSInteger)menuBar

ofApplication:(NSString *)appName;

// 启动某个 APP

+ (void)launchApp:(NSString *)name;

Quick Touch 使用的第三方库

  • GCDAsyncSocket

    https://github.com/robbiehanson/CocoaAsyncSocket

  • Masonry

    https://github.com/SnapKit/Masonry

  • ReactiveCocoa 2.5

    https://github.com/ReactiveCocoa/ReactiveCocoa

Quick Touch – 在 iOS 设备运行的 “Touch Bar”的更多相关文章

  1. 获得touch事件,jquery绑定事件监听器,ios设备上打开touch状态以响应focus,active等伪类

    2. 默认的监听方式 document.addEventListener('touchstart', function(){ alert('hello'); }, false); 使用jquery时 ...

  2. iOS开发的另类神器:libimobiledevice开源包【类似android adb 方便获取iOS设备信息】

    简介 libimobiledevice又称libiphone,是一个开源包,可以让Linux支持连接iPhone/iPod Touch等iOS设备.由于苹果官方并不支持Linux系统,但是Linux上 ...

  3. iOS / Android 移动设备中的 Touch Icons

    上次转载了一篇<将你的网站打造成一个iOS Web App>,但偶然发现这篇文章的内容有些是错误的——准确来说也不是错误,只是不适合自半年前来的情况了(也可以说是iOS7 之后的时间)—— ...

  4. iPhone, Android等设备上的Touch和Gesture

    现在,为智能触摸手机创建直观的用户界面时,最重要的部分不再是单纯的视觉效果,而是要创建出能很好地处理用户触摸交互的界面.对于Web应用而言,这意味着使用touch事件来取代传统的mouse事件.在Do ...

  5. iOS 9之3D Touch

    金田 北京时间9月10日凌晨, Apple在美国旧金山比尔格拉汉姆公民大礼堂(Bill Graham Civic Auditorium)召开新品发布会.本次着重介绍了3D Touch功能, 大体介绍一 ...

  6. iOS 9之Advanced Touch Input(高级触摸输入)

    金田 今天要讲的主题是iOS 9高级触摸输入,更准确地讲,是在iOS9上如何减少触摸输入到屏幕显示的延迟程度,此次将分 低延迟渲染(iOS9 渲染性能优化)和 触摸点方案改进 两个方面来介绍. 低延迟 ...

  7. mac系统升级导致无法在iOS设备中运行Safari Web 调试器

    macOS系统升级之后,可能会导致Safari开发选项中没有iOS设备,进而无法运行Safari Web 调试器. 此问题的解决办法: 请转到设置>常规>重置>重置位置和隐私.现在, ...

  8. 【转】使IFRAME在iOS设备上支持滚动

    原文链接: Scroll IFRAMEs on iOS原文日期: 2014年07月02日 翻译日期: 2014年07月10日翻译人员: 铁锚 很长时间以来, iOS设备上Safari中超出边界的元素将 ...

  9. 使IFRAME在iOS设备上支持滚动

    原文链接: Scroll IFRAMEs on iOS原文日期: 2014年07月02日 翻译日期: 2014年07月10日翻译人员: 铁锚很长时间以来, iOS设备上Safari中超出边界的元素将不 ...

随机推荐

  1. distinct 多列详解

    1.distinct单列 select distinct(a) from tableA; 2.distinct多列 select distinct a,b,c from tableA; 注意此时是将a ...

  2. (转载)Java8新的日期API LocalDate, LocalTime

    前言 由于Java Date的各种问题,Java8推出了新的日期API,很受一拨人的追捧. 为什么我们需要新的Java日期/时间API? 在开始研究Java 8日期/时间API之前,让我们先来看一下为 ...

  3. logistic回归(一)

    http://www.2cto.com/kf/201307/226576.html , 这个是Sigmoid函数,在这个回归过程中非常重要的函数,主要的算法思想和这个密切相关.这个函数的性质大家可以自 ...

  4. PHP ECSHOP中 诡异的问题:expects parameter 1 to be double

    使用Ecshop给客户做了一个商城系统,在测试时发现后台在更改订单的配送方式时出现了以下问题 "PHP Warning: number_format() expects parameter ...

  5. (转)在NGUI使用图片文字(数字、美术字)(直接可用于UILable)

    本文永久地址:http://www.omuying.com/article/24.aspx,[文章转载请注明出处!] 在 Unity 开发过程中,我们经常会使用到美术提供的图片文字(数字)来美化我们的 ...

  6. 如何实现json字符串和 BsonDocument的互相转换

    String to BsonDocument string json = "{ 'foo' : 'bar' }"; MongoDB.Bson.BsonDocument docume ...

  7. hadoop hue切换中文版

    搭建了Hue之后发现只有英文的界面,非常不开心,于是百度谷歌了一大堆也没有发现可靠的办法,就自己上手了一把,亲测可行. 英文版: 中文版: hue切换使用中文版的方法如下: 1.修改配置文件 vi / ...

  8. Maven镜像收集

    本贴主要收集国内国外速度比较快的maven镜像,OSC的MAVEN已经关闭了 0.阿里Maven镜像 setting.xml https://github.com/ae6623/Zebra/blob/ ...

  9. wget获取整站

    wget -m -e robots=off https://www.baidu.com -m是克隆整个网站,-e robots=off是让wget忽视robots.txt 如果网站有中文路径,最好用以 ...

  10. Java 大型系统高并发大数据的处理方式

    页面静态化 (页面层面的缓存) 缓存 (memcached.redis等,数据缓存.避免多次请求) 集群负载均衡(单机处理能力不足) 分库分表(大量数据的处理.原则分.分.分) 读写分离 队列.MQ. ...