iPhone 을 위한 Open API 사용시에 사용하기 좋은 라이브러리
요즘 OpenAPI 작업을 좀 하고 있다. 마지막 업무이기 때문에 유종의미를 거둬야겠다고 생각은 하지만, 어째 쉽게 손이 가지는 않는다. 마지막이라는 허전함 때문일까? 어쨌든 좋다.
iPhone library for flickr.com
[ObjectiveFlickr - Blog]
http://lukhnos.org/objectiveflickr/blog/
[ObjectiveFlickr - Download]
http://github.com/lukhnos/objectiveflickr/tree/master
1.0 은 별로라는 말이 많고, 2.0 버전이 iPhone 에서 잘 구동됨을 확인하였다. 전부 테스트 한 건 아니고 로그인과 파일업로드만 해봤는데 문제없이 동작하는데 성공하였다. 프로그래밍하기전에 문서한번 가볍게 살펴보고 하는게 좋을것이다.
iPhone library for twitter.com
[MGTwitterEngine]
http://mattgemmell.com/2008/02/22/mgtwitterengine-twitter-from-cocoa
사용하는데 큰 어려움은 없을것이다. 문서가 없는건지 못찾은건지가 흠이겠지만, 로그인 & 상태전송만 하기에는 큰 문제가 없었다. 예전회사의 팀장님의 표현을 빌리자면 "이런건 반나절이면 뚝딱이죠"
iPhone library for facebook.com
[MKAbeFook]
http://pointlesscrap.net/mkabefook
써볼려고 방금 다운 받았다. Descktop 과 Mobile 이 있으니 꼭 Mobile 을 다운받고, 예제도 있으니 한번 돌려보시라, 문서는 있는지 없는지 아직 모르겠지만 예제가 있으므로 예제에서 적당히 찾아서 사용해보자. 예제를 컴파일 해봤는데, 문제없이 구동되었다. 하지만......
내가 만든 프로젝트에 라이브러리 파일들을 추가하고 컴파일을 해보니, libxml 헤더파일들을 찾을 수 없다는 컴파일 에러가 발생했다. 그래서 구글 검색을 통해서 찾아낸 해결책은 Header Search Paths 에 /usr/include/libxml2 를 추가함으로써 해결하였다.

위처럼 했을때 문제 컴파일이 됨을 확인할 수 있었다. 하지만 난 조금 다르게 셋팅을 하였다.
[Header SEarch Paths]
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/include/libxml2/**
[Frameworks]
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/lib/libxml2.2.dylib
컴파일 성공.
하지만 컴파일 성공 이후에도 장벽은 많았다. 플리커와 인증방식이 조금 다르다는게 흠인데...
첫번째는 용어가 조금 다르다. 하지만 개념은 비슷한데
플리커 : Frob 을 이용하여 인증 Token 을 받음
페이스북 : Token 을 이용하여 인증 Session 을 받음
용어가 다르니 혼동의 여지가 있을수가 있겠다. 이 부분은 사실 큰 문제가 되지 않는데..
두번째는 콜백의 유무다.
플리커 : openapi:// 이런식으로 콜백으로 넘겨줌으로써 브라우저를 통해서 애플리케이션 호출이 가능함. 이 경우 특정 함수가 호출이 되므로 인증후 콜백으로 인식할 수 있음
페이스북 : 콜백에 반드시 http:// 또는 https:// 이것을 적어줘야 하는데, 앞에 저게 붙어서는 브라우저를 통한 애플리케이션 호출이 불가능하다. 결국 로그인을 해서 인증 Session 을 받게되면 사용자가 버튼을 누른다거나 하는 방식으로 인증이 되었다는 이벤트를 발생시켜줘야 한다.
페이스북을 어떻게 할까 생각하다가 타이머를 이용하여 인증여부를 Polling 하는 방법을 생각해 보고있다. 코드좀 보고 대략 시뮬레이터 해보니 가능할것 같긴한다. 일단 해보고 안되면 Facebook Connect 를 봐던지 해야할 것 같다. Facebook Connect 로서는 아무래도 원하는 구성이 힘들것 같긴 한데..
Polling 방법으로 해봤는데
"로그인 중 오류가 발생했을 가능성이 있습니다. 이 창을 닫으시고 다시 이전 응용 프로그램으로 돌아가실 수 있으나, 다시 로그인이 필요할 수 있습니다. 이 오류는 사용중이던 응용 프로그램의 오류일 가능성이 높습니다"
이유야 어쨌든 로그인 하기전에 facebook.auth.getSession 호출하면 안된다는것이다. T.T
그렇다고 방법이 전혀 없는건 아니다. 그렇다면.... 내장브라우저객체를 사용하고 있으니 그놈의 데이터를 분석해서 페이스북의 로그인 경우가 캐치해내면 되는것 아닌가? 이건 Interrupt 방식이라고 봐야하나.. Hooking 방식이라고 봐야하나.. 뭐 어쨌든, 찾아보니 적절한 Delegate 가 있었고 이놈을 사용하면 될것 같다.
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
로그인 시에 호출이 되는건 확인이 됐고, 어떤값이 들어오는지는 지금 확인해 봐야겠다. 페이스북의 경우만 저 함수에서 예외처리를 해주면 해결할수 있을것 같다.
request 값을 확인해 보니, 로그인 성공시에 https://ssl.facebook.com/desktopapp.php 가 호출되는것을 알 수 있었다. 이값을 캐취해서 이 경우에만 facebook.com 예외처리를 해주었고, 예외처리루틴에 facebook.auth.getSession 호출을 하였더니 인증에 성공해서 session 값을 가져오는것을 확인할 수 있었다. 굿!
Trackback URL : http://rainless.ipocs.com/blog/trackback/247