前言
在移動設備測試和遠程協助的過程中,能夠遠程查看和協助iPhone設備是一項非常實用的功能。為了解決這一需求,我開發了一款名為iOS遠程大師的產品,允許用户通過H5後台界面查看和協助越獄或非越獄的iPhone設備。本文將詳細介紹iOS遠程大師的開發過程和技術實現。
一、技術實現
整個項目的核心技術包括H5前端界面、WebSocket通信、服務器轉發和iPhone設備處理。下面將分步驟介紹每個部分的實現。
1. H5前端界面
在H5前端,我使用了vue框架來構建用户界面。用户通過這個界面可以實時查看iPhone的屏幕,並通過鼠標發送交互指令。
- 實時屏幕顯示:通過WebSocket連接,接收服務器轉發的iPhone屏幕圖像,並在H5頁面上進行渲染。
- 用户指令捕獲:在div中監聽用户的鼠標事件,並將這些事件轉換為特定的指令格式。
橫屏座標轉換
在前端實現中,處理橫屏模式下的座標轉換至關重要。在 H5 後台將設備切換為橫屏時,儘管你看到的界面已經是橫屏了,但 iPhone 端實際仍然是豎屏,因此必須進行座標轉換,以確保點擊事件能夠在正確的位置被執行,並且保持顯示的一致性。
const convertCoordinates = (width, height, clickX, clickY) => {
const angle = rotateAngle.value % 360
if (angle === -90) {
const rotatedX = height - clickX * Math.cos(angle * Math.PI / 180) + clickY * Math.sin(angle * Math.PI / 180)
const rotatedY = -clickX * Math.sin(angle * Math.PI / 180) + clickY * Math.cos(angle * Math.PI / 180)
clickX = rotatedX
clickY = rotatedY
} else if (angle === -180) {
const rotatedX = width - clickX
const rotatedY = height - clickY
clickX = rotatedX
clickY = rotatedY
} else if (angle === -270) {
const rotatedX = clickY
const rotatedY = width - clickX
clickX = rotatedX
clickY = rotatedY
}
return { clickX, clickY }
}
2. WebSocket通信
前端和設備之間採用WebSocket進行實時通信,以確保低延遲的指令傳輸。
- 建立連接:前端與後端建立WebSocket連接,確保雙向通信的實現。
- 指令發送:用户在前端頁面上進行交互操作,前端將這些指令發送給後端,通過WebSocket進行傳輸。
- 指令轉發:後端接收到前端發送的指令後,根據指令內容識別目標設備,並將指令下發到對應的設備。
- 執行指令:目標設備接收到後端發送的指令,並執行相應的操作。
- 結果回傳:設備執行完指令後,將執行結果發送給後端,後端再通過WebSocket將結果回傳給前端,以供用户查看或處理。
3. iPhone設備處理命令
在iPhone設備端,我們區分越獄和不越獄設備的支持情況。
-
越獄設備:支持iOS 12到14版本,通過私有API實現更深層次的操作。主要包括硬件觸發和屏幕點擊。
- 按鍵操作:通過私有API直接觸發iPhone的硬件功能,例如電源、Home鍵、音量+-等操作。
- 屏幕點擊:利用越獄權限,直接在屏幕座標上模擬觸摸事件。
按鍵操作的部分代碼如下:
+ (void)sendHIDEventWithUsagePage:(uint16_t)usagePage usage:(uint16_t)usage down:(Boolean)down { uint64_t abTime = mach_absolute_time(); IOHIDEventRef event = IOHIDEventCreateKeyboardEvent(kCFAllocatorDefault, abTime, usagePage, usage, down, 0); IOHIDEventSetIntegerValue(event,4, 1); IOHIDEventSetSenderID(event, senderID); postIOHIDEvent(event); } static void postIOHIDEvent(IOHIDEventRef event) { static IOHIDEventSystemClientRef ioSystemClient = NULL; if (!ioSystemClient){ ioSystemClient = IOHIDEventSystemClientCreate(kCFAllocatorDefault); } if (senderID != 0) { IOHIDEventSetSenderID(event, senderID); } else { return; } IOHIDEventSystemClientDispatchEvent(ioSystemClient, event); }具體的按鍵代碼可參考:https://iphonedev.wiki/IOHIDFamily
屏幕點擊的部分代碼如下:
// 示例代碼:使用私有API觸發屏幕點擊
void simulateTouch(CGFloat x, CGFloat y) {
// 在實現模擬滑動過程中,滑動效果始終不理想,最終放棄。引用IOS13-SimulateTouch 項目來實現了屏幕的點擊和滑動
// 具體實現參考 IOS13-SimulateTouch 項目
// https://github.com/xuan32546/IOS13-SimulateTouch
}
在這也要感謝微信羣裏的 @福州-啊嘴 在模擬滑動中提供的幫助
-
非越獄設備:支持iOS 15及以上版本,利用XCUITest實現硬件的觸發和屏幕的點擊。
- 硬件觸發:通過XCUITest框架模擬按鍵操作。
- 屏幕點擊:使用XCUITest框架在指定座標模擬點擊。
按鍵操作的部分代碼如下:
+ (void)sendHIDEventWithUsagePage:(uint16_t)usagePage usage:(uint16_t)usage down:(Boolean)down { if (usage == 0xe9) { [[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonVolumeUp]; } else if (usage == 0xea) { [[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonVolumeDown]; } else if (usage == 0x30 && down) { if ([XCUIDevice sharedDevice].fb_isScreenLocked) { [[XCUIDevice sharedDevice] fb_unlockScreen:nil]; } else { [[XCUIDevice sharedDevice] fb_lockScreen:nil]; } } } + (void)simulateHome { [[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonHome]; }屏幕點擊的部分代碼如下:
@interface XCUICoordinate () // 滑動事件 - (void)pressForDuration:(double)arg1 thenDragToCoordinate:(id)arg2; // 點擊事件 - (void)pressForDuration:(double)arg1; @end + (void)simulateClick:(CGPoint)tapPoint { // 在 https://github.com/appium/WebDriverAgent 項目已經有現成封裝好的代碼,在這就直接拿來用了 CGFloat x = tapPoint.x; CGFloat y = tapPoint.y; CGSize screenSize = [self getScreenSize]; double multiple = screenSize.width / remote_device_screen_width; x = x * multiple; y = y * multiple; FBRouteRequest *request = [[FBRouteRequest alloc] init]; request.arguments = @{@"x": @(x), @"y": @(y), @"duration": @0.001}; NSLog(@"witwit simulateClick =%@=", request.arguments); [FBElementCommands handleTouchAndHold:request]; }
二、具體功能
iOS遠程大師主要實現了以下幾個功能:
- 實時屏幕顯示:用户可以在H5界面實時查看iPhone的屏幕。
- 遠程協助:支持鍵盤輸入、觸屏操作等常見交互方式,以便對遠程iPhone進行協助。
- 多設備管理:支持同時連接和管理多個iPhone設備。
三、遇到的問題及解決方案
在開發過程中,我也遇到了幾個主要問題:
模擬滑動:在越獄機上的模塊滑動效果始終不理想,豎滑正常,橫滑始終反應,折騰了好久,最終放棄,直接引用了IOS13-SimulateTouch項目代碼。
越獄設備socket連接偶爾斷開 :在socket失去連接時,有重新建立連接,但還是有偶現的設備掉線線情況,後邊有時間再處理。
設備兼容性:在越獄機上的12,13,14系統能正常運行,非越獄機15和16部分機型能正常運行。
總結
通過開發iOS遠程大師,我們不僅實現了H5後台遠程查看和協助iPhone的功能,還積累了豐富的經驗和技術儲備。希望這篇文章能對有類似需求和興趣的開發者提供一些參考和啓發,如你需要體驗該項目,請聯繫我。
提示:閲讀此文檔的過程中遇到任何問題,請關住工眾好【移動端Android和iOS開發技術分享】或+99 君羊【812546729】