コンテンツへスキップ

iPhone(iOS)でfourSquareの認証、API通信をお手軽にやっちゃう。

2012年8月27日

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を書いていくだけです。

認証なしの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

From → iPhone開発

コメントする

コメントを残す