关于 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. \r\n 如何转换成utf-8格式的,在jsp页面中正常显示换行

    数据库中存的换行是\r\n,读取到UTF-8编码的JSP 页面上以后,没有换行 在jsp页面显示之前,要进行一下字符转换,将所有\r\n转换成<br>,如下: String result  ...

  2. Java 读取某个目录下所有文件、文件夹

    /** * @Author: * @Description:获取某个目录下所有直接下级文件,不包括目录下的子目录的下的文件,所以不用递归获取 * @Date: */ public static Lis ...

  3. (转)径向模糊效果shader

    转自:http://blog.csdn.net/xoyojank/article/details/5146297 最先在这里看到:http://www.gamerendering.com/2008/1 ...

  4. scp ssh: connect to host 9.123.159.41 port 22:connection refused的解决办法

    不同机器之间的文件拷贝,可以用scp命令 使用时报:ssh:connect to host 192.16.41.121 port 22:connectionrefused mac 无法ssh loca ...

  5. IC卡制作常识概述

    ic卡主要有9种:    1.接触型IC卡:    2.非接触型IC卡:    3.串行传输型IC卡:    4.并行传输型IC卡:    5.存储型IC卡:    6.智能型IC卡:    7.超级 ...

  6. 电脑技巧 如何保存网页为PDF

    安装Adobe Acrobat X pro(要安装版本,不要绿色版),完成之后再打印机里面可以看到添加了新的Adobe PDF打印机   对于任意的Office文档,都可以直接打印到PDF得到PDF文 ...

  7. DFS csu1719 Boggle

    传送门:id=1719">点击打开链接 题意:真正的题意是,告诉你一些字符串.然后告诉你非常多个字符格子,问这些字符串是否能在字符格子中连起来,在格子中对角线也觉得是连在一起的.假设格 ...

  8. iOS 8 swift 键盘不出来 ios 8 uitextfield keyboard not appearing

    ios 8 uitextfield keyboard not appearing //发现在iphone 6 and iPhone plus 上面键盘不出来.后来查了下原来要在模拟器里设置下 var ...

  9. uni-app - 上传图片组件

    2018-12-29 更新1.0  2019-01-08 更新1.1 2019-01-29 更新1.3   重大更新 插件地址: http://ext.dcloud.net.cn/plugin?id= ...

  10. AngularJS实现三级Table列表

    angular.module('yo03App') .controller('MyrouteCtrl', function ($scope) { $scope.professors = [{ 'nam ...