Quick Touch – 在 iOS 设备运行的 “Touch Bar”
关于 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”的更多相关文章
- 获得touch事件,jquery绑定事件监听器,ios设备上打开touch状态以响应focus,active等伪类
2. 默认的监听方式 document.addEventListener('touchstart', function(){ alert('hello'); }, false); 使用jquery时 ...
- iOS开发的另类神器:libimobiledevice开源包【类似android adb 方便获取iOS设备信息】
简介 libimobiledevice又称libiphone,是一个开源包,可以让Linux支持连接iPhone/iPod Touch等iOS设备.由于苹果官方并不支持Linux系统,但是Linux上 ...
- iOS / Android 移动设备中的 Touch Icons
上次转载了一篇<将你的网站打造成一个iOS Web App>,但偶然发现这篇文章的内容有些是错误的——准确来说也不是错误,只是不适合自半年前来的情况了(也可以说是iOS7 之后的时间)—— ...
- iPhone, Android等设备上的Touch和Gesture
现在,为智能触摸手机创建直观的用户界面时,最重要的部分不再是单纯的视觉效果,而是要创建出能很好地处理用户触摸交互的界面.对于Web应用而言,这意味着使用touch事件来取代传统的mouse事件.在Do ...
- iOS 9之3D Touch
金田 北京时间9月10日凌晨, Apple在美国旧金山比尔格拉汉姆公民大礼堂(Bill Graham Civic Auditorium)召开新品发布会.本次着重介绍了3D Touch功能, 大体介绍一 ...
- iOS 9之Advanced Touch Input(高级触摸输入)
金田 今天要讲的主题是iOS 9高级触摸输入,更准确地讲,是在iOS9上如何减少触摸输入到屏幕显示的延迟程度,此次将分 低延迟渲染(iOS9 渲染性能优化)和 触摸点方案改进 两个方面来介绍. 低延迟 ...
- mac系统升级导致无法在iOS设备中运行Safari Web 调试器
macOS系统升级之后,可能会导致Safari开发选项中没有iOS设备,进而无法运行Safari Web 调试器. 此问题的解决办法: 请转到设置>常规>重置>重置位置和隐私.现在, ...
- 【转】使IFRAME在iOS设备上支持滚动
原文链接: Scroll IFRAMEs on iOS原文日期: 2014年07月02日 翻译日期: 2014年07月10日翻译人员: 铁锚 很长时间以来, iOS设备上Safari中超出边界的元素将 ...
- 使IFRAME在iOS设备上支持滚动
原文链接: Scroll IFRAMEs on iOS原文日期: 2014年07月02日 翻译日期: 2014年07月10日翻译人员: 铁锚很长时间以来, iOS设备上Safari中超出边界的元素将不 ...
随机推荐
- distinct 多列详解
1.distinct单列 select distinct(a) from tableA; 2.distinct多列 select distinct a,b,c from tableA; 注意此时是将a ...
- (转载)Java8新的日期API LocalDate, LocalTime
前言 由于Java Date的各种问题,Java8推出了新的日期API,很受一拨人的追捧. 为什么我们需要新的Java日期/时间API? 在开始研究Java 8日期/时间API之前,让我们先来看一下为 ...
- logistic回归(一)
http://www.2cto.com/kf/201307/226576.html , 这个是Sigmoid函数,在这个回归过程中非常重要的函数,主要的算法思想和这个密切相关.这个函数的性质大家可以自 ...
- PHP ECSHOP中 诡异的问题:expects parameter 1 to be double
使用Ecshop给客户做了一个商城系统,在测试时发现后台在更改订单的配送方式时出现了以下问题 "PHP Warning: number_format() expects parameter ...
- (转)在NGUI使用图片文字(数字、美术字)(直接可用于UILable)
本文永久地址:http://www.omuying.com/article/24.aspx,[文章转载请注明出处!] 在 Unity 开发过程中,我们经常会使用到美术提供的图片文字(数字)来美化我们的 ...
- 如何实现json字符串和 BsonDocument的互相转换
String to BsonDocument string json = "{ 'foo' : 'bar' }"; MongoDB.Bson.BsonDocument docume ...
- hadoop hue切换中文版
搭建了Hue之后发现只有英文的界面,非常不开心,于是百度谷歌了一大堆也没有发现可靠的办法,就自己上手了一把,亲测可行. 英文版: 中文版: hue切换使用中文版的方法如下: 1.修改配置文件 vi / ...
- Maven镜像收集
本贴主要收集国内国外速度比较快的maven镜像,OSC的MAVEN已经关闭了 0.阿里Maven镜像 setting.xml https://github.com/ae6623/Zebra/blob/ ...
- wget获取整站
wget -m -e robots=off https://www.baidu.com -m是克隆整个网站,-e robots=off是让wget忽视robots.txt 如果网站有中文路径,最好用以 ...
- Java 大型系统高并发大数据的处理方式
页面静态化 (页面层面的缓存) 缓存 (memcached.redis等,数据缓存.避免多次请求) 集群负载均衡(单机处理能力不足) 分库分表(大量数据的处理.原则分.分.分) 读写分离 队列.MQ. ...