<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ## iOS 輸入事件的底層視角 ### 什么是輸入事件? iOS 使用事件這個概念來處理從不同輸入設備收到的信號。一個事件就是一個對象,由某個輸入設備的某個信號對應產生。 然后,這些對象被投遞到對應的內核子系統,經過處理之后,通知所有監聽的進程,比如,tap,點擊,滑動等。 這就意味著為了模擬外部設備生成的信號,比如觸摸屏幕,只需要按真實設備生成事件的順序,發送有相同屬性的事件對象, ### 讓我們模擬一個單點擊事件 該事件的API是蘋果的私有API之一,不開源也沒有任何文檔。XCTest 盡管如此,還是有可能通過XCTest沒有文檔的私有接口來生成事件。我們對[XCPointerEventPath](https://github.com/appium/WebDriverAgent/blob/master/PrivateHeaders/XCTest/XCPointerEventPath.h) 和 [XCSynthesizedEventRecord](https://github.com/appium/WebDriverAgent/blob/master/PrivateHeaders/XCTest/XCSynthesizedEventRecord.h) 接口特別感興趣。 這些接口允許我們創建輸入事件鏈,并提供給系統內核執行。 為了合成單機事件,我們必須: - 創建一個 `XCPointerEventPath` 實例,然后初始化為`在初始點觸摸`。 - 使用 `liftUpAtOffset:` 方法,給每個實例添加一個 `liftUp` 事件,偏移量為:`0.125s`。 - 使用`addPointerEventPath:`方法,添加生成的事件對象給`XCSynthesizedEventRecord` 實例。 - 使用`XCSynthesizedEventRecord`的`synthesizeWithError:`方法來執行事件,并處理返回的錯誤信息。 對于這些 API,有如下限制: - 每個 `XCPointerEventPath` 實例只能執行一個動作。舉個例子,如果想給一個實例添加兩個點擊事件,都會被忽略掉。 - 每個 `XCPointerEventPath` 實例都只能用特定的點擊類型來初始化,比如,touch, mouse (從 Xcode 10.2開始) 或者 keyboard (從 Xcode 10.2) - 對一個已經存在的 `XCPointerEventPath` 實例,事件只能增加偏移量。 ### 更加復雜的動作事件怎么辦? 不幸的是,這些接口是私有的,沒有任何文檔。 我們只能通過嘗試組合不同的輸入,才能搞清楚究竟有了什么效果。目前所知的是,在多個`XCPointerEventPath`實例之間疊加時間,會生成多點觸控事件,有多少事件實例,就有多少手指。 所以,為了生成二指滑動事件,我們需要提供如下事件: - 創建兩個 `XCPointerEventPath` 實例, 然后初始化為`在初始點觸摸`。 - 使用`moveToPoint:`方法,給每個實例添加`moveToPoint`事件,偏移量為:`0.525s`。 - 使用 `liftUpAtOffset:` 方法,給每個實例添加一個 `liftUp` 事件,偏移量為:`0.525s`。 - 使用`addPointerEventPath:`方法,添加生成的事件對象給`XCSynthesizedEventRecord` 實例。 - 使用`XCSynthesizedEventRecord`的`synthesizeWithError:`方法來執行事件,并處理返回的錯誤信息。 ### 拓展閱讀 不幸的是,該主題根本就沒有太多的信息(私有 API `ˉ\_(ツ)_/ˉ`). 可以參考如下的資料: - https://github.com/appium/WebDriverAgent/tree/master/PrivateHeaders/XCTest - https://github.com/appium/WebDriverAgent/blob/master/WebDriverAgentTests/IntegrationTests/FBW3CTouchActionsIntegrationTests.m - https://github.com/appium/WebDriverAgent/blob/master/WebDriverAgentTests/IntegrationTests/FBW3CMultiTouchActionsIntegrationTests.m - https://github.com/appium/WebDriverAgent/blob/master/WebDriverAgentLib/Utilities/FBW3CActionsSynthesizer.m
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看