皆さん、
HTTP リクエストを iOS クライアントに送信して処理し、結果を 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];
}
このコードは、ナビゲーション バーまたはその他の UI 要素の真上に叩きつけられた後、一番上のビュー コントローラーに UITextField を追加します。UIAutomation またはユーザーは、この UITextField に手動で URL を入力できます。もう一度デバイスを振ると、テキストが「http」で始まる場合、コードで HTTP リクエストが発行されます (リーダーが doDebugHttpRequest を実装するための演習)。
次に、UIAutomation JavaScript ファイルで、次の 2 つの関数を定義しました。
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 */)
私はこのアプローチを数週間うまく使用しています。