ObjectiveFlickrãiPhoneã§ä½¿ã OAuthãã°ã¤ã³ & APIå®è¡ç·¨
ãã°ã¤ã³ã®åºæ¬çãªæµãã¨ãã¦ã¯
1.[OFFlickrAPIContext loginURLFromFrobDictionary:requestedPermission:]ã§çæãããURLã[UIApplication openURL:]ã§éãã
2.ãã®ä¸ã§ã¦ã¼ã¶ã¼ãèªè¨¼ããã
3.ã³ã¼ã«ããã¯ã®URLSchemeã§ã¢ããªãéããã[UIApplicationDelegate application:handleOpenURL:]ãå¼ã°ããã®ã§ããã§frobãå¾ã¦ã
4.ãããç¨ãã¦"flickr.auth.getToken"APIãå¼ã³ã ããã¢ã¯ã»ã¹ãã¼ã¯ã³ãåå¾ãã
ã¨ãã風ã«ãªãã¨æãã¾ãã
ããããäºã§2.ã§ã¯Safariãéããã¦ããã®ã§URLãè¦ã¦ãã¹ã¯ã¼ããå ¥åãã¦ãããµã¤ããã©ããã¦ã¼ã¶ã¼ãå¤æã§ãã¾ãããOAuthã®èªè¨¼ã¨ã¢ããªèµ·åãã¹ã ã¼ãºã«ã§ãã¾ããURLSchemeã使ãããUIWebViewãç¨ããããæ¹ã ã¨ã¦ã¼ã¶ã¼ãã¢ããªèªä½ã«ãã¹ã¯ã¼ããæããäºã«ãªã£ãããæ£ãããµã¤ãã«ãã¹ã¯ã¼ããå ¥åãã¦ããã®ãã©ããå¤æãä»ããªããªã£ããããã®ã§ãããªãã§ãã
ãµã³ãã«ã³ã¼ãã¯objectiveflickrå梱Exampleã®SnapAndRunã詳ããã®ã§ãã¡ããåç
§ã
ä¸ã®æµãã¯ä¸åº¦ã
1.[SnapAndRunViewController authorizeAction]
3.4.[SnapAndRunAppDelegate application: handleOpenURL:]
4.[SnapAndRunAppDelegate flickrAPIRequest: didCompleteWithResponse:]
ã«ãããã¾ãã
ObjectiveFlickrãiPhoneã§ä½¿ã æºåç·¨
2.0ã§iPhoneã«ã対å¿ããObjectiveFlickr2.0ã試ãã¦ã¿ãã®ã§ã¡ã¢ãã
I.flickrã®APIãã¼ãåå¾ãã
http://www.flickr.com/services/apps/create/
åç¨éåç¨ã§å°ãæç¶ãã®ç
©éããå¤ããã¿ããã§ãããã©ããªãã©ãããã©ã¼ã ã®ä½ãããã¢ããªãªã®ãã詳細ã«èª¬æããäºãå¿
è¦ã§ãã
trust us when we say you can't be detailed enough
ã¨ã®äºãªã®ã§åããããã£ã¡ãã¨èª¬æããæ¹ãæ©ãç³è«ãéãããã§ãã(éåç¨ã ã¨ããAPI Keyããããã¾ãã)
II.flickrå´ã®è¨å®ãæ´ãã
APIãã¼è¡¨ç¤ºç»é¢ããã Edit auth flow for this app ãé¸æãã次ã®äºã¤ãè¨å®ã
- App Type
- Web Applicationãé¸æ
- Callback URL
- YourAppURLSchemeName://auth? ã«ãã
YourAppURLSchemeNameã¯èªåã®ã¢ããªã®URLã¹ãã¼ã åã«ããã*1
III.ã¢ããªå´ã®è¨å®ãæ´ãã
Info.plistã«URL typesãURL Schemesã追å ããã
URL Schemesã«ä¸æ
£ãã ã£ãã®ã§ãç¹ã«URL schemeを使ってアプリを起動する - 強火で進めãåèã«ããã¦ããã ãã¾ãããç»åãç¨ãã¦è§£èª¬ããã¦ãã¦ããããããã®ã§ãã¡ããåç
§ã
ä¸ã®ãµã¤ãã§ã¯${PRODUCT_NAME}ãã¹ãã¼ã åã«æå®ãã¦ãã¾ããããã¡ãã§ã¯flickrã§Callback URLã«è¨å®ããå¤ã«åããã¾ãã
IV.objectiveflickrãããã¸ã§ã¯ãã«è¿½å ãã
iPhoneã ã¨Macç¨ã¢ããªã®ããã«ãã«ããããã¬ã¼ã ã¯ã¼ã¯ãã³ãã¼ãããã ãã§ã¯ä½¿ããªãã§ããREADMEã«ãããã追å ãã¦ãéçã«ãªã³ã¯ããã¾ãã
1.èªåã®iPhoneã¢ããªã®ããã¸ã§ã¯ããéããProject -> Add to Project...ã§ObjectiveFlickr.xcodeprojã追å ã
2.Target Info ã® Generalã¿ãã«ã¦æ¬¡ã®ããã«è¿½å
- Direct Dependencies
- ObjectiveFlickr (library)ã追å
- Linked Libraries
- CFNetwork.framework ã追å
3.Target Info ã® Buildã¿ãã§All Configurationsã®"Header Search Paths"ã«ObjectiveFlickrã®Sourceãã£ã¬ã¯ããªã¨LFWebAPIKitãã£ã¬ã¯ããªã®ãã¹ã追å ã
4.Targetsããªã¼ã®ä¸ã«ãããLink Binary With Librariesã«libObjectiveFlickr.aããã©ãã°ã¢ã³ãããããã
以ä¸ã§æºåã¯å®äºã§ãã
*1:objectiveflickrã®ãµã³ãã«ããã°ã©ã ãåããæã¯"snapnrun://auth?"ã«ãã
UIViewã®ã¢ãã¡ã¼ã·ã§ã³ãæ»ããã«åãã
UIViewã®setAnimationCurve:(UIViewAnimationCurve)ã§æå®ã§ããã¤ã¼ã¸ã³ã°ã¯ãã£ãã®å種é¡ã§è¡¨ç¾åã«ä¹ãããããã§ãã£ã¨èªç±ã«UIViewãåããããå ´åãCAMediaTimingFunctionãæå®ãã¦Layerãåããã¨ãã¾ãããã
UIView *moveView; CALayer *moveLayer; CABasicAnimation *moveAnim; CAMediaTimingFunction *timingFunc; timing = [CAMediaTimingFunction functionWithControlPoints:0.3f :0.8f :0.8f :1.0f];//(0,0),(0.3,0.8),(0.8,1.0),(1,1)ã®åç¹ã§æããããã¸ã¨æ²ç·æ§ã®ã¤ã¼ã¸ã³ã° moveLayer = moveView.layer; moveAnim = [CABasicAnimation animationWithKeyPath:@"position"];//Animatableãªããããã£ãªãposition以å¤ã§ãå¯è½ moveAnim.timingFunction = timing; //moveAnim.* = * //ããããçç¥ [moveLayer addAnimation:moveAnim forKey:kCATransition];
ããã§æå®ã§ããã¤ã¼ã¸ã³ã°ã¯åç¹ã§æå®ããããã¸ã¨æ²ç·ç¶ã®ãã®ã ããªã®ã§ããã£ã¨ç´°ãã決ãããå ´åãã¢ãã¡ã¼ã·ã§ã³ãåå²ãããCAKeyframeAnimationã使ããããå¿ è¦ãããããã ã
TextFieldããã¼ãã¼ãã«é ãããªãããã«ãã
TextFieldãå ¨ç»é¢ã®UIScrollViewã®scrollä¸ã«é ç½®ãã¦ãããTextFieldDelegateã«æ¬¡ã®ããã«æ¸ãã¨ããã¹ããã£ã¼ã«ããé ããªãã
- (void)textFieldDidBeginEditing:(UITextField *)tf { NSInteger marginFromKeyboard = 10,keyboardHeight = 165;//interfaceOrientationã«ãã CGRect tmpRect = tf.frame; if((tmpRect.origin.y + tmpRect.size.height + marginFromKeyboard + keyboardHeight) > scroll.frame.size.height){ NSInteger yOffset; yOffset = keyboardHeight + marginFromKeyboard + tmpRect.origin.y + tmpRect.size.height - scroll.frame.size.height; [scroll setContentOffset:CGPointMake(0,yOffset) animated:YES]; } } - (void)textFieldDidEndEditing:(UITextField *)tf { [scroll setContentOffset:CGPointMake(0,0) animated:YES]; }
UIã«ãã£ã¦ã¯xæ¹åã®Offsetãå¤æ´ããããå ã®scrollViewã®ãªãã»ãããè¨æ¶ãã¦ããã¦ãã®å¤ã«æ»ãæ¹ããããããããªãã
iPhoneã¢ããªå ããã¢ããªãçµäºããã
éå ¬éã¡ã½ããã ããexit()ã使ãããçµäºæã®æ§ã ãªäºããã£ã¦ããããapplicationWillTerminateã«è¨å®é¡ãä¿åããå¦çãæ¸ãã¦ãã¦ãã¢ããªå ããã¢ããªãçµäºããããæã¨ãã«ã¯ä½¿ãããã
[[UIApplication sharedApplication] terminateWithSuccess];
IBã使ããã«ãªã¿ã¼ã³ãã¼æ¼ä¸æã«ãã¼ãã¼ããé ã
ç°¡æçã«IBã使ããã«ãªã¿ã¼ã³ãã¼æ¼ä¸æã«ãã¼ãã¼ããé ãã«ã¯ã対象ã®UITextFieldã«delegateãè¨å®ãã¦ãããUITextFieldDelegateã®textFieldShouldReturn:ããããªé¢¨ã«å®è£ ãã¦ããã¨ããã
- (void)textFieldShouldReturn:(UITextField *)tf { if( [tf canResignFirstResponder] ) [tf resignFirstResponder]; }
æ¬æ¥Returnãã¼ã®åä½ãããã©ã«ãåä½ãå¦ããèãã¡ã½ããã ããã©ãä¸åº¦ããæã«å¼ã°ããã¡ã½ãããªã®ã§ã
iPhoneã§flickrAPIãæ±ãæ¹æ³
1.Cã®APIã©ã¤ãã©ãªã使ã
Objcetive-Cã¯Cè¨èªãå
å
ãã¦ããã®ã§flickrcurlã©ã¤ãã©ãª(http://librdf.org/flickcurl/ )ã§éã«åããããããªãã
å©ç¹
- ãããã楽
æ¬ ç¹
- åºæ¬çã«åæçã«ããåããªã
- ç¹ã«åçã¨ããæ¯è¼ç大ããªãã¼ã¿ã使ãã®ã§ä½ã®å·¥å¤«ãç¡ã使ãã¨å¤§å¤
2.Objective-Cã®APIã©ã¤ãã©ãªã使ã
Objective-CãªãObjective-Cã®ã©ã¤ãã©ãªã使ããããObjectiveFlickr(http://lukhnos.org/objectiveflickr/ )ã使ãããããããªãã
å©ç¹
- Ruby対å¿ããã
- Cocoaã£ã½ãæ £ã親ããã delegateã¨ãã®æ¹æ³ã§éåæçã«æ¸ããã
æ¬ ç¹
- iPhoneæªå¯¾å¿
- ä¸å¿ããã°ã§ (http://lukhnos.org/objectiveflickr/blog/archives/14 )
Support for the-device-and-the-OS-that-shalt-not-be-named-until-July-11th
-
- ã¨ç®æ¨ã«ãã¦ããããã©ã¾ã ã®æ§åã
Googleã°ã«ã¼ãã§è°è«ããã¦ããããã©ã©ããä¸æããããã
- ã¨ç®æ¨ã«ãã¦ããããã©ã¾ã ã®æ§åã
- ããã¥ã¡ã³ãã«typoãå¤ã
- ç´°ããäºã ãã©ãã£ã±ãããã¥ã¡ã³ãèªãã§ã¦ç²ããã
Objective-Cããã¾ãäºããã¯ãã¦ã¦OFFlickrInvocationã¨ãããªãã¸ã§ã¯ãã«ç´æ¥flickrAPIãã¡ã½ããã¨ãã¦æãããããªäºãã§ããããããå©ç¹ã¨ãæ¬ ç¹ã¨ãã
3.å°éã«NSURL*ã¨NSXML*ã使ã
å©ç¹
- 確å®ã«åã
æ¬ ç¹
- NSXML*ããã¾ãé«æ©è½ã§ã¯ãªã