伙计们,
我能够通过向 iOS 客户端发送 HTTP 请求以处理并在 UIAlertView 中返回结果来解决此问题。请注意,所有 iOS 代码修改都包含在 #if DEBUG 条件编译指令中。
首先,将您的客户端设置为在设备抖动时发送通知。阅读这篇文章了解更多信息。
接下来,在您的 iOS 主应用程序委托中添加以下代码:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(deviceShakenShowDebug:)
name:@"DeviceShaken"
object:nil];
然后添加一个看起来像这样的方法:
- (void) deviceShakenShowDebug:(id)sender
{
if (!self.textFieldEnterDebugArgs)
{
self.textFieldEnterDebugArgs = [[[UITextField alloc] initWithFrame:CGRectMake(0, 0, 260.0, 25.0)] autorelease];
self.textFieldEnterDebugArgs.accessibilityLabel = @"AlertDebugArgsField";
self.textFieldEnterDebugArgs.isAccessibilityElement = YES;
[self.textFieldEnterDebugArgs setBackgroundColor:[UIColor whiteColor]];
[self.tabBarController.selectedViewController.view addSubview:self.textFieldEnterDebugArgs];
[self.tabBarController.selectedViewController.view bringSubviewToFront:self.textFieldEnterDebugArgs];
}
else
{
if ([self.textFieldEnterDebugArgs.text length] > 0)
{
if ([self.textFieldEnterDebugArgs.text hasPrefix:@"http://"])
{
[self doDebugHttpRequest:self.textFieldEnterDebugArgs.text];
}
}
}
}
- (void)requestDidFinishLoad:(TTURLRequest*)request
{
NSString *response = [[[NSString alloc] initWithData:((TTURLDataResponse*)request.response).data
encoding:NSUTF8StringEncoding] autorelease];
UIAlertView *resultAlert =
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Request Loaded",@"")
message:response
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK",@"")
otherButtonTitles:nil] autorelease];
resultAlert.accessibilityLabel = @"AlertDebugResult";
[resultAlert show];
}
此代码将在摇晃后将 UITextField 添加到最顶部的视图控制器,直接在任何导航栏或其他 UI 元素上方拍打。UIAutomation 或您的用户可以手动将 URL 输入到此 UITextField 中。当您再次摇动设备时,如果文本以“http”开头,它将在代码中发出 HTTP 请求(读者实现 doDebugHttpRequest 的练习)。
然后,在我的 UIAutomation JavaScript 文件中,我定义了以下两个函数:
function httpGet(url, delayInSec) {
if (!delayInSec) delay = 1;
var alertDebugResultSeen = false;
var httpResponseValue = null;
UIATarget.onAlert = function onAlert(alert) {
httpResponseValue = alert.staticTexts().toArray()[1].name();
alert.buttons()[0].tap();
alertDebugResultSeen = true;
}
var target = UIATarget.localTarget();
var application = target.frontMostApp();
target.shake(); // bring up the input field
application.mainWindow().textFields()["AlertDebugArgsField"].setValue(url);
target.shake(); // send back to be processed
target.delay(delayInSec);
assertTrue(alertDebugResultSeen);
return httpResponseValue;
}
function httpGetJSON(url, delayInSec) {
var response = httpGet(url, delayInSec);
return eval('(' + response + ')');
}
现在,在我的 javascript 文件中,我可以调用
httpGet('http://localhost:3000/do_something')
它将执行一个 HTTP 请求。如果我想从服务器返回 JSON 数据,我会调用
var jsonResponse = httpGetJSON('http://localhost:3000/do_something')
如果我知道这将是一个长期通话,我会打电话给
var jsonResponse = httpGetJSON('http://localhost:3000/do_something', 10 /* timeout */)
我已经成功使用这种方法几个星期了。