如何从浏览器控制手机屏幕?

时间:2015-07-13 07:31:39

标签: android ios mobile

更新
参考文献:perfecto mobiledevice anywhere

我正在开发基于云的移动测试解决方案,该解决方案应同时支持iOS和Android。它需要从浏览器处理连接的移动设备。

我了解到移动设备安装了代理程序(需要植入设备),

  • 将移动屏幕流式传输到浏览器
  • 并注入事件

在没有root / jail破坏设备的情况下,还有其他方法可以实现这一目标吗?

这个问题可能看起来很广泛,但我一直在努力想要朝着正确的方向前进。

对于iOS,我从this SOF question获取线索。

赞赏任何指针。

更新1:
This question接近我正在寻找的东西。

更新2: 我找到了适用于Android设备的Android Screen Library,并在几台设备上进行了测试。它不需要设备被root,但需要在每次设备重启时从命令行重新启动服务,并且无法在Lollipop上运行它。

更新3: 虽然Android Screen Library有助于在没有生根的情况下捕获屏幕,但它对注入事件没有帮助。即使屏幕截图看起来很麻烦 - 有时用黑色补丁捕获并且在棒棒糖上不起作用!

更新4: 参考文献:perfecto mobiledevice anywhere 他们似乎正在使用ADB处理许多内容,例如应用安装/卸载,通过adb shell input tap x y发送事件。请问有人可以解释一下吗?

更新5: 我从this SO Post遇到Adrian Taylor,这是一名前RealVnC工程师。这是最详细的解释。虽然Android Lollipop有MediaProjection个API,但它似乎将屏幕截图存储为sdcard上的MP4文件。此外,根据google dashboard - 2015年8月更新,Lollipop仍然占Android安装基数的15%左右,因此必须考虑Kitkat的任何解决方案。

更新6: 我找到libvncserver,想知道它是否会完成这项工作。我会测试并发布结果。

由于

1 个答案:

答案 0 :(得分:4)

使用WebKit,这将使您获得尽可能接近,并且仍然可能通过Apple的审批流程

这是一个简单的例子,这基本上是在网页上创建一个选择器,在应用程序上将字符串值发送给我,你处理 该值并发回结果,然后您将其作为网页的标题发布。

<h2 id="headline">loading...</h2>
<select id="selector">
    <option value="systemVersion" selected>iOS Version</option>
    <option value="systemName">System Name</option>
    <option value="name">Device Name</option>
    <option value="model">Device Model</option>
    <option value="userInterfaceIdiom">User Interface</option>
    <option value="identifierForVendor">Vendor ID</option>
</select>

这是javascript:

var headline = $("#headline");
var selection = $("#selector");

function set_headline (text) {
    headline.text(text);
}

function call_native () {
    var prop = selection.val();
    set_headline("asked for " + prop + "...");
    window.webkit.messageHandlers.observe.postMessage(prop);
}

setTimeout(call_native, 1000);
selection.on("change", call_native);

在应用程序结束时,您可以设置以下内容:

//配置webView并在屏幕上放置webview

[controller addScriptMessageHandler:self name:@"observe"];
configuration.userContentController = controller;
NSURL *jsbin = [NSURL URLWithString:k_JSBIN_URL];

_webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];
[_webView loadRequest:[NSURLRequest requestWithURL:jsbin]];
[self.view addSubview:_webView];

处理webView事件:

-(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
// Check to make sure the name is correct
    if ([message.name isEqualToString:@"observe"]) {
        // Log the message received
        NSLog(@"Received event %@", message.body);

        // Then pull something from the device using the message body
        NSString *version = [[UIDevice currentDevice] valueForKey:message.body];

        // Execute some JavaScript using the result
        NSString *exec_template = @"set_headline(\"received: %@\");";
        NSString *exec = [NSString stringWithFormat:exec_template, version];
        [_webView evaluateJavaScript:exec completionHandler:nil];
    }
}