Integrate the iOS SDK for Elastic Cloud Phone into your app to stream and interact with cloud phone instances.
1. Quick start
1.1 Get the SDK and demo
By downloading and using the SDK, you agree to the Alibaba Cloud Workspace SDK Privacy Policy.
Do not distribute them to any third party without Alibaba Cloud's consent.
Integration requirements
Minimum supported iOS version: 10.0
Due to iOS API availability, peripheral mouse and keyboard features require iOS 13.4 or later.
SDK integration
-
Unzip the SDK and copy it into your project.
-
Link the SDK library.
Go to Target --> Build Phases --> Link Binary With Libraries --> + --> Add Other --> Add Files and select the required framework.
-
Set the embed option.
Go to Target --> General --> Frameworks, Libraries, and Embedded Content, find ASPEngineSDK.framework, and select Embed Without Signing.
SDK permissions
Add the required permissions for ASPEngineSDK to your project's Info.plist file.
1. Microphone permission
Privacy - Microphone Usage Description
2. Camera permission
Privacy - Camera Usage Description
SDK signing
The SDK is a dynamic library and must be signed for on-device debugging or for App Store submission.
-
Get a signing ID
To find your signing ID, run:
security find-identity -v -p codesigning
If you don't have a local certificate, log in to your Apple Developer account and download the provisioning profile. Right-click the downloaded file, choose Get Info, and find the SHA-1 field of the target certificate. This value is the signing ID.
-
Signing & Capabilities
In your project target, correctly configure the certificate in the Signing & Capabilities tab.
-
Add a signing shell script. This script is required for physical devices but not for simulators.
Go to Target --> Build Phases --> + --> New Run Script Phase and paste the shell script content. See the sample signing shell script below.
Note: This Run Script phase must be placed after the Embed Frameworks phase.
-
Sample signing shell script
set -e
SHELL_PATH="${PROJECT_DIR}/ASPDemo/Lib/ASPEngineSDK/ASPEngineSDK.framework/link_and_sign.sh"
KEY_ID="Your certificate's signing ID"
echo "===> Signing using $KEY_ID"
/bin/bash -c "${SHELL_PATH}"\ "${TARGET_BUILD_DIR}"\ "${FRAMEWORKS_FOLDER_PATH}"\ "${KEY_ID}"
Project configuration
Disable Bitcode.
Go to Target --> Build Settings --> Build Options --> Enable Bitcode and set the option to No.
1.2 Integration workflow
1.3 Best practices
See Best practices for quick integration with cloud phones. The following diagram outlines the integration architecture.
Multiple login methods can provide the connection ticket required by the SDK. The following diagram illustrates these workflows.
For code examples, see the lifecycle API sample code.
2. Lifecycle API
2.1 Initialize instance
+ (instancetype)buildStreamView;
2.2 Establish connection
- (void)startWithTicket:(ASPConnTicket*) ticketParam;
ASPConnTicket parameters:
|
Parameter |
Description |
|
connTicket |
Connection ticket for authentication. |
|
caFilePath |
Absolute path to the CA file for TLS encryption. |
|
desktopId |
Application instance ID, such as |
|
useVpc |
Whether to connect over a VPC. |
|
enableTls |
Enables encrypted transmission. Recommended: YES. |
|
enableStatistics |
Enables tracking. Recommended: YES. |
|
preferRtcTransport |
Enables the RTC channel. Recommended: YES. |
2.3 Disconnect
- (int)stop;
2.4 Pause
Pauses the stream from the server and rendering on the client.
- (void)pause;
2.5 Resume
Resumes the stream from the server and rendering on the client.
- (void)resume;
2.6 Dispose instance
- (void)dispose;
2.7 Callbacks
// Callbacks for the Elastic Cloud Phone connection.
@property (nonatomic, weak) id<ASPEngineDelegate> engineDelegate;
// Callback for resolution changes.
@property (nonatomic, weak) id<ASPEngineResolutionUpdateDelegate> resolutionUpdateDelegate;
// Callbacks for the mouse cursor.
@property (nonatomic, weak) id<ASPEngineCursorDelegate> cursorDelegate;
// Callback for orientation changes of the Elastic Cloud Phone.
@property (nonatomic, weak) id<ASPEngineOrientationUpdateDelegate> orientationUpdateDelegate;
// Callbacks for tracking.
@property (nonatomic, weak) id<ASPEngineStatisticsDelegate> statisticsDelegate;
// Callbacks for the Input Method Editor (IME). Not supported by Elastic Cloud Phone.
@property (nonatomic, weak) id<ASPEngineIMEDelegate> imeDelegate;
// Callbacks for logs. We recommend using a singleton for the delegate.
+ (void)setASPEngineLogDelegate:(id<ASPEngineLogDelegate>)delegate;
+ (void)unsetASPEngineLogDelegate;
ASPEngineDelegate: Callbacks for Elastic Cloud Phone connections
|
API |
Description |
|
onConnectionSuccess:(int)connectId |
Called when the connection to the ECP is established. Returns the connection ID. |
|
onConnectionFailureWithErrCode:(int)errCode errMsg:(NSString*)errMsg |
Called when the connection to the ECP fails. Returns an error code and an error message. |
|
onEngineErrorWithErrCode:(int)errCode errMsg:(NSString*)errMsg |
Called when an internal SDK error occurs. Returns an error code and an error message. |
|
onDisconnected:(int)reason |
Called when the ECP connection is disconnected. Returns the disconnect reason code. |
|
onFirstFrameRendered:(long)timeCostMS |
Called when the first ECP frame is rendered. Returns the elapsed time in milliseconds. |
|
onReconnect:(int)errorCode |
Called when the SDK attempts to reconnect. Returns the error code that triggered the reconnection. |
|
onPolicyUpdate:(NSString *)policy |
Called when the ECP policy is updated. Returns the policy configuration. |
|
onUpdateNetworkQos:(AspNetworkQoS)qos |
Reports the network Quality of Service (QoS) status. |
|
onSessionSuccess |
Called when the ECP session is created. |
ASPEngineResolutionUpdateDelegate: Callbacks for resolution changes
|
API |
Description |
|
onResolutionUpdateWithOldWidth:(int)oldWidth oldHeight:(int)oldHeight width:(int)width height:(int)height |
Called when the resolution changes. Returns the old and new resolutions. |
|
onMonitorsDpiConfig:(int)dpi maxSupportDpi:(int)maxSupportDpi |
Provides the DPI configuration and the maximum supported DPI. Not supported by Elastic Cloud Phone. |
ASPEngineCursorDelegate: Callbacks for the mouse cursor
|
API |
Description |
|
onCursorBitmapUpdateWithHotX:(int)hotX hotY:(int)hotY width:(int)width height:(int)height rgba:(char*)rgba |
Called when the cursor bitmap is updated. Provides the cursor's hot spot coordinates, dimensions, and RGBA data. |
|
onCursorReset |
Called when the mouse cursor is reset. |
|
onCursorHide |
Called when the mouse cursor is hidden. |
|
onCursorMoveWithX:(int)x y:(int)y |
Called when the mouse cursor moves. Provides the new coordinates. |
ASPEngineStatisticsDelegate: Callbacks for tracking
|
API |
Description |
|
onStatisticsInfoUpdate:(ASPStatisticsInfo *)info |
Reports ECP performance statistics in an |
ASPEngineLogDelegate: Callbacks for logs. We recommend using a singleton for this delegate.
|
API |
Description |
|
onLogMessage:(NSString*)msg tag:(NSString*)tag level:(AspLogLevel)level |
Called for each SDK log message. Provides the log message, tag, and level for each entry. |
3. Service API
|
API |
Description |
|
- (BOOL)enableStatistics:(BOOL) enabled enableGuestInfo:(BOOL)enableGuestInfo |
Enables or disables statistics and guest CPU usage collection. |
|
- (BOOL)enableMouseMode:(BOOL)enabled |
Enables or disables mouse mode. |
|
@property (nonatomic, assign) BOOL enableDump; |
Enables or disables dumping. This feature affects performance and is for development and debugging only. Do not use in production. |
|
- (BOOL)sendKeyboardEvent: (ASPKeyEvent) event; |
Sends a keyboard event. |
|
// The - (BOOL)simulateMouseClick:(BOOL)leftButton; - (BOOL)simulateMouseClick:(BOOL)leftButton x:(float)x y:(float)y; |
Simulates a mouse click. |
|
- (void)hideCursor; - (void)showCursor; |
Hides or shows the cursor. |
|
- (void)setVideoProfileWithWidth:(int)width height:(int)height fps:(int)fps; |
Sets the resolution. The |
|
@property (nonatomic, assign) BOOL mute; |
Mutes or unmutes the audio. |
|
@property (nonatomic, assign) ASPScaleType scaleType; |
Scale type for the video stream. See section 5.1 |
|
- (void)enableDesktopMode:(BOOL)enabled; |
Enables or disables desktop mode. When enabled, touch messages are converted to mouse events. For cloud phones, recommended: NO. |
|
- (void)enableDesktopGesture:(BOOL)enabled; |
Enables or disables client-side zoom and pan gestures. For cloud phones, recommended: NO. |
|
@property (nonatomic, assign) BOOL enableTouchFeel; |
Enables or disables haptic feedback. The default value is NO. |
|
LyncChannel |
Channel for sending ADB commands. For an example, see |
|
DataChannel |
Custom data channel for communication between the client and the guest. For an example, see |
LyncChannel example
// The default LyncChannel name is: static NSString *LYNC_CHANNEL_NAME = @"lync_adb_shell";
// Add the LyncChannel
self.lync = [[DemoLyncChannel alloc] initWithParameter:LYNC_CHANNEL_NAME];
[self.streamView addLyncChannel:self.lync];
// Remove the LyncChannel
[self.streamView removeLyncChannel:self.lync];
// LyncChannel implementation
@interface DemoLyncChannel : BaseLyncChannel
@property (nonatomic, strong) NSString *lslaID;
@end
@implementation DemoLyncChannel
- (void)onConnectStateChanged:(BOOL)connected {
NSLog(@"[DemoLyncChannel] onConnectStateChanged %d", connected);
if (connected) {
// Test sending a command
self.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: Received result for 'ls -la'.");
}
}
- (void)onReceiveRawData:(NSData * _Nonnull)buf {
NSString *string = [[NSString alloc] initWithData:buf encoding:NSUTF8StringEncoding];
NSLog(@"[DemoLyncChannel] onReceiveRawData %@", string);
}
@end
DataChannel example
// The default DataChannel name is: static NSString *DATA_CHANNEL_NAME = @"wy_vdagent_default_dc";
// Add the DataChannel
self.esdAgent = [[DemoEDSAgentChannel alloc] initWithParameter:DATA_CHANNEL_NAME];
[self.streamView addDataChannel:self.esdAgent];
// Remove the DataChannel
[self.streamView removeDataChannel:self.esdAgent];
// DataChannel implementation
@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] onReceiveData %@", string);
}
@end
The message channel uses the DataChannel named wy_vdagent_default_dc.
The message size is limited to 500 KB.
The basic message format is as follows:
DataChannel: Messages from client to guest
Action: insertcontact, insertsms, or sendcontactvcf
-
insertcontact: Inserts a contact.
The required name parameter specifies the contact name.
The required phonenumber parameter specifies the phone number.
-
insertsms: Inserts an SMS.
The required phonenumber parameter specifies the phone number.
The required textbody parameter specifies the SMS content.
The optional canInsertdb parameter specifies whether to insert the message into the cloud phone's SMS database. The default is 0 (do not insert); set to 1 to insert.
Example: let jsonarray = [{'action': 'insertcontact','importdata':[{ 'name': '**', 'phonenumber': '**' }, { 'name': '**', 'phonenumber': '**' }]},{'action': 'insertsms','importdata':[{'phonenumber':'**','textbody':'**,"canInsertdb":0/1}]}]
-
sendcontactvcf: Inserts contacts from a vcf file.
The required data parameter contains the vcf file data stream. Large files must be chunked, with a maximum chunk size of 1 MB.
The required allsize parameter is the total size of the vcf data.
The timestamp parameter is required. Use the same timestamp for all chunks of a single vcf file to ensure correct reassembly.
Example: {'action': 'sendcontactvcf', 'importdata': {'data': '', 'allsize': total_file_size, 'timestamp': current_timestamp}}.
public void processByteArrayInChunks(byte[] data) {
int chunkSize = 512 * 1024; // 512 KB
int 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 = getAction(message);
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) {
// Write recvData to a vcf file and insert contacts.
insertContact(vcfFilePath);
sendack();
clearRecv();
}
}
}
public void clearRecv() {
recvData = "";
recvSize = 0;
recvTimestamp = 0;
}
DataChannel: Messages from guest to client
Action: openeditsms, openphone, or rotation
-
openeditsms: Opens the SMS editor page.
The optional importdata.phonenumber parameter specifies the phone number.
The optional textbody parameter specifies the SMS content.
Example: {'action': 'openeditsms',importdata:{"phonenumber":"***", "textbody":"***"}}
-
openphone: Opens the phone dialer page.
The optional importdata.phonenumber parameter specifies the number to call. If provided, the dialer opens with this number; otherwise, the main dialer page opens.
Example: {'action': 'openphone','importdata':{"phonenumber":"***"}} or {'action': 'openphone'}
DataChannel ACK message
Action: ack
-
ack: Reports the processing status of a received message. Either the client or guest can send anackresponse if required by the application's logic.
The required source parameter is the action from the original message.
The required code parameter is the status code, with the following valid values: 0 (Unknown), 1 (Executing), 2 (Success), 3 (Failure), and 4 (Not Supported).
Example: {'action': 'ack','importdata':{"source":"***", "code": *,"id":*}}
4. Parameters
4.1 ASPConnTicket
Configuration parameters to establish a connection.
|
Parameter |
Description |
|
connTicket |
Connection authentication ticket. |
|
caFilePath |
The absolute path to the CA file, used for TLS encryption. |
|
desktopId |
Application instance ID, such as |
|
useVpc |
Whether to connect over a VPC. |
|
enableTls |
Enables TLS encryption. Recommended: YES. |
|
enableStatistics |
Enables statistics. Recommended: YES. |
|
preferRtcTransport |
Enables the RTC channel. Recommended: YES. |
4.2 ASPStatisticsInfo
Performance data.
|
API |
Type |
Description |
|
mReceiveFps |
int |
Received FPS |
|
mRenderFps |
int |
Render FPS |
|
mDownstreamBandwithMBPerSecond |
double |
Downstream bandwidth |
|
mUpstreamBandwithMBPerSecond |
double |
Upstream bandwidth |
|
mP2pFullLinkageLatencyMS |
long |
End-to-end full-link latency. Deprecated. |
|
mNetworkLatencyMS |
long |
Network RTT |
|
mPingGatewayRtt |
long |
Ping RTT |
|
mLostRate |
double |
Packet loss rate |
|
mServerRenderLatencyMS |
long |
Server-side rendering latency |
|
mServerEncoderLatencyMS |
long |
Server-side encoding latency |
|
mServerTotalLatencyMS |
long |
Server-side total latency |
|
accumulateBandwidth |
long |
Total bandwidth |
|
mGuestCpuUsage |
long |
Guest CPU usage |
|
mStreamType |
String |
Stream protocol type |
|
infoDic |
NSDictionary |
A map of performance data. |
5. Enumeration types
5.1 ASPScaleType
Content scaling type for a streamed image.
|
Parameter |
Description |
|
ASPScaleTypeFill |
Stretches the streamed image to fill the entire StreamView. This may cause distortion if the image's aspect ratio differs from the view's. |
|
ASPScaleTypeFit |
Scales the streamed image to fit within the StreamView, preserving its aspect ratio. This displays the entire image without distortion, but may leave parts of the view empty. |
Error codes
Error code | Error message ( | Module | Cause |
Error codes 2–26 are primarily related to network issues. | |||
2 | Failed to connect to %s. | ASP SDK | Invalid MAGIC value. |
3 | Failed to connect to %s. | ASP SDK | Invalid data. |
4 | The client and server versions do not match. | ASP SDK | Version mismatch. |
5 | A TLS connection is required. | ASP SDK | The server requires a TLS connection, but the client did not initiate one. |
6 | Unexpected TLS connection. | ASP SDK | The connection does not require TLS, but it was used. |
7 | Permission denied to connect to %s. | ASP SDK | Insufficient permissions. |
8 | Invalid client ID during migration. | ASP SDK | Invalid client ID during migration. |
9 | Failed to connect to %s. | ASP SDK | The channel does not exist. |
20 | Failed to connect to the ASP server. | ASP SDK | Channel connection error. |
21 | A TLS authentication error occurred. | ASP SDK | TLS authentication error. |
22 | Failed to connect to %s. | ASP SDK | Channel link error. |
23 | Failed to connect to %s. | ASP SDK | Connection authentication error. |
24 | Failed to connect to %s. | ASP SDK | Connection I/O error. |
25 | Failed to connect to %s. | ASP SDK | Ticket validation failed. This error also occurs when reusing a ticket from a terminated session. |
26 | xquic handshake failed. | ASP SDK | xquic handshake failed. |
1206 | The ticket is already in use. | ASP SDK | A ticket can be reused, but only for one connection at a time. This error occurs if you attempt to establish a new connection while the cloud phone is already in use. |
1207 | Ticket invalidated by instance restart. | ASP SDK | The instance was restarted, which invalidated the ticket. |
SDK error codes for collaborative mode | |||
1000 | Token is empty. | ASP SDK | These errors occur only in collaborative mode when the secondary validation between the client and the server fails. |
1001 | User is empty. | ASP SDK | |
1200 | Token is invalid. | ASP SDK | |
1201 | VM is invalid. | ASP SDK | |
1202 | An admin internal error occurred. | ASP SDK | |
1203 | User is invalid. | ASP SDK | |
1204 | The token has expired. | ASP SDK | |
1500 | A server internal error occurred. | ASP SDK | |
1501 | A server network error occurred. | ASP SDK | |
Connection interruptions and other errors | |||
2000 | Disconnected from the server because fetching data from %s timed out. | ASP SDK | Data fetch timeout. |
2001 | %s disconnected from the server, possibly because its process was terminated. | ASP SDK | This typically occurs when the process on the client-side is terminated. For example, an Android app is closed by the user pressing the Home button. |
2002 | Another user has connected to the current %s from a different terminal. | ASP SDK | The session was taken over by another user in preemptive mode. |
2003 | %s is shutting down or restarting. This is usually an administrator-initiated action. | ASP SDK | The cloud phone was shut down or restarted, typically by an administrator. |
2004 | The current user connection was terminated. | ASP SDK | The client initiated the disconnection, or the server triggered a kick or disconnect action. |
2005 | Session disconnected: usage time limit reached. | ASP SDK | The session was terminated because it reached the usage duration limit set by the administrator. |
2006 | Your permission to use this cloud phone has been revoked by the administrator. You will be logged out and disconnected. | ASP SDK | The user's authorization was revoked by an administrator. |
2010 | Failed to connect to %s. | ASP SDK | Failed to connect to Vdagent. |
2011 | An error occurred while passing connection parameters. | ASP SDK | An invalid parameter was passed when connecting to the server. |
2027 | The stream pull mode was switched. | ASP SDK | The stream pull mode was switched from preemptive mode to collaborative mode, or from collaborative mode to preemptive mode. |
2100 | Clipboard permission denied to copy from %s to the local device. | ASP SDK | Clipboard access from the remote instance to the local client is denied by policy. |
2101 | Clipboard permission denied to copy from the local device to %s. | ASP SDK | Clipboard access from the local client to the remote instance is denied by policy. |
2200 | %s is attempting to reconnect... | ASP SDK | The connection was lost due to a network issue, and the ASP SDK is attempting to reconnect. |
2201 | Your device encountered a network anomaly, causing %s to disconnect. | ASP SDK | The connection was lost due to a network issue. The ASP SDK does not support reconnection due to image constraints; the app-side must initiate the reconnection. |
2202 | Reconnection to %s timed out. | ASP SDK | The ASP SDK reconnection attempt timed out. |
2210 | Connection lost while the client device was asleep. | ASP SDK | The local network was disconnected while the client device was asleep, which caused the cloud phone connection to be lost. |
2212 | Connection lost due to a local network anomaly. | ASP SDK | A local network anomaly was detected, which caused the cloud phone to disconnect. |
2220 | Connection lost due to a local network anomaly. | ASP SDK | A local network anomaly was detected, which caused the cloud phone to disconnect. |
2240 | Reconnection failed because the token in the ticket is invalid. | ASP SDK | |
2300 | Connection failed due to an invalid parameter from the app-side. | app-side | |
2501 | The client failed to connect to the stream gateway. The network is unreachable. | stream gateway | |
2502 | The client failed to connect to the stream gateway. The TCP connection to the stream gateway IP address timed out after three attempts (15 seconds total). | stream gateway | |
2503 | The client failed to connect to the stream gateway due to an unknown network error. | stream gateway | |
2504 | The client failed to connect to the stream gateway. The connection was aborted by software. | stream gateway | |
2505 | The client failed to connect to the stream gateway. The connection was refused. | stream gateway | |
2506 | The ticket is invalid. The gateway failed to parse the token. | stream gateway | |
2507 | The ticket is invalid because it has expired. | stream gateway | |
2508 | The ticket is invalid due to a UUID mismatch. | stream gateway | |
2509 | The stream gateway failed to probe the ASP server. | stream gateway | |
2510 | The probe to the server was rejected. Resolution: Ensure that the server is listening on port 5912. | stream gateway | |
2511 | The probe to the server failed due to an error other than a timeout or refusal. | stream gateway | |
2512 | The stream gateway token validation failed. The VPC ID in the management token does not match the VPC ID of the stream gateway. | stream gateway | |
2513 | The TCP connection was reset during the "SayHello" handshake between the client and the stream gateway. | stream gateway | |
2520 | The client connection failed; a self-diagnostic check indicates a network anomaly. | ASP SDK | |
2521 | The client was disconnected after three failed reconnection attempts during the TLS handshake phase with the stream gateway. | ASP SDK | |
2522 | A connection error occurred in a VPN environment. | ASP SDK | |
2523 | The client is attempting to connect by using the GM/T protocol suite. Verify the server configuration or select a compatible connection method. | ASP SDK | |
2701 | A client-side network issue occurred. | ASP SDK | |
2702 | The SSL handshake between the client and the stream gateway timed out. | ASP SDK | |
2703 | The "SayHello" handshake between the client and the stream gateway timed out. | ASP SDK | |
2704 | The ASP server response to the connection establishment request timed out. Possible causes: The ASP server is unresponsive, network anomaly, frozen instance, or high memory/CPU usage. | ASP SDK | |
2705 | The ASP client timed out while waiting for the first frame. Possible causes: The ASP server is unresponsive, no frames are being generated due to a screen capture or GPU driver issue, a network anomaly, or high memory/CPU usage. | ASP SDK | |
2706 | High local CPU or memory usage on the client may cause connection failures. | ASP SDK | |
2707 | The ASP server timed out while retrieving the first screen capture frame from the guest OS. | ASP SDK | |
2708 | Connection failed because an SDK thread is stuck. | ASP SDK | |
Client-side logic errors | |||
5100 | The connection from %s to the ASP server timed out. | app-side | The client-side did not receive a "connected" event within the specified time period. |
5102 | Fetching data from %s timed out. | app-side | The client-side received a "connected" event but did not receive a "display" event within the specified time period. |
5004 | Invalid startup parameters. | app-side | Invalid startup parameters were passed to the client-side. This typically occurs during development. |
5200 | Client reconnection timed out. | app-side | |
FAQ
Restart Elastic Cloud Phone
To restart an instance, call the Restart Instance API. This disconnects the ECP from the client. After the instance restarts, reconnect to it.
Common ADB commands
|
Function |
Command |
|
Back button |
input keyevent KEYCODE_BACK |
|
Home button |
input keyevent KEYCODE_HOME |
|
App switch button |
input keyevent KEYCODE_APP_SWITCH |
|
Mute |
input keyevent 164 |
|
Volume up |
input keyevent KEYCODE_VOLUME_UP |
|
Volume down |
input keyevent KEYCODE_VOLUME_DOWN |
|
Hide navigation bar |
setprop persist.wy.hasnavibar false; killall com.android.systemui |
|
Show navigation bar |
setprop persist.wy.hasnavibar true; killall com.android.systemui |
|
Screenshot |
screencap -p /sdcard/Download/abc.png |