Tag: Twitter-OAuth-iPhone

目次

参考情報

デモプロジェクトのビルド

  • zipをダウンロードして展開。Demoフォルダの下にプロジェクトがある。
  • OAuthTwitterDemoViewController.mのConsumerKeyとConsumerSecretを設定
    #define kOAuthConsumerKey				@""		//REPLACE ME
    #define kOAuthConsumerSecret			@""		//REPLACE ME
    

トラブルシューティング

"Select and Copy the PIN"って何?

  • callbackurlがセットされてるとうまくいかないのかも。
  • Issue for Twitter applications with callback URL set · Issue #79 · bengottlieb/Twitter-OAuth-iPhoneに従ってSA_OAuthTwitterViewController.m を修正。
    - (void) webViewDidFinishLoad: (UIWebView *) webView {
        _loading = NO;
        //[self performInjection];
        if (_firstLoad) {
            [_webView performSelector: @selector(stringByEvaluatingJavaScriptFromString:) withObject: @"window.scrollBy(0,200)" afterDelay: 0];
            _firstLoad = NO;
        } else {
            // This else clause modified to work with twitter apps that have the callback URL set: https://dev.twitter.com/apps/
            // Bug details: https://github.com/bengottlieb/Twitter-OAuth-iPhone/issues/79
            [_engine requestAccessToken];
    
            if ([_delegate respondsToSelector: @selector(OAuthTwitterController:authenticatedWithUsername:)])
                [_delegate OAuthTwitterController: self authenticatedWithUsername: _engine.username];
            [self dismissModalViewControllerAnimated:YES];
        }
    
        [UIView beginAnimations: nil context: nil];
        _blockerView.alpha = 0.0;
        [UIView commitAnimations];
    
        if ([_webView isLoading]) {
            _webView.alpha = 0.0;
        } else {
            _webView.alpha = 1.0;
        }
    }
    

GETでパラメータがセットされてない

デモプロジェクトの仕組み

起動時

  • OAuthTwitterDemoViewControllerのviewDidApperから開始。controllerがnilでないならば認証用のWebViewが表示されることになる。
    	UIViewController			*controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _engine delegate: self];
    	
    	if (controller) 
    		[self presentModalViewController: controller animated: YES];
    	else {
    		[_engine sendUpdate: [NSString stringWithFormat: @"Already Updated. %@", [NSDate date]]];
    	}
    
  • SA_OAuthTwitterControllerのcontrollerToEnterCredentialsWithTwitterEngineではSA_OAuthTwitterEngineのisAuthorizedにより認証が必要かどうかの判定を行っている。
    - (BOOL) isAuthorized {	
    	if (_accessToken.key && _accessToken.secret) return YES;
    	
    	//first, check for cached creds
    	NSString					*accessTokenString = [_delegate respondsToSelector: @selector(cachedTwitterOAuthDataForUsername:)] ? [(id) _delegate cachedTwitterOAuthDataForUsername: self.username] : @"";
    
    	if (accessTokenString.length) {				
    		[_accessToken release];
    		_accessToken = [[OAToken alloc] initWithHTTPResponseBody: accessTokenString];
    		[self setUsername: [self extractUsernameFromHTTPBody: accessTokenString] password: nil];
    		if (_accessToken.key && _accessToken.secret) return YES;
    	}
    	
    	[_accessToken release];										// no access token found.  create a new empty one
    	_accessToken = [[OAToken alloc] initWithKey: nil secret: nil];
    	return NO;
    }
    
    
  • OAuthTwitterDemoViewControllerのcachedTwitterOAuthDataForUsernameを利用し、[NSUserDefaults standardUserDefaults]からキャッシュデータを取得。キャッシュされているのは以下のような内容
    oauth_token=xxxxxxxxxxx&oauth_token_secret=yyyyyyyyyyyyyyyyyyyyyyy&user_id=99999999&screen_name=xxxxxxx
  • とりだしたデータからOATokenをアロケートし保存。リクエストごとにセットされる。

認証実証時

  • SA_OAuthTwitterEngine.mのsetAccessToken:withData:が呼び出され、さらに中で、_delegate storeCachedTwitterOAuthDataが呼び出されデータがキャッシュされる。
    - (void) setAccessToken: (OAServiceTicket *) ticket withData: (NSData *) data {
    	if (!ticket.didSucceed || !data) return;
    	
    	NSString *dataString = [[[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding] autorelease];
    	if (!dataString) return;
    
    	if (self.pin.length && [dataString rangeOfString: @"oauth_verifier"].location == NSNotFound) dataString = [dataString stringByAppendingFormat: @"&oauth_verifier=%@", self.pin];
    	
    	NSString				*username = [self extractUsernameFromHTTPBody:dataString];
    
    	if (username.length > 0) {
    		[self setUsername: username password: nil];
    		if ([_delegate respondsToSelector: @selector(storeCachedTwitterOAuthData:forUsername:)]) [(id) _delegate storeCachedTwitterOAuthData: dataString forUsername: username];
    	}
    	
    	[_accessToken release];
    	_accessToken = [[OAToken alloc] initWithHTTPResponseBody:dataString];
    }
    
    
  • ちなみに、username(=@xxxxで使われるscreen_name)は以下のメソッドで取り出されている。
    - (NSString *) extractUsernameFromHTTPBody: (NSString *) body {
    	if (!body) return nil;
    	
    	NSArray					*tuples = [body componentsSeparatedByString: @"&"];
    	if (tuples.count < 1) return nil;
    	
    	for (NSString *tuple in tuples) {
    		NSArray *keyValueArray = [tuple componentsSeparatedByString: @"="];
    		
    		if (keyValueArray.count == 2) {
    			NSString				*key = [keyValueArray objectAtIndex: 0];
    			NSString				*value = [keyValueArray objectAtIndex: 1];
    			
    			if ([key isEqualToString:@"screen_name"]) return value;
    		}
    	}
    	
    	return nil;
    }
    
    

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-13 (水) 16:48:24