zoukankan      html  css  js  c++  java
  • 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 "%@"

                         set frontmost to true

                         click menu item "%@" of menu "%@" of menu bar %ld

                         end 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

  • 相关阅读:
    xml的建模
    P1341 无序字母对
    P1330 封锁阳光大学
    P2661 信息传递
    P1312 Mayan游戏
    P1514 引水入城
    C. Sad powers
    P1195 口袋的天空
    P1821 [USACO07FEB]银牛派对Silver Cow Party
    P1396 营救
  • 原文地址:https://www.cnblogs.com/fengmin/p/6084330.html
Copyright © 2011-2022 走看看