0

iPhone から自分の Web サイトに画像をアップロードしようとしていますが、最初に認証する必要があります。

私の最初の試みは、NSMutableURLRequest を使用してログイン資格情報を含む HTTP Post 要求を送信し、次に (別の NSURLConnection で) 2 番目の NSMutableURLRequest を使用して同様の方法で画像を送信することでした。しかし、ログインから画像投稿までのセッション データが保持されなかったため、これは失敗しました。2 番目のリクエストでまだ認証エラーが発生します。

私は賢く、非表示の UIWebView を作成し、[webview loadRequest:request];ログインと投稿の両方を呼び出すだけで、リクエストのタイプがNSMutableURLRequest. これはうまく機能し、今では自分のウェブサイトに画像をアップロードできるようになりました.....

....しかし、iPod touch を試してみると、アプリ全体に約 10MB のメモリしか割り当てられていない (プロファイラーのおかげで)という悪名高いメッセージが表示received memory warningされ、続いてアプリがクラッシュします。[webview loadRequest:request];リクエスト自体で、しかし UIWebView がそれをどのように処理するか。UIWebivew の「ビュー」部分が多くのメモリを割り当てていると思います。

これが私の質問です: UIWebViewを使用する必要がないように、NSURLConnections間でセッションとログインデータを保持するにはどうすればよいですか?

疑似コード:

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
    [request setHTTPShouldHandleCookies:YES];
    [request setTimeoutInterval:180];
    [request setHTTPMethod:@"POST"];
    [ request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];

    NSURL* url = [[NSURL alloc]initWithString:@"http://website.com/login.php"];

     NSMutableData *body = [NSMutableData data];
    [body appendData:[@"username=me&password=password&" dataUsingEncoding:NSUTF8StringEncoding]];

    [request setHTTPBody:body];

    NSString *postLength = [NSString stringWithFormat:@"%d", [body length]];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];    

    [request setURL:url];

それで:

    [self.webview loadRequest:request];

または:

    NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];

    if (connection) {
        NSLog(@"Login Opened");
        responseData = [NSMutableData data];
    } else {
        NSLog(@"Logon failed");
        }
4

1 に答える 1

0

認証は、Cookie の正しい機能に依存します。リクエストの 1 つに Web ビューの loadRequest を使用しているようです。両方のリクエストに使用する場合NSURLConnectionは、最初のレスポンスからの Cookie の読み取りと、2 番目のリクエストでの送信を正しく管理する必要があります。( URL Loading System Programming Guideを参照してください。) それでも機能しない場合は、サーバーのセッション Cookie 設定に問題がある可能性があります。

于 2012-10-30T14:07:37.713 に答える