更新
参考文献:perfecto mobile和device 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 mobile和device 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,想知道它是否会完成这项工作。我会测试并发布结果。
由于
答案 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];
}
}