关于 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. jQuery EasyUI 入门简介

    对于前端开发者来说,在开发过程中应用“框架”这一工具,可以极大的缩短开发时间,提高开发效率.今天我们就开介绍一款常用的框架——jQuery EasyUI. 那什么是jQuery EasyUI呢? jQ ...

  2. 论文分享|《Universal Language Model Fine-tuning for Text Classificatio》

    https://www.sohu.com/a/233269391_395209 本周我们要分享的论文是<Universal Language Model Fine-tuning for Text ...

  3. java中两种发起POST请求,并接收返回的响应内容的方式  (转)

    http://xyz168000.blog.163.com/blog/static/21032308201162293625569/ 2.利用java自带的java.net.*包下提供的工具类 代码如 ...

  4. telnet 163发送邮件

    1.telnet smtp.163.com 25 2. 3.测试成功

  5. (转)unityshaderLab中fixed function常用指令

    ShaderLab中常用的fixedFunction. SubShader{ Tags{"Queue"="Transparent"} //渲染完不透明物体,再渲 ...

  6. Docker创建虚机和swarm

    创建虚机: First, quickly create a virtual switch for your virtual machines (VMs) to share, so they will ...

  7. MySQL开启慢查询日志时报Errcode: 13 的解决方法

    开启慢查询日志时会出现(Errcode: 13 - Permission denied)文件找不到的错误,但文件明明是存在的并且有读写的权限. mysql> set global slow_qu ...

  8. 壮士断腕!WordPress宣布停止使用React

    WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站,也可以把WordPress当作一个内容管理系统(CMS)来使用. WordPr ...

  9. Awk使用及站点日志分析

    Awk使用及站点日志分析 Awk简单介绍 概述 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入, ...

  10. 1052: 旋转单词(words)

    #include <iostream> #include <iomanip> #include <cstdlib> #include <string> ...