2012-01-06 4 views
2

Webビューを使用してWebサーバー(MySQLバックエンドを持つPHP)とインターフェイスするアプリケーションを開発しています。私は静的URLをテストとして扱うアプリケーションを持っていますが、実際のユーザーのやり取りを調整する必要があります。XCode、Authentication and NSUserDefaults

私はHTTP認証のソリューションを探していましたが、検索結果のほとんどが「REST」リクエストに関連しているため、このフレーズが間違っていると考えています。私は認証を検証するためにURL(PHP/MySQL)を使用し、私の経験に基づいてRESTとして認定されるとは考えていません。

私はまだこのサーバにSSLを持っていないので、どのようなオプションがココア経由で利用できるのか分かりません。

質問は私が持っている:

  1. 負荷は、アカウントIDが既にローカルに格納されていない場合は、そのビューを作成する方法はありますか?

  2. もしそうなら、認証が必要な場合に私が作成したストーリーボードに優先してアプリをコーディングできますか?

  3. ステップ1と2が機能する場合、どのようにしてWebサーバーと認証して認証できますか?

は、理想的には私がちょうどlogin.php?ログイン」のようなURLを提出するのが大好きだ、私は=(つまり、現在データベースに格納されているものであるとして、好ましい方法は、ユーザーのメールアドレスとパスワードのMD5を提出することです) @ blah.com &パスワード=(md5hash) "と答えを返信するか、" auth = true & accountID = 5 "または" auth = false "を入力してからiPhoneアプリを使用して、アカウントのIDをNSUserDefaultsに保存して(後で認証をバイパスする)、通常のストーリーボードを既にロードしておくことができます。

推奨事項があります。

おかげで、あなたはあなたの思考とかなり接近している

シルバータイガー

答えて

3

。私は私のユーザーログインプロセスに非常に似たアプローチを使用しています。

私は現在、電子メールとパスワードを1 40文字のトークンに暗号化してハッシュします。ログインが成功すると、NSUserDefaultsにトークンを保存します。ユーザーがログアウトするまで、このトークンを他のすべてのWebリクエストに使用します。ユーザーのデフォルトが削除されます。ここで

は、私は同じプロセスに使用抜粋です:

// see if a login already exists 
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
self.token = [defaults stringForKey:@"token"]; 

// if the token is nil/blank, launch login view 
if(self.token == nil || [self.token isEqualToString:@""]) { 
    [self loadStartView]; 
    return; 
} 

// build the request to update status 
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyNever]; 
NSString *stringData = [NSString stringWithFormat:@"<your api string here"]; 
NSString *requestData = stringData; 
NSData *myRequestData = [NSData dataWithBytes: [requestData UTF8String] length: [requestData length]]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:[NSString stringWithFormat:@"<your url request here>"]]]; 
[request setHTTPMethod: @"POST"]; 
[request setHTTPBody: myRequestData]; 
NSData *jsonData = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil]; 
NSString *json = [[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding] autorelease]; 
NSDictionary *payloadData = [json JSONValue]; 

[request release]; 

if([[payloadData objectForKey:@"success"] boolValue]) { // this is designed around my api, but you get the idea 
    //NSLog(@"updateStatus: %@", payloadData); 
    // updates the api version for every call 
    [defaults setObject:self.token forKey:@"token"]; 
} 
+0

優れています。これらのスニペットを私のAppDeletageに統合して、それがどうなるかを見てみましょう。私はあなたに知らせるために返信します。 – Silvertiger

+0

私はもう少しお尋ねする必要があると思っています。私は彼のアイデアを得るが、基本起動(タブ付きアプリケーション)をオーバーライドする機能を持たず、代わりにコードで私の認証UIviewを起動し、ストーリーボードに組み込まれたタブ付きアプリを起動しますか? – Silvertiger

+0

アプリが私に与える最初の苦情として注目に値するのは、 "JSONValue"のメソッドがないということです。これを別のインポートに含める必要がありますか? – Silvertiger

2

私はノートにコメントするのに十分なスペースがありませんでした。ここに最終的なコードがあります。私はそれが仕事を得る望まないものをにもかかわらず:

JSONValueは、私がここに見られるようなJSON frameowrkをダウンロードして、私のプロジェクトに含める必要があった仕事を得るために:

https://github.com/stig/json-framework

私がしたらその場所でJSONValue関数から不完全なエラーが発生していました。

{ "成功": "0"、 「アカウントID: "4"、 "エラー": "" }

を次のように私のPHPのページ要求はJSONレスポンスを提供していたと私の元のURL要求JSONValue機能はこの出力を好きではなかったと私は次のように、より基本的なあまり好ましくないバージョンにそれを変更しなければならなかったいくつかの理由

:一度

[「0」、「4」、「」]

私はこのコードの最終コピーを次のように働いていた:

アプリの起動にかかる負荷は、私は、既存のアカウントIDがあったかどうかを判断し、それが存在していなかった場合は、「ログイン」ビューを起動するには、以下を追加したことを私のメインビューで:

- (void)viewDidLoad 
{ 
    NSString *accountID = [[NSUserDefaults standardUserDefaults] stringForKey:@"AccountID"]; 
    if (![accountID length]) { 
     UIViewController *login = [self.storyboard instantiateViewControllerWithIdentifier:@"Login"]; 
     [self presentModalViewController:login animated:YES]; 
    } 
    [super viewDidLoad]; 
} 

ログインは何もありません2つ以上のテキストフィールドと認証のためのボタン。 これは私がボタンに追加された機能であり、それが現在動作します:

-(IBAction)authenticate:(id)sender{ 
    // This will be the validation code 
    // First we'll grab the field values 
    NSString *currentEmail = emailField.text; 
    NSString *currentPassword = passField.text; 
    // Now we will grab the user default settings (saved preferences) 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    // build the request to update status 
    NSString *myURL = [NSString stringWithFormat:@"http://www.myurl.com/auth.php?e=%@&p=%@",currentEmail,currentPassword]; 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:myURL]]; 
    [request setHTTPMethod:@"GET"]; 
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
    NSString *responseString = [[NSString alloc] initWithData:returnData encoding: NSUTF8StringEncoding]; 
    NSArray *responseArray = [responseString JSONValue]; 
    NSString *success = [responseArray objectAtIndex:0]; 
    NSString *AccountID = [responseArray objectAtIndex:1]; 
    NSString *error = [responseArray objectAtIndex:2]; 
    if([success boolValue]) { 
     NSLog(@"User is Authenticated"); 
     UIAlertView *auth1 = [[UIAlertView alloc] initWithTitle:@"T-of-U" message:@"Successfully Authenticated" delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil]; 
     [auth1 show]; 
     [defaults setObject:AccountID forKey:@"AccountID"]; 
     [self dismissModalViewControllerAnimated:YES]; 
    } else { 
     NSString *authMessage = error; 
     UIAlertView *auth2 = [[UIAlertView alloc] initWithTitle:@"Authentication Failed:" message:authMessage delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil]; 
     [auth2 show]; 
    } 
} 

私はキーと値のペアNSDictionaryのを好まれているだろうが、私は、キーと値のペアを持つJSONレスポンスを送信されるすべての時間は、JSONValueはそうできませんでした私は変数を得るために単純なjsonレスポンスと配列オブジェクトを参照オブジェクトにするだけでした。

私はjson応答を正しく形成していないかもしれませんが、キー値のペアを辞書に入れる方法があれば(PHPは期待通りにjson_encode($ data)メソッドを持っていますがObjective C関数は解析しません)。

+0

jsonフレームワークを使用している場合あなたのデータがキーの値のペアで返されたと仮定すると、上の答えで示したように、それを辞書にキャストできなければなりません。あなたのjsonの文字列は、 –

+0

はい、私はキー値のペアを使って返信をどのように構築する必要があるかを解釈しようとし続けなければなりません。私の理解では、{["success": "0"、 "AccountID": "4"、 "error": ""]}の形式がうまくいくはずでしたが、JSONViewは、値の配列["1"、 "4"、 ""]だけです。おそらく巨大な投稿でテーブルビューなどのためのデータの完全なセットを解釈することができれば、私は将来私に恩恵を受けるので、私はまだそれに取り組んでいます。私のが間違っていた可能性がありますか?私はそれが私のPHPデータ要素のようになると推定: "?blah = blah&blah2 = blah2"など? – Silvertiger

+0

jsonlint.comであなたのjsonの文字列をテストしてみてください。 –

関連する問題