iPhone, UIWebView, Twitter, OAuth의 PIN 값 파싱


트위터 연동에서 PIN 값을 찾아서 자동으로 인증을
시켜 주는 부분을 찾았다.
아직 적용은 시켜 보지 못했다.


- (NSString *) locateAuthPinInWebView: (UIWebView *) webView {
NSString *js = @"var d = document.getElementById('oauth-pin'); if (d == null) d = document.getElementById('oauth_pin'); if (d) d = d.innerHTML; if (d == null) {var r = new RegExp('\\\\s[0-9]+\\\\s'); d = r.exec(document.body.innerHTML); if (d.length > 0) d = d[0];} d.replace(/^\\s*/, '').replace(/\\s*$/, ''); d;";
NSString *pin = [webView stringByEvaluatingJavaScriptFromString: js];
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerText"];

if (html.length == 0) return nil;

const char *rawHTML = (const char *) [html UTF8String];
int length = strlen(rawHTML), chunkLength = 0;

for (int i = 0; i < length; i++) {
if (rawHTML[i] < '0' || rawHTML[i] > '9') {
if (chunkLength == 7) {
char *buffer = (char *) malloc(chunkLength + 1);

memmove(buffer, &rawHTML[i - chunkLength], chunkLength);
buffer[chunkLength] = 0;

pin = [NSString stringWithUTF8String: buffer];
free(buffer);
return pin;
}
chunkLength = 0;
} else
chunkLength++;
}

return nil;
}

다음은 “locateAuthPinInWebView” 메소드가 불려지는 곳이다.


- (void) webViewDidFinishLoad: (UIWebView *) webView {
_loading = NO;
if (_firstLoad) {
[_webView performSelector: @selector(stringByEvaluatingJavaScriptFromString:) withObject: @"window.scrollBy(0,200)" afterDelay: 0];
_firstLoad = NO;
} else {
NSString *authPin = [self locateAuthPinInWebView: webView];

if (authPin.length) {
[self gotPin: authPin];
return;
}

NSString *formCount = [webView stringByEvaluatingJavaScriptFromString: @"document.forms.length"];

if ([formCount isEqualToString: @"0"]) {
[self showPinCopyPrompt];
}
}

[UIView beginAnimations: nil context: nil];
_blockerView.alpha = 0.0;
[UIView commitAnimations];

if ([_webView isLoading]) {
_webView.alpha = 0.0;
} else {
_webView.alpha = 1.0;
}
}

참고 URL : http://github.com/bengottlieb/Twitter-OAuth-iPhone/blob/master/Twitter+OAuth/SAOAuthTwitterEngine/SA_OAuthTwitterController.m

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중