關於 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 演示
Quick Touch 的實現
大體思路:利用區域網的 socket 連線,iOS 裝置與 MacBook 之間通過 UDP 傳送資訊。
需要解決的問題有:
- Mac 切換 app 要及時通知 iPhone,iPhone 再相應地切換每個 app 對應的快捷鍵
Mac 提供了系統通知
NSWorkspaceDidActivateApplicationNotification
來使得這一功能實現Mac 傳送通知,這裡只是監聽了切換應用的事件,有更多通知可以監聽。需要監聽更多事件可以進入
NSWorkspace.h
來檢視通知的名字。1234567891011// 監聽事件[[[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 接收資訊
123456#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];} - iOS 控制 Mac 端的命令
由於這裡涉及操作過多,就簡單介紹一下,詳細可以看 Github / QuickTouch 的原始碼。
- 執行快捷鍵:可以使用
CGEventCreateKeyboardEvent
來建立鍵盤事件,從而執行應用的快捷鍵。
123456789// 建立點選鍵盤事件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。
1234567// 建立點選 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
1234567891011121314// 調節系統亮度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];
- 執行快捷鍵:可以使用
- 自定義命令
- 自定義鍵盤事件:QTKey 中提供了三個方法使用
123+ (void)pressNormalKey:(CGKeyCode) keyCode;+ (void)pressNormalKey:(CGKeyCode)keyCode withFlag:(NSString *)flag;+ (void)pressNormalKey:(CGKeyCode) keyCode withFlags:(NSArray *)flags; - 自定義系統設定:QTSystemSetting 中提供了一系列方法
1234567891011121314151617181920212223242526272829// 設定系統亮度+ (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 *)itemofMenu:(NSString *)menuofMenuBar:(NSInteger)menuBarofApplication:(NSString *)appName;// 模擬點選 SubMenuItem+ (void)clickSubMenuItem:(NSString *)subItemofMenuItem:(NSString *)itemofMenu:(NSString *)menuofMenuBar:(NSInteger)menuBarofApplication:(NSString *)appName;// 啟動某個 APP+ (void)launchApp:(NSString *)name;
- 自定義鍵盤事件:QTKey 中提供了三個方法使用
Quick Touch 使用的第三方庫
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式