关于 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. MySql查询时间段的方法(转)

    http://www.jb51.net/article/58668.htm 本文实例讲述了MySql查询时间段的方法.分享给大家供大家参考.具体方法如下: MySql查询时间段的方法未必人人都会,下面 ...

  2. ssh tunnel

    https://peppoj.net/2012/10/tunnel-http-traffic-encrypted-using-polipo-and-ssh/ --------------------- ...

  3. AOP在大规模软件开发项目中的应用(图)

    AOP在大规模软件开发项目中的应用(图) 本文的写作源于一个真实的大型软件开发项目,我们努力尝试在这个项目中推广应用AOP.在此我们将对曾经面临过的一些实际问题与困难进行分析,试图引发关于面向方面软件 ...

  4. [Algorithm] Check for balanced parentheses using stack

    Algorithm or program to check for balanced parentheses in an expression using stack data structure. ...

  5. Auty 2017——WebMonitor接口本地检测平台

    转载:http://www.cnblogs.com/LanTianYou/p/6272484.html#_label0_0 目录 2016Auty诞生 2017一个新的开始 WebMonitor接口本 ...

  6. Java 面向切面编程(Aspect Oriented Programming,AOP)

    本文内容 实例 引入 原始方法 装饰者模式 JDK 动态代理和 cglib 代理 直接使用 AOP 框架--AspectWerkz 最近跳槽了,新公司使用了 AOP 相关的技术,于是查点资料,复习一下 ...

  7. PAT 1069 1070 1071 1072

    pat 1069 The Black Hole of Numbers 水题,代码如下: #include<cstdio> #include<cstdlib> #include& ...

  8. eclipse 远程调试程序

    最近遇到一个非常恶心的问题,本地调试没有问题,到了线上就复发,逼于无奈只能使用eclipse远程调试,下面把步骤记录一下: 1.修改服务器的启动脚本,添加如下内容: export JPDA_ADDRE ...

  9. Java 通配符匹配查找文件

    比较了一下Java正则表达式与通配符之间的差别,很简单的进行了一下转化就行了.此外要注意String的replace和replaceAll的用法的含义,不要搞错了. 字符串匹配例子 String s  ...

  10. MySQL快速建立测试表

    1:只要已经存在表结构的 第一种方式: CREATE TABLE T1 SELECT * FROM mysql.user ; 第二种方式: CREATE TABLE T2 LIKE mysql.use ...