iPhone(iOS)でfourSquareの認証、API通信をお手軽にやっちゃう。
iPhoneでのfoursquareの認証が、思った以上にサクッとできちゃったのでメモします。
今回やったのは、foursquareのOauth認証とAPIから自分の情報を取得すること。
Oauth認証は、以下のURLの真似をすれば問題なく認証されます。
https://github.com/anoopr/core-data-talk/blob/master/example/Classes/FoursquareAuthViewController.m
なかにある、
CLIENT_ID
CALLBACK_URL
これらは、foursquareのdeveloperページで登録します。
コードを書く前にこっちを登録したほうがいいでしょう。
登録時「コールバックURLってなんじゃ?」って思ったんですけど、どうやらアクセストークンをつけて返してくれるURLみたいです。まあなんでもいいみたいです。ただ、認証WebViewで最後にちょろっと表示されちゃうので、そのへんは考慮しといていいかも。
上記の2点(Viewの作成と4sqへの登録)がきちんと動くと、UserDefaultにアクセストークンが入ってきます。
が、僕はこの認証をモーダルビューで出したんですが閉じるときに落ちてしまいました。
どうやらコールバックURLを開くときにすでにwebViewがreleaseされてたからだったみたい。
なのできちんと閉じるときには、self.webView.delegate = nil をしておかないと痛い目にあう。
ここまで対応するときちんと閉じる動作まで問題なく動きます。
あとはこのへんにしたがってAPIを書いていくだけです。
最後にgithubの内容をちょっと変えたソース全体を載せておしまいにします。
.h
#import @interface OauthViewController : UIViewController @property(nonatomic,retain,readwrite)UIWebView *webView; @end
.m
#import "OauthViewController.h" @interface OauthViewController () @end @implementation OauthViewController #define CLIENT_ID @"デベロッパーページから持ってくる" #define CALLBACK_URL @"デベロッパーページから持ってくる" - (void)dealloc{ self.webView.delegate = nil; self.webView = nil; [super dealloc]; } - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)loadView { self.view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.webView = [[[UIWebView alloc] initWithFrame:self.view.bounds] autorelease]; self.webView.delegate = self; NSString *authenticateURLString = [NSString stringWithFormat:@"https://foursquare.com/oauth2/authenticate?client_id=%@&response_type=token&redirect_uri=%@", CLIENT_ID, CALLBACK_URL]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:authenticateURLString]]; [self.webView loadRequest:request]; [self.view addSubview:self.webView]; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } #pragma mark - Web view delegate - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if ([request.URL.scheme isEqualToString:@"itms-apps"]) { [[UIApplication sharedApplication] openURL:request.URL]; return NO; } return YES; } - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *URLString = [[self.webView.request URL] absoluteString]; NSLog(@"--> %@", URLString); if ([URLString rangeOfString:@"access_token="].location != NSNotFound) { NSString *accessToken = [[URLString componentsSeparatedByString:@"="] lastObject]; NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:accessToken forKey:@"access_token"]; [defaults synchronize]; [self dismissModalViewControllerAnimated:YES]; } } @end