Objective-Cで外部APIとの連携方法メモ
IPhoneアプリ用に外部APIとの連携を試してみたので、メモ。
twitterクライアントや簡易ゲームの得点一覧(保存、読み込み)などに利用できる。
httpリクエスト
stringWithContentsOfURL:encoding:error:メソッド
○簡単にネットワーク上のテキスト情報を取得可能。
×データの取得が終わるまで処理が止まってしまう
(例)test.comのhtmlソースを取得する
-(void)viewDidLoad{ NSURL *url = [NSULR URLWithString:@"http://test.com"]; NSString *html = [NSString stringWithContentsOfURL:url encoding:エンコード error:nill]; }
NSURLRequestメソッド
○非同期にネットワークの情報を取得する事ができる
×処理がstringWithContentsOfURLに比べると複雑
(例)twitterAPIを利用して「変態仮面紳士」を検索する
-(void)viewDidLoad{ NSString *searchString = @"変態仮面紳士"; NSString *urlString = [NSString stringWithFormat:@"http://search.twitter.com/search.json?q=%@",searchString]; NSURL *url = [NSURL URLwithString:urlString]; //NSURLRequestクラスのインスタンスを生成 NSURLRequest *req = [NSURLRequest requestWIthURL:url]; //リクエスト情報を使って通信を行う NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:req delegate:self]; if(conn == nil){return;} //4つのデリゲートメソッドを実装。 //didReceiveResponse レスポンスの受け取りを開始したとき(データ受信準備) -(void)connection:(NSURLConnection *)connection didReceiveResponse{} //didReceiveData データを受信する(受信するデータによっては何度も呼ばれる) -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *){} //DidFinishLoading データ受信が成功したとき -(void)connectionDidFinishLoading:(NSURLConnection *)connection{} //didFailWithError データ受信が失敗したとき -(void)connection:(NSURLConnection *)connection didFailWIthError:(NSError)error{} }
データの保持
NSMutableDataによるデータの保持
NSMutableData---変更可能なクラス
NSData---変更不可能なクラス
(例)受信したデータをインスタンスに追加するコード
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ [receivedData appendData:data]; }
NSMutableArrayによるデータの保持
MSMutableArray---変更可能な配列
MSArray---変更不可能な配列
(例)受信したデータをインスタンスに追加するコード
NSArray *items = [result objectForKey:@"results"]; for(NSDictionay* tweet in items){ NSLog(@"- %@",[tweet objectForKey:@"text"]); [tweetsArray addObject:[tweet objectForKey:@"text"]]; }
JSONの解析
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{ NSString *json = [[NSString alloc] initWithData:receivedData encoding NSUTF8StringEncoding]; self.textField.text=json; NSDirectory *result = [json JSONValue]; NSArray * items = [result object ForKey:@"results"]; for(NSDictionary* tweet in items){ NSLog(@"- %@",[tweet objectForKey:@"text"]); } }