本文介紹如何使用無影雲手機的iOS SDK。
1. 快速開始
1.1 擷取SDK和DEMO
本平台所有文檔、SDK、用戶端程式僅限於本人或本企業使用,未經阿里雲同意不會轉寄給第三方個人或企業。
Integration Environment要求
最低支援iOS版本:10.0
由於iOS系統相關介面的開放,外設滑鼠和鍵盤功能,要求iOS最低版本:13.4
SDK整合
將SDK解壓,拷貝到自己的工程中。
關聯 SDK庫。
target --> Build Phases --> Link Binary With Libraries --> + --> Add Other -- Add Files -->選擇對應的framework
設定Embed。
target --> General --> Frameworks, Libraries, and Embedded Content --> 找到ASPEngineSDK.framework --> Embed Without Signing
SDK許可權
工程info.plist配置ASPEngineSDK需要的許可權。
1. 錄音許可權
Privacy - Microphone Usage Description2. 相機許可權
Privacy - Camera Usage DescriptionSDK簽名
SDK庫是動態庫,真機調試或發布App Store時,需要簽名。
如何擷取簽名ID
通過以下命令,尋找自己本機安裝認證的簽名ID:
security find-identity -v -p codesigning若沒有本機安裝認證,可以登入Apple開發人員帳號,下載對應認證的授權檔案Profiles,下載後,選中檔案右鍵,右鍵菜單選擇顯示簡介,在預覽處會顯示此授權檔案關聯的所有認證資訊,找到對應認證的資訊,裡面SHA-1對應的值就是我們需要簽名ID。
Signing & Capabilities簽名
在工程target裡正確配置Signing & Capabilities裡的認證即可。
添加簽名Shell(模擬器不需要,真機需要)
target --> Build Phases --> + --> New Run Script Phase --> 填寫sh內容,參考下面簽名Shell樣本。
注意:此Run Script必現在Embed Frameworks下面。
簽名Shell樣本
set -e
SHELL_PATH="${PROJECT_DIR}/ASPDemo/Lib/ASPEngineSDK/ASPEngineSDK.framework/link_and_sign.sh"
KEY_ID="你認證的簽名ID"
echo "===> Signing using $KEY_ID"
/bin/bash -c "${SHELL_PATH}"\ "${TARGET_BUILD_DIR}"\ "${FRAMEWORKS_FOLDER_PATH}"\ "${KEY_ID}"工程配置注意事項
關閉Bitcode。
target --> Build Settings --> Build Options --> Enable Bitcode --> 設定No
1.2 對接流程
1.3 最佳實務
方案詳見無影雲手機快速整合最佳實務。 雲手機整合的總體方案如下圖所示
有多種登入方式,擷取整合SDK所需要的串連雲手機Ticket憑證,流程圖為:
具體整合代碼可以參考生命週期介面的參考代碼。
2. 生命週期介面
2.1 初始化執行個體
+ (instancetype)buildStreamView;2.2 建立串連
- (void)startWithTicket:(ASPConnTicket*) ticketParam;ASPConnTicket參數說明:
屬性 | 說明 |
connTicket | 串連鑒權Ticket。 |
caFilePath | CA檔案的絕對路徑,用於TLS通訊加密 |
desktopId | 請傳入應用執行個體ID(格式:ai-0cc7s3n1iagyq****)。應用執行個體ID可通過調用雲手機的查詢執行個體詳細資料介面擷取。 |
useVpc | 是否通過企業專網進入 |
enableTls | 是否進行加密傳輸(建議設為YES) |
enableStatistics | 是否開啟埋點(建議設為YES) |
preferRtcTransport | 是否使用rtc通道(建議設為YES) |
2.3 中斷連線
- (int)stop;2.4 暫停
暫停雲端下發流和端側流渲染
- (void)pause;2.5 恢複
恢複雲端下發流和端側流渲染
- (void)resume;2.6 銷毀執行個體
- (void)dispose;2.7 回調說明
//雲手機串連相關回調
@property (nonatomic, weak) id<ASPEngineDelegate> engineDelegate;
//解析度發生變化回調
@property (nonatomic, weak) id<ASPEngineResolutionUpdateDelegate> resolutionUpdateDelegate;
//滑鼠游標相關回調
@property (nonatomic, weak) id<ASPEngineCursorDelegate> cursorDelegate;
//雲手機方向發生變化回調
@property (nonatomic, weak) id<ASPEngineOrientationUpdateDelegate> orientationUpdateDelegate;
//埋點相關回調
@property (nonatomic, weak) id<ASPEngineStatisticsDelegate> statisticsDelegate;
//IME相關回調 雲手機暫不支援
@property (nonatomic, weak) id<ASPEngineIMEDelegate> imeDelegate;
//LOG相關回調,delegate建議使用單例
+ (void)setASPEngineLogDelegate:(id<ASPEngineLogDelegate>)delegate;
+ (void)unsetASPEngineLogDelegate;雲手機串連相關回調ASPEngineDelegate
介面 | 描述 |
onConnectionSuccess:(int)connectId | 串連雲手機成功回調,返回串連的標識 |
onConnectionFailureWithErrCode:(int)errCode errMsg:(NSString*)errMsg | 串連雲手機失敗回調,返回錯誤碼和錯誤資訊 |
onEngineErrorWithErrCode:(int)errCode errMsg:(NSString*)errMsg | SDK內部發生異常回調,返回錯誤碼和錯誤資訊 |
onDisconnected:(int)reason | 雲手機串連被斷開,返回被斷開原因 |
onFirstFrameRendered:(long)timeCostMS | 雲手機顯示第一幀畫面回調,返回耗時情況 |
onReconnect:(int)errorCode | 雲手機串連發生重連動作,返回導致重連的錯誤碼 |
onPolicyUpdate:(NSString *)policy | 雲手機策略回調,返回策略配置 |
onUpdateNetworkQos:(AspNetworkQoS)qos | 網路服務品質情況 |
onSessionSuccess | 雲手機串連會話建立成功回調 |
解析度發生變化回調ASPEngineResolutionUpdateDelegate
介面 | 描述 |
onResolutionUpdateWithOldWidth:(int)oldWidth oldHeight:(int)oldHeight width:(int)width height:(int)height | 解析度發生變化回調,返回舊解析度和新解析度 |
onMonitorsDpiConfig:(int)dpi maxSupportDpi:(int)maxSupportDpi | dpi配置和支援的最大dpi,雲手機暫不支援 |
滑鼠游標相關回調ASPEngineCursorDelegate
介面 | 描述 |
onCursorBitmapUpdateWithHotX:(int)hotX hotY:(int)hotY width:(int)width height:(int)height rgba:(char*)rgba | 滑鼠游標資料回調,返回位置、大小和資料 |
onCursorReset | 滑鼠游標發生重設 |
onCursorHide | 滑鼠游標被隱藏 |
onCursorMoveWithX:(int)x y:(int)y | 滑鼠游標移動位置 |
埋點相關回調ASPEngineStatisticsDelegate
介面 | 描述 |
onStatisticsInfoUpdate:(ASPStatisticsInfo *)info | 雲手機效能資料回調,返回效能資料對象 |
LOG相關回調,ASPEngineLogDelegate建議使用單例
介面 | 描述 |
onLogMessage:(NSString*)msg tag:(NSString*)tag level:(AspLogLevel)level | SDK日誌回調,返回日誌資訊、tag和層級 |
3. 業務介面
介面 | 說明 |
- (BOOL)enableStatistics:(BOOL) enabled enableGuestInfo:(BOOL)enableGuestInfo | 是否開啟埋點和擷取鏡像cpu使用率。 |
- (BOOL)enableMouseMode:(BOOL)enabled | 是否開啟滑鼠模式 |
@property (nonatomic, assign) BOOL enableDump; | 是否開啟dump,此功能會消耗效能,只用於開發調試,禁止上線。 |
- (BOOL)sendKeyboardEvent: (ASPKeyEvent) event; | 發送鍵盤按鍵事件。 |
// leftButton是滑鼠左鍵還是右鍵,滑鼠點擊位置 x:0 y:0 - (BOOL)simulateMouseClick:(BOOL)leftButton; - (BOOL)simulateMouseClick:(BOOL)leftButton x:(float)x y:(float)y; | 類比滑鼠點擊。 |
- (void)hideCursor; - (void)showCursor; | 隱藏和現實滑鼠游標 |
- (void)setVideoProfileWithWidth:(int)width height:(int)height fps:(int)fps; | 設定解析度。fps暫不支援 |
@property (nonatomic, assign) BOOL mute; | 設定是否靜音。 |
@property (nonatomic, assign) ASPScaleType scaleType; | 畫面填充模式,ASPScaleType參考本文檔枚舉5.1 ASPScaleType |
- (void)enableDesktopMode:(BOOL)enabled; | 設定是否以桌面圖案運行,設定為enabled後,會將所有Touch訊息轉換為Mouse事件向服務端發送。雲手機建議設定為NO。 |
- (void)enableDesktopGesture:(BOOL)enabled; | 是否使用端側手勢縮放和平移。雲手機建議設定為NO。 |
@property (nonatomic, assign) BOOL enableTouchFeel; | 是否開啟觸感反饋,預設NO。 |
LyncChannel | 發送adb命令通道。實現參考demo的DemoLyncChannel。 |
DataChannel | 端側與鏡像接發自訂資料通道。實現參考demo的DemoEDSAgentChannel。 |
LyncChannel使用樣本:
//預設命令通道LyncChannel name為static NSString *LYNC_CHANNEL_NAME = @"lync_adb_shell";
//添加LyncChannelself.lync = [[DemoLyncChannel alloc] initWithParameter:LYNC_CHANNEL_NAME];
[self.streamView addLyncChannel:self.lync];
//移除LyncChannel
[self.streamView removeLyncChannel:self.lync];
//LyncChannel實現@interface DemoLyncChannel : BaseLyncChannel@property (nonatomic, strong) NSString *lslaID;
@end@implementation DemoLyncChannel
- (void)onConnectStateChanged:(BOOL)connected {
NSLog(@"[DemoLyncChannel] onConnectStateChanged %d", connected);
if (connected) {
//TEST send cmdself.lslaID = [DemoToolBox getID];
NSString *cmdData = [DemoToolBox getJsonDataWithId:self.lslaID cmd:@"ls -la"];
NSLog(@"[DemoLyncChannel] cmdData : %@", cmdData);
LyncErrorCode code = [self sendString:cmdData];
NSLog(@"[DemoLyncChannel] cmdData code: %ld", code);
}
}
- (void)onReceiveStringData:(NSString * _Nonnull)buf {
NSLog(@"[DemoLyncChannel] onReceiveStringData %@", buf);
NSDictionary *dic = [DemoToolBox convertStringToJSON:buf];
NSString *ID = [dic objectForKey:@"id"];
if (ID != NULL && ID.length && [self.lslaID isEqualToString:ID]) {
NSLog(@"[DemoLyncChannel] onReceiveStringData get ls -la result");
}
}
- (void)onReceiveRawData:(NSData * _Nonnull)buf {
NSString *string = [[NSString alloc] initWithData:buf encoding:NSUTF8StringEncoding];
NSLog(@"[DemoLyncChannel] onReceiveRawData %@", string);
}
@endDataChannel使用樣本:
//預設DataChannel name為static NSString *DATA_CHANNEL_NAME = @"wy_vdagent_default_dc";
//添加DataChannelself.esdAgent = [[DemoEDSAgentChannel alloc] initWithParameter:DATA_CHANNEL_NAME];
[self.streamView addDataChannel:self.esdAgent];
//移除DataChannel
[self.streamView removeDataChannel:self.esdAgent];
//DataChannel實現@interface DemoEDSAgentChannel : BaseEDSAgentChannel@end@implementation DemoEDSAgentChannel
- (void)onConnectStateChanged:(ASPDCConnectState)state {
NSLog(@"[DemoEDSAgentChannel] onConnectStateChanged %ld", state);
if (state == OPEN) {
// to send data
}
}
- (void)onReceiveData:(NSData * _Nonnull)buf {
NSString *string = [[NSString alloc] initWithData:buf encoding:NSUTF8StringEncoding];
NSLog(@"[DemoEDSAgentChannel] onConnectStateChanged %@", string);
}
@end訊息通道使用datachannel,datachannel名稱為wy_vdagent_default_dc。
訊息大小限制500KB。
基體訊息格式如下:
DataChannel 端側發送訊息給鏡像 client --> guest
action:insertcontact/insertsms/sendcontactcvf
insertcontact是插入連絡人
參數name是連絡人名稱,必填。
參數phonenumber是電話號碼,必填。
insertsms是插入簡訊
參數phonenumber是電話號碼, 必填。
參數textbody是簡訊內容,必填。
參數canInsertdb是否可以插入雲手機簡訊資料庫,選填,預設0, 不插入, 1為插入。
樣本:let jsonarray = [{'action': 'insertcontact','importdata':[{ 'name': '**', 'phonenumber': '**' }, { 'name': '**', 'phonenumber': '**' }]},{'action': 'insertsms','importdata':[{'phonenumber':'**','textbody':'**,"canInsertdb":0/1}]}]
sendcontactvcf是通過vcf插入連絡人
參數data是vcf檔案資料流,必填,若檔案過大,需拆包,一個包最大1MB。
參數allsize是vcf檔案資料總大小,必填。
參數timestamp是時間戳記,必填,一個vcf檔案資料下的所有包對應一個目前時間戳,通過時間戳記保證包來源於一個vcf檔案。
樣本:{'action': 'sendcontactvcf',importdata:{data:"", "allsize":檔案資料總大小, "timestamp":時間戳記}}。
public void processByteArrayInChunks(byte[] data) {
int chunkSize = 512 * 1024; // 500KB in bytesint length = data.length;
long timestamp = System.currentTimeMillis();
for (int i = 0; i < length; i += chunkSize) {
int end = Math.min(i + chunkSize, length);
byte[] chunk = Arrays.copyOfRange(data, i, end);
String str = new String(chunk, StandardCharsets.UTF_8);
/**
{'action': 'sendcontactvcf','importdata':{"data":str, "allsize":length, "timestamp":timestamp}}
*/
}
}String recvData = "";
int recvSize = 0;
long recvTimestamp = 0;
public void onMessageReceive(byte[] message) {
String action = getActioin(meesage);
String data = getData(message);
int length = data.length;
int allSize = getAllSize(message);
long timestamp = getTimestamp(message);
if (timestamp != recvTimestamp) {
clearRecv();
}
if (action.equals("sendcontactvcf")) {
recvSize += length;
recvData = recvData + data;
if (recvSize >= allSize) {
// recvData 寫vcf檔案 插入連絡人
insertContact(vcfFilePath);
sendack()
clearRecv();
}
}
}
public void clearRecv() {
recvData = ""
recvSize = 0;
recvTimestamp = 0;
}DataChannel 鏡像發送訊息給端側 guest --> client
action:openeditsms/openphone/rotation
openeditsms開啟編輯簡訊頁面
參數importdata.phonenumber是電話號碼,選填。
參數textbody是簡訊內容,選填。
樣本:{'action': 'openeditsms',importdata:{"phonenumber":"***", "textbody":"***"}}
openphone開啟電話撥號頁面
參數importdata.phonenumber是電話號碼,選填,有電話號,則開啟撥打指定連絡人頁面,沒有電話號碼,則開啟電話撥號頁面。
樣本:{'action': 'openphone','importdata':{"phonenumber":"***"}} 或 {'action': 'openphone'}
DataChannel 回執訊息
action:ack
ack是指不管是端側發送訊息給鏡像,還是鏡像發送訊息給端側,收到訊息側,根據業務需要,可回執ack訊息,表明訊息處理的情況
參數source是接收到訊息的action,必填。
參數code是狀態代碼,必填值為0表示未知,1 執行source,2 執行成功,3 執行失敗, 4 不支援執行。
樣本:{'action': 'ack','importdata':{"source":"***", "code": *,"id":*}}
4. 參數詳細說明
4.1 ASPConnTicket
建立串連的配置參數。
屬性 | 說明 |
connTicket | 串連鑒權Ticket。 |
caFilePath | CA檔案的絕對路徑,用於TLS通訊加密 |
desktopId | 請傳入應用執行個體ID(格式:ai-0cc7s3n1iagyq****)。應用執行個體ID可通過調用雲手機的查詢執行個體詳細資料介面擷取。 |
useVpc | 是否通過企業專網進入 |
enableTls | 是否進行加密傳輸(建議設為YES) |
enableStatistics | 是否開啟埋點(建議設為YES) |
preferRtcTransport | 是否使用rtc通道(建議設為YES) |
4.2 ASPStatisticsInfo
效能資料
介面 | 類型 | 說明 |
mReceiveFps | int | 接收到的幀率 |
mRenderFps | int | 渲染幀率 |
mDownstreamBandwithMBPerSecond | double | 下行頻寬 |
mUpstreamBandwithMBPerSecond | double | 上行頻寬 |
mP2pFullLinkageLatencyMS | long | 端到端全鏈路時延,已廢棄 |
mNetworkLatencyMS | long | 網路rtt時延 |
mPingGatewayRtt | long | ping rtt時延 |
mLostRate | double | 丟包率 |
mServerRenderLatencyMS | long | 雲側渲染延遲 |
mServerEncoderLatencyMS | long | 雲側編碼延遲 |
mServerTotalLatencyMS | long | 雲側總延遲 |
accumulateBandwidth | long | 總頻寬 |
mGuestCpuUsage | long | 鏡像CPU使用率 |
mStreamType | String | 流協議類型 |
infoDic | NSDictionary | 效能資料Map |
5. 枚舉類型
5.1 ASPScaleType
流化映像內容縮放處理類型。
名稱 | 含義 |
ASPScaleTypeFill | 總是將流化映像展開至與StreamView相同大小。當StreamView的長寬比例與流化映像長寬比例不相等時。採用該策略可能導致映像有明顯的變形 |
ASPScaleTypeFit | 對StreamView的渲染地區進行調整,使得StreamView總是能以相同的長寬比例渲染流化映像內容。採用該策略時,流化映像可能無法填滿整個StreamView |
6. 錯誤碼
錯誤碼 | 錯誤訊息( | 定義模組 | 原因 |
2~26主要是網路相關問題 | |||
2 | 串連%s失敗 | ASP SDK | 無效MAGIC |
3 | 串連%s失敗 | ASP SDK | 資料有誤 |
4 | 用戶端與服務端版本不匹配 | ASP SDK | 版本不匹配 |
5 | 串連需要 TLS | ASP SDK | 需要TLS |
6 | 串連不需要 TLS | ASP SDK | 不需要TLS而實際使用了TLS |
7 | 您沒有許可權串連當前%s | ASP SDK | 許可權問題 |
8 | ASP SDK | 遷移過程中client ID無效 | |
9 | 串連%s失敗 | ASP SDK | channel不存在 |
20 | 串連ASP伺服器失敗。 | ASP SDK | channel 串連錯誤 |
21 | TLS認證出錯了 | ASP SDK | TLS 認證錯誤 |
22 | 串連%s失敗 | ASP SDK | channel link 錯誤 |
23 | 串連%s失敗 | ASP SDK | 串連認證錯誤 |
24 | 串連%s失敗 | ASP SDK | 串連IO錯誤 |
25 | 串連%s失敗 | ASP SDK | Ticket校正失敗。使用者串連被斷開後,若使用同一個Ticket再次請求建連,也將觸發此錯誤。 |
26 | ASP SDK | xquic 握手失敗 | |
1206 | 一個ticket 可以重複使用,但是每次只能串連一個。如果雲手機處於串連中,再建立串連就會報此錯。 | ASP SDK | |
1207 | 執行個體發生重啟,導致Ticket失效了 | ASP SDK | |
sdk流協同錯誤碼 | |||
1000 | token empty | ASP SDK | 只會出現在流協同的時候,client與server進行二次校正失敗 |
1001 | user empty | ASP SDK | |
1200 | token invalid | ASP SDK | |
1201 | vm invalid | ASP SDK | |
1202 | ADMIN internal error | ASP SDK | |
1203 | user invalid | ASP SDK | |
1204 | token experied | ASP SDK | |
1500 | server internal error | ASP SDK | |
1501 | server net work error | ASP SDK | |
串連中斷開或遇到某些錯誤的情況 | |||
2000 | 擷取%s資料逾時,與服務端中斷連線 | ASP SDK | 正常斷開 |
2001 | %s已與服務端中斷連線。可能是因為%s進程已被強制終止。 | ASP SDK | 一般是端上應用被終止進程了,如Android應用使用者通過按下Home鍵終止 |
2002 | 已有使用者從其他終端串連當前%s。請稍後重試。 | ASP SDK | 其他人搶佔了端 |
2003 | %s正在關機或重啟,一般由管理員操作,請稍後重試。 | ASP SDK | 雲手機被關機或重啟,一般是管理員操作 |
2004 | 目前使用者串連被斷開。 | ASP SDK | 用戶端發起斷流,或服務端發起踢人或斷流 |
2005 | %s已逾時中斷連線,因為已達到管理員設定的使用時間長度限制。 | ASP SDK | 管理員設定使用時間長度被關 |
2006 | 管理員已回收了你使用該雲手機的許可權,即將登出並斷開雲手機的串連。 | ASP SDK | 管理員取消了使用者授權 |
2010 | 串連%s失敗 | ASP SDK | Vdagent串連失敗 |
2011 | 串連參數傳遞錯誤。 | ASP SDK | 串連server參數傳遞錯誤 |
2027 | 拉流模式已切換。 | ASP SDK | 拉流模式由搶佔模式切換為協同模式,或由協同模式切換為搶佔模式 |
2100 | 剪下板許可權,禁止從%s到本地 | ASP SDK | 剪貼簿許可權,禁止從VM到本地 |
2101 | 剪下板許可權,禁止從本地到%s | ASP SDK | 剪貼簿許可權,禁止從本地到 VM |
2200 | %s正在嘗試重連... | ASP SDK | 因為網路問題斷開了,ASP SDK正在重連 |
2201 | 您的裝置出現網路異常,導致%s已中斷連線。 | ASP SDK | 因為網路問題斷開了,ASP SDK因為鏡像原因不支援重連,應用側開始重連 |
2202 | %s重連逾時,請檢查裝置網路後重試。 | ASP SDK | ASP SDK重連逾時 |
2210 | 終端裝置休眠時斷開了本網,導致雲手機中斷連線 | ASP SDK | |
2212 | 檢測到您的本網出現異常,導致雲手機中斷連線。 | ASP SDK | |
2220 | 檢測到您的本網出現異常,導致雲手機中斷連線。 | ASP SDK | |
2240 | 由於Ticket中的Token失效,導致重連失敗。 | ||
2300 | 應用側傳參出現異常導致串連失敗。 | ||
2501 | 用戶端串連流網關異常,網路不可達。 | ||
2502 | 用戶端串連流網關異常,TCP串連流網關IP逾時, connect *3次 (共15s)。 | ||
2503 | 用戶端串連流網關異常,未知網路錯誤。 | ||
2504 | 用戶端串連流網關異常,軟體原因串連中斷。 | ||
2505 | 用戶端串連流網關異常,串連被拒絕。 | ||
2506 | Ticket失效,網關解析token失敗。 | ||
2507 | Ticket失效,到期。 | ||
2508 | Ticket失效,uuid不匹配。 | ||
2509 | 流網關探測asp-server 失敗 | ||
2510 | 探測server被拒絕: | ||
2511 | 探測server失敗,timeout和refuse 之外的其他錯誤 | ||
2512 | 流網關token校正失敗 管控token中帶的vpcId和流網關本身所在的vpcId 不一致 | ||
2513 | 用戶端和網關sayhello 過程中tcp收到異常reset | ||
2520 | 用戶端串連失敗,自主診斷出來是網路異常導致的 | ||
2521 | 用戶端再和流網關tls握手階段重連3次三次都異常斷開 | ||
2522 | vpn環境下串連出錯 | ||
2523 | 用戶端正在使用國密協議串連。請確認服務端設定或選擇相容的串連方式。 | ||
2701 | 端側網路問題,建議對比手機5g熱點試試能否串連上。 | ||
2702 | 用戶端到流網關SSL握手逾時 | ||
2703 | 用戶端到流網關SayHello逾時 | ||
2704 | ASP Server回複建鏈訊息逾時 可能原因: asp-server卡死;網路異常;鏡像卡死;mem/cpu high | ||
2705 | Asp Client 等待第一幀逾時 可能原因: asp-server卡死;截屏或者gpu驅動異常沒有幀產生;網路異常;mem/cpu high | ||
2706 | 檢測到用戶端本地的CPU、記憶體使用量率過高可能會導致串連失敗。 | ||
2707 | AspServer 從Guest擷取第一幀截屏資料逾時 | ||
2708 | sdk線程卡住導致串連失敗 | ||
端側邏輯錯誤 | |||
5100 | %s串連ASP Server逾時,請稍後重試。 | 應用側 | 端側在一段時間內未接收到connected事件 |
5102 | 擷取%s資料逾時,請稍後重試。 | 應用側 | 端側在一段時間內接收到了connected但未接收到display事件 |
5004 | 用戶端出現錯誤,請重新開啟 | 應用側 | 傳入端側啟動參數有誤,一般出現在開發階段 |
5200 | 用戶端重連逾時,請稍後重試。 | 應用側 | |
7. 常見問題
如何重啟雲手機
調用管控重啟API 重啟執行個體 進行重啟,調用重啟API後,端側串連的雲手機會斷開,重啟完成後,端側再串連雲手機。
常用ADB命令
功能 | 命令 |
返回鍵 | input keyevent KEYCODE_BACK |
Home鍵 | input keyevent KEYCODE_HOME |
切換鍵 | input keyevent KEYCODE_APP_SWITCH |
靜音 | input keyevent 164 |
音量增大 | input keyevent KEYCODE_VOLUME_UP |
音量減小 | input keyevent KEYCODE_VOLUME_DOWN |
隱藏導覽列 | setprop persist.wy.hasnavibar false; killall com.android.systemui |
顯示導覽列 | setprop persist.wy.hasnavibar true; killall com.android.systemui |
截圖 | screencap -p /sdcard/Download/abc.png |