ASIHTTPRequest を使用して、iPhone アプリを Rails サーバーと通信させています。(おそらく ASIHTTPRequest を使用すべきではなかったことはわかっていますが、今ではかなり投資しており、ほとんどの場合に機能します)。
アプリが起動したら、JSON ファイルを要求するリクエストをサーバーに送信します。以前にログイン資格情報を保存しているかどうかを確認し、それらを使用しているかどうかを確認するために、ASIHTTPRequest を頼りにしています。そうでない場合、リクエストのデリゲートは authenticationNeededForRequest: を実装します。これは、独自のカスタム ログイン ダイアログを表示します。
要求に以前に資格情報が保存されていない場合、サーバーは 401 応答を送信します。問題は、ASIHTTPRequest 内で 401 応答を確認すると、ログに記録されることです。
[AUTH] Request <ASIHTTPRequest: 0x2031a800> received 401 challenge and must authenticate using (null)
これは...の結果です
ASI_DEBUG_LOG(@"[AUTH] Request %@ received 401 challenge and must authenticate using %@%@",self,[self authenticationScheme],realm);
したがって、基本的にレルムはなく、認証方式は null です。認証を取得する他の手段を試すことなく、要求はすぐにあきらめて失敗します。
メインビューで次のようにリクエストを開始しています。
/* When using a storyboard, this method gets called instead of the old initWithNibName:bundle:. */
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
if (self) {
self.delegate = self;
NSURL* url = [NSURL URLWithString:@"http://myserver/file.json"];
[ASIHTTPRequest setDefaultTimeOutSeconds:20];
request = [[ASIHTTPRequest alloc] initWithURL:url];
[request setDelegate:self];
hasConnected = NO;
newPicturesPaths = [[NSMutableArray alloc] init];
}
return self;
}
と ...
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
/* We will try to access the server, if we don't have authentication,
* we'll present the login view. */
[request setAuthenticationScheme:(NSString*)kCFHTTPAuthenticationSchemeBasic];
[request startAsynchronous];
...
}
以前にユーザー名/パスワードを保存していない場合にのみ、必要な動作を実装し、ログイン画面を表示する方法についての提案はありますか (また、後でユーザー名/パスワードを保存します)?
編集:私はこれに基づいてロジックを作成していますが、ASIHTTPRequest が実際に動作する方法ではないようです。