å€ãã®å ŽåãHabrãèªãã«ã¯ãiPhoneããã³iPadçšã®Habrahabrã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŸãã èšäºãèªãã®ã«ã¯åå䟿å©ã§ãããã³ã¡ã³ããæžãã®ã«ã¯ããŸã䟿å©ã§ã¯ãããŸãããç¹ã«ãã©ãŒãããã¿ã°ã䜿çšããŠãã®ãããªãã®ãæžãããå Žåã¯ããã§ãã äžäŸ¿ã§ãããã¹ãŠã®ã¿ã°ãæåã§å
¥åããå¿
èŠããããããééããç¯ããããããã®çµæãcommentãã³ã¡ã³ããæ®ããŠããŸããŸãã
ããã§ãããŒãæŒããšãéå§ã¿ã°ãšçµäºã¿ã°ãããã¹ããã£ãŒã«ãã«è¿œå ããããç¬èªã®ããŒããŒããäœæãããšããã¢ã€ãã¢ããããŸããã ãã®å Žåãããã¹ãã®æžã蟌ã¿ãããã«éå§ããã«ã¯ãã«ãŒãœã«ããããã®éã«çŽæ¥çœ®ãå¿
èŠããããŸãã ãŸããã¹ã¯ã€ããžã§ã¹ãã£ãŒã䜿çšããŠã«ãŒãœã«ã移åã§ããããã«ããå¿
èŠããããŸãã䞻芳çã«ããã£ãŒã«ãã«æãåŒã£åŒµããè«çŒé¡ã衚瀺ãããã®ãåŸ
ã£ãŠãæãåãããã«ãŒãœã«ãå¿
èŠãªå Žæã«ç§»åããããšãæåŸ
ããããã䟿å©ã§ãã æåŸã«ãHabrããŒãµãŒã§ãµããŒããããŠããªãSarcasmã¿ã°ãšBoreã¿ã°ãåŠçããŸãã ããŒããŒãã«ã¯ãããã®ç®çã®ããã®ç¹å¥ãªããŒãå¿
èŠã§ãããã¿ã°ã®ãã¶ã€ã³ã¯ããŒããŒãèšå®ã§æ§æå¯èœã§ã誰ãã奜ã¿ã®å€èŠ³ãæå®ã§ããããã«ããå¿
èŠããããŸãã
iOS 8ã®ãªãªãŒã¹ã«ãããAppleã¯ã¢ããªã±ãŒã·ã§ã³ã®æ¡åŒµæ©èœãéçºã§ããæ°ããAPIãéããŸãã ããŒããŒãïŒã«ã¹ã¿ã ããŒããŒãïŒã¯ããã®ãããªæ¡åŒµæ©èœã®ä»£è¡šã®1ã€ã§ãã ããã«ã€ããŠèª¬æããŸãã ãã®èšäºã§ã¯ãæ°ããAPIãæäŸããæ©èœãå¶éããã°ãhabraclavããŒããŒãã®éçºæ¹æ³ãããŒããŒããAppStoreã«è¡šç€ºããæ¹æ³ããããã£ãŠãŠãŒã¶ãŒã®ããã€ã¹ã«è¡šç€ºããæ¹æ³ã«ã€ããŠåŠç¿ããŸãã
æ©èœãšå¶é
ãµãŒãããŒãã£ã®ããŒããŒããäœæããããã®APIãžã®ã¢ã¯ã»ã¹ãéããAppleã¯ãã¢ããªã±ãŒã·ã§ã³éã®çãããªããžãæ§ç¯ããŸããã äžæ¹ã§ã¯ãåã¢ããªã±ãŒã·ã§ã³ã¯ãŸã ç¬èªã®ãµã³ãããã¯ã¹å
ã«ãããŸãããä»æ¹ã§ã¯ãäžæ¹ã®ã¢ããªã±ãŒã·ã§ã³ã«å
¥åãããããŒã¿ãããäžæ¹ã«ç§»åãããããµãŒããŒã«çŽæ¥éä¿¡ãããã§ããŸãã ãã®æ©èœã¯ããŠãŒã¶ãŒããŒã¿ã®ã»ãã¥ãªãã£ã®èŠ³ç¹ããéåžžã«æ·±å»ã§ãããããAppleã¯äœãã§ããŠäœãã§ããªãããå³å¯ã«å®çŸ©ããŠããŸãã 詳现ãªèª¬æã«ç§»ãåã«ãããŒããŒããå«ããã¹ãŠã®çš®é¡ã®æ¡åŒµæ©èœã¯ãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ïŒã³ã³ãããŒã¢ããªã±ãŒã·ã§ã³ïŒã®äžéšãšããŠã®ã¿ã¢ãã€ã«ããã€ã¹ã«ã€ã³ã¹ããŒã«ã§ããããšãæ確ã«ããããšæããŸãã ããšãã°ãéç¥ã»ã³ã¿ãŒã®Habrahabrã¢ããªã±ãŒã·ã§ã³ã®ææ°ããŒãžã§ã³ã«ãŠã£ãžã§ããæ¡åŒµãè¿œå ãããŸããã
ãããŠãç§ãã¡ã«ã¯ã©ããªæ©äŒããããŸããïŒ
- ãµãŒãããŒãã£ã®ããŒããŒãã¯ãããã€ã¹ã«ã€ã³ã¹ããŒã«ãããŠããã»ãšãã©ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããŸãã ãããè¡ãã«ã¯ããŠãŒã¶ãŒã¯ããã€ã¹èšå®ã«ã€ã³ã¹ããŒã«ãããããŒããŒããæåã§è¿œå ããå¿
èŠããããŸãã 幞ããªããšã«ãã¢ããªã±ãŒã·ã§ã³éçºè
ã¯ã¢ããªã±ãŒã·ã§ã³ã§ãµãŒãããŒãã£ã®ããŒããŒãã®äœ¿çšãçŠæ¢ã§ããŸãããããã«ã€ããŠã¯åŸã§è©³ãã説æããŸãã
- ããŒããŒãã¯ãã³ã³ããã¢ããªã±ãŒã·ã§ã³ãšéçºè
ãµãŒããŒã®äž¡æ¹ãšããŒã¿ã亀æã§ããŸãã ãã®ãããªäº€æã®èš±å¯ã¯ãŠãŒã¶ãŒã«ãã£ãŠèšå®ããããã®æ©èœã¯æåã¯ç¡å¹ã«ãããŠããŸããã
- ããŒããŒãã¯ãäœçœ®æ
å ±ãµãŒãã¹ãšã¢ãã¬ã¹åž³ã«ã¢ã¯ã»ã¹ã§ããå ŽåããããŸãã ã¢ã¯ã»ã¹ããã«ã¯ãããŒããŒãèšå®ãšå¯Ÿå¿ãããµãŒãã¹ã®èšå®ã®äž¡æ¹ã§ãŠãŒã¶ãŒã®èš±å¯ãå¿
èŠã§ãã
- ããŒããŒãã¯ãå
èµèŸæžã«ã¢ã¯ã»ã¹ããŠãå
¥åãããããã¹ãã®èªåä¿®æ£ããã³è£å®ã®ãªãã·ã§ã³ã衚瀺ã§ããŸãã ããŒã¿ã¯æ¬¡ã®ãœãŒã¹ããååŸãããŸãã
- ããã€ã¹ã¢ãã¬ã¹åž³ïŒå§ãšåã¯ãã¢ã§æäŸãããŸããïŒ;
- ã¹ããŒããã©ã³ã®èšå®ã§ãŠãŒã¶ãŒãæå®ããç¥èªã
- äžè¬çãªèªåœã
å®éããããã¯ãã¹ãŠäž»èŠãªæ©èœã§ãã å¶éã«ç§»ããŸãããïŒ
- æšæºããŒããŒãããç¶æ¿ããããšã¯ã§ããŸããã ã€ãŸããçµã¿èŸŒã¿ã®ããŒããŒããåºæ¬ãšããŠäœ¿çšãããžã§ã¹ãã£åŠçãè¿œå ããŠã«ãŒãœã«ãå¶åŸ¡ãããšå€±æãããããæåãããã¹ãŠãè¡ãå¿
èŠããããŸãã ããã«ãæšæºããŒããŒãã¯ååãšããŠåäœæã§ããŸããã ãã®çç±ã¯æ¬¡ã®æ®µèœã§èª¬æãããŠããŸãã
- ä»ã®ã¿ã€ãã®æ¡åŒµæ©èœãšåæ§ã«ããµãŒãããŒãã£ã®ããŒããŒãã¯ãã€ã¯ã«ã¢ã¯ã»ã¹ã§ããªããããé³å£°å
¥åããµããŒãã§ããŸããã
- ãµãŒãããŒãã£ã®ããŒããŒãã䜿çšããŠé衚瀺ã®ããã¹ããå
¥åããããšã¯ã§ããŸããïŒ
secureTextEntry = YES
ïŒã ã€ãŸãããã£ãŒã«ãããã¹ã¯ãŒãã®å
¥åãç®çãšããŠããå ŽåããŠãŒã¶ãŒã¯æšæºããŒããŒãã®ã¿ã䜿çšã§ããŸãã - ã«ã¹ã¿ã ããŒããŒãã¯ãã¿ã€ã
UIKeyboardTypePhonePad
ããã³UIKeyboardTypeNamePhonePad
ãã£ãŒã«ãã«ã¯äœ¿çšã§ããŸããã - ããŒããŒãã«ã¯ãå
¥åãã£ãŒã«ãã®ããã¹ãã匷調衚瀺ããã¢ã¯ã»ã¹æš©ããããŸããã ã€ãŸãããŠãŒã¶ãŒã®ä»å
¥ãªãã«éžæãå€æŽããŠãæ©èœããŸããã
- æšæºã®ããŒããŒããšã¯ç°ãªãããµãŒãããŒãã£ã®ããŒããŒãã¯ãã¬ãŒã ããæãåºããŸããã ã€ãŸããããšãã°æšæºããŒããŒãã®äžçªäžã®è¡ã®ããŒãé·æŒããããšãããŒããŒãã®äžã«äœã衚瀺ã§ããŸããã
- éçºè
ã¯ãã¢ããªã±ãŒã·ã§ã³ã§ãµãŒãããŒãã£ã®ããŒããŒãã®äœ¿çšãçŠæ¢ããå ŽåããããŸãã ãããè¡ãã«ã¯ã
application:shouldAllowExtensionPointIdentifier:
ãããã³ã«ã®application:shouldAllowExtensionPointIdentifier:
ã¡ãœããããªãŒããŒã©ã€ãããå¿
èŠããããŸãã UIApplicationKeyboardExtensionPointIdentifier
ãšããååã®èå¥åã®å Žåã NO
è¿ãå¿
èŠããããŸãã ãšããã§ãiOS 8ã®å Žåãããã¯äœ¿çšãçŠæ¢ã§ããå¯äžã®æ¡åŒµæ©èœã§ãã
å®å
šãª
ã«ã¹ã¿ã ããŒããŒãéçºããã¥ã¡ã³ãïŒ
ã«ã¹ã¿ã ããŒããŒãããã©ã¯ã©ãã¿ãŒ
çè«ãæŽçããã®ã§ãå®è·µã«ç§»ããŸãããã
æ°ãããããžã§ã¯ããäœæããã¢ããªã±ãŒã·ã§ã³ãéžæããŸãããã¹ãŠãæšæºã§ãã
次ã«ãæ°ããã¿ãŒã²ãããã«ã¹ã¿ã ããŒããŒãããè¿œå ããå¿
èŠããããŸãã
ãã®çµæãXcodeã¯
UIInputViewController
ãš
Info.plist
ãã掟çããã¯ã©ã¹ãçæã
Info.plist
ã
UIInputViewController
ã¯ã©ã¹ã¯ããŒããŒãã³ã³ãããŒã©ãŒã§ãã å
¥åãã£ãŒã«ããšã®ãã¹ãŠã®å¯Ÿè©±ã¯ããããä»ããŠè¡ãããŸãã ã¯ã©ã¹ã€ã³ã¿ãŒãã§ã€ã¹ã®è©³çŽ°ãæ€èšããŠãã ããã
äž»ãªæ¹æ³ïŒ
- (void)dismissKeyboard
ããŒããŒããé衚瀺ã«ã§ããŸãã ããã¯ãiPhoneã®ãã¹ãŠã®æšæºããŒããŒãã«ã¯ãªãæ©äŒã§ãã- (void)advanceToNextInputMode
次ã®ããŒããŒãã衚瀺ããŸãã å©çšå¯èœãªããŒããŒãã®ãªã¹ãã¯ããŠãŒã¶ãŒãããã€ã¹èšå®ã§æ±ºå®ããŸãã- (void)requestSupplementaryLexiconWithCompletion:(void (^)(UILexicon *))completionHandler
æååã®ãã¢ã®é
åãæäŸããŸãã åãã¢ã¯ã userInput
ãŠãŒã¶ãŒãå
¥åã§ããè¡ãšã userInput
èªåè£å®ãŸãã¯èªåä¿®æ£ã§æ§æãããè¡ã§æ§æããdocumentText
ã ããšãã°ãç§ã®iPhoneã§ã¯ããã®ã¡ãœããã¯151ãã¢ãè¿ããŸãã
ãã£ãŒã«ããšå¯Ÿè©±ããããã«ã
textDocumentProxy
ããããã£ã
textDocumentProxy
ãŸãã éçºã®æãéèŠãªæ¹æ³ã®ã¿ã説æããŸãã
- (void)adjustTextPositionByCharacterOffset:(NSInteger)offset
ã«ãŒãœã«ãå¶åŸ¡ã§ããŸãã- (NSString *)documentContextBeforeInput
ã«ãŒãœã«ã«è¡ãè¿ããŸãã- (NSString *)documentContextAfterInput
ã«ãŒãœã«ã®åŸã®è¡ãè¿ããŸãã- (void)insertText:(NSString *)text
ã«ãŒãœã«ã®åŸã«è¡ãæ¿å
¥ããŸãã- (void)deleteBackward
ã«ãŒãœã«ã®åã®1æåãåé€ããŸãã- (UIKeyboardAppearance)keyboardAppearance
䜿çšããããŒãã決å®ã§ããŸãïŒæãããæãã- (UIKeyboardType)keyboardType
å
¥åãã£ãŒã«ãã«å¿
èŠãªããŒããŒãã®ã¿ã€ãã決å®ã§ããŸãã
äžèšã®ã¡ãœããã«å ããŠã
UIInputViewController
ã¯ã©ã¹ã¯
UITextInputDelegate
ãããã³ã«ãå®è£
ããŸãã
@protocol UITextInputDelegate <NSObject> - (void)selectionWillChange:(id<UITextInput>)textInput; - (void)selectionDidChange:(id<UITextInput>)textInput; - (void)textWillChange:(id<UITextInput>)textInput; - (void)textDidChange:(id<UITextInput>)textInput; @end
ãããã®ã¡ãœããã®åŒã³åºãã¯ãå
¥åãã£ãŒã«ãã®ããã¹ãã®éžæãšå€æŽãå ±åããå¿
èŠããã
textInput
ã
textInput
ãªããžã§ã¯ãã¯ãå
¥åãã£ãŒã«ãèªäœãšããã«å«ãŸããããã¹ãã«é¢ããæ
å ±ãæäŸããå¿
èŠããã
textInput
ã
ãããå®éã«ã¯ã次ã®åäœããããŸãã
- ãŠãŒã¶ãŒãããã¹ããéžæãããã©ããã«ããããããæåã®2ã€ã®ã¡ãœããã¯åŒã³åºãããŸããã
- æåŸã®2ã€ã®ã¡ãœãããåŒã³åºãã
textInput
ãã textInput
ãªããžã§ã¯ãã¯åžžã«nil
ã§ãã
ãã°ã®ããã«èŠããŸãã Stackoverflowã§ã¯ã人ã
ã¯åãåé¡ã«çŽé¢ãããšæžããŠããŸããã解決çã¯ãããŸããã äžèšã®åäœã¯ãiOS8ã®ãªãªãŒã¹ããŒãžã§ã³ã§åçŸãããããšã«æ³šæããŠãã ããã
éçºè
ã«ãšã£ãŠã®2çªç®ã®å
±éç¹ã¯ã
Info.plist
ãã¡ã€ã«ã§ãã æ¢ç¥ã®ãã£ãŒã«ãã«å ããŠã
NSExtension
ã°ã«ãŒããå«ãŸããŠããŸãã
<key>NSExtension</key> <dict> <key>NSExtensionAttributes</key> <dict> <key>IsASCIICapable</key> <false/> <key>PrefersRightToLeft</key> <false/> <key>PrimaryLanguage</key> <string>ru</string> <key>RequestsOpenAccess</key> <false/> </dict> <key>NSExtensionPointIdentifier</key> <string>com.apple.keyboard-service</string> <key>NSExtensionPrincipalClass</key> <string>VPKeyboardViewController</string> </dict>
éçºäžã®æ¡åŒµæ©èœã®çš®é¡ãã³ã³ãããŒã©ãŒã¯ã©ã¹ã®ååãããã³å±æ§ã瀺ããŸãã
RequestsOpenAccess
å±æ§ã«æ³šæããŠãã ããã ãã®å©ãã«ãããã·ã¹ãã ã¯ãé«åºŠãªã¢ã¯ã»ã¹ãå¿
èŠãã©ãããç解ããŸãïŒã³ã³ãããŒã¢ããªã±ãŒã·ã§ã³ãŸãã¯ãµãŒããŒãšã®ããŒã¿äº€æãå°çäœçœ®æ
å ±ããã³ã¢ãã¬ã¹åž³ãžã®ã¢ã¯ã»ã¹
true
ãæå®ãã
true
ãããããã¹ãŠå¿
èŠãšããçç±ãAppleã«èª¬æããæºåãããŠãã ããã
ããã§APIã®ç解ãå®äºããçŽæ¥éçºã«é²ã¿ãŸãã
ãŸããã¬ã€ã¢ãŠããå®çŸ©ããŸãããã iPhoneã«çžŠåããšæšªåãã®ãµããŒããå®è£
ããæçµçã«iPadçšã«å€æŽããããšãèšç»ããŸããã 瞊åããšæšªåãã®ã¬ã€ã¢ãŠãã¯ãããã«ç°ãªãã¯ãã§ãã ãããã®ç®çã®ããã«ãæ°ããäœããã
ãµã€ãºã¯ã©ã¹ãã¯ãããžãŒã¯å®ç§ã§ããã ãªãéå»åœ¢ã§æžããŠããã®ã§ããïŒ ã¯ãããã¹ãŠã®èšç»ã倱æããããã§ãã å®éã«ã¯ãåãã«é¢ä¿ãªããã·ã¹ãã ã¯åããµã€ãºã¯ã©ã¹wCompactãšhCompactãå²ãåœãŠãŸããããã¯ãiPhoneã®æšªåãã«å¯Ÿå¿ããŸãã ã»ãšãã©ã®å Žåãããã¯ããŒããŒããã¬ãŒã ãç»é¢å
šäœãå ããã®ã§ã¯ãªããäžååã®ã¿ãå ããããã§ãã ååãšããŠãããã¯è«ççãªåäœã§ããããã®åé¡ãåé¿ããããã«ãã³ã³ãããŒã©ãŒã«ä»»æã®ãµã€ãºã¯ã©ã¹ãæåã§å²ãåœãŠãããšãã§ããŸãã ãããè¡ãã«ã¯ã
setOverrideTraitCollection:forChildViewController:
ã¡ãœããã䜿çšããŸãã ããããå®éã«ã¯ããã®ã¡ãœããã®åŒã³åºãã¯äœã«ã圱é¿ããŸãããã€ãŸã
UITraitCollection
åã³ã³ãããŒã©ãŒã®
UITraitCollection
å€æŽãããŸããã ãã®æ¹æ³ã䜿çšããŠè¯ãçµéšããæã¡ã®æ¹ãããã°ããããå
±æããŠãã ããã äžèšã®åäœãåããã³ãŒãã®ããŒãžã§ã³ãå¥ã®ãã©ã³ãã«ã¢ããããŒãããŸãããèå³ãããå Žåã¯ãæãäžããŠãã ããã åé¡ã解決ãããŸã§ããã¹ãŠã®æ¹åã«ã€ããŠ1ã€ã®ã¬ã€ã¢ãŠãã§æºè¶³ããŸãã
ã«ãŒãœã«å¶åŸ¡ã®å©äŸ¿æ§ã®ããã«ãã¹ã¯ã€ããžã§ã¹ãã£èªèãè¿œå ããŸãã xibã§ã¯ã2ã€ã®
UISwipeGestureRecognizer
ãè¿œå ããã³ãŒãã«ã€ãã³ããã³ãã©ãŒãå®è£
ããŸãã
- (IBAction)onLeftSwipeRecognized:(id)sender { if (self.textDocumentProxy.documentContextBeforeInput.length > 0) { [self.textDocumentProxy adjustTextPositionByCharacterOffset:-1]; } } - (IBAction)onRightSwipeRecognized:(id)sender { if (self.textDocumentProxy.documentContextAfterInput.length > 0) { [self.textDocumentProxy adjustTextPositionByCharacterOffset:1]; } }
次ã«ããã³ãã©ãŒãè¿œå ããŠããŒããŒããéãã次ãžé²ã¿ãŸãã
- (IBAction)onNextInputModeButtonPressed:(id)sender { [self advanceToNextInputMode]; } - (IBAction)onDismissKeyboardButtonPressed:(id)sender { [self dismissKeyboard]; }
å
¥åããããã¹ããåé€ããã«ã¯ã2ã€ã®å¯èœæ§ãå®è£
ããŸãã
- æšæºããŒããŒãã®ããã«ãã«ãŒãœã«ã®åã®æåŸã®æåãåé€ããŸãã
- (IBAction)onDeleteButtonPressed:(id)sender { if (self.textDocumentProxy.documentContextBeforeInput.length > 0) { [self.textDocumentProxy deleteBackward]; } }
- ã«ãŒãœã«ã®äœçœ®ã«é¢ä¿ãªããå
¥åãããã¹ãŠã®ããã¹ããåé€ããŸãã 誀ã£ãŠããã¹ããåé€ããªãããã«ã
UILongTapGestureRecognizer
ã䜿çšãUILongTapGestureRecognizer
ã
- (IBAction)onClearButtonPressed:(id)sender { NSInteger endPositionOffset = self.textDocumentProxy.documentContextAfterInput.length; [self.textDocumentProxy adjustTextPositionByCharacterOffset:endPositionOffset]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
ç®æšãéæããã«ã¯ãã³ãŒãå®è¡ãé
延ãããããã¯ã䜿çšããå¿
èŠããããŸãã å®éãAPIã§ã¯ã«ãŒãœã«ã®åã§ã®ã¿ããã¹ããåé€ã§ããŸãã ã€ãŸãããã¹ãŠã®ããã¹ããåé€ããã«ã¯ãæåã«ã«ãŒãœã«ãè¡ã®æåŸã«ç§»åããå¿
èŠããããŸããã移åããã»ã¹ã¯éåæã§ãããšåæã«ããã®ããã»ã¹ãå®äºããæç¹ãèŠã€ããæ¹æ³ãèŠã€ãããŸããã§ããã ãããã£ãŠãé
延ã0.1ç§ã«èšå®ããã«ãŒãœã«ãç®æšã«å°éãããšèããŠããŸãã
ãã©ãŒãããã¿ã°ã®å°å
¥ã«ãããç§ãã¡ãå®éã«äœã®ããã«ããã«ããã®ããç解ããããšã¯æ®ã£ãŠããŸãã
Habrã§ãµããŒããããŠããæšæºã¿ã°ãä¿åããã«ã¯ãJSONãã¡ã€ã«ã䜿çšããŸãã
{ "": "<b></b>", "": "<i></i>", "": "<u></u>", "": "<s></s>", "": "<blockquote></blockquote>", "": "<code></code>", "": "<a href=\"http://\"></a>", "": "<img src=\"http://\"/>", "": "<video>http://</video>", "": "<spoiler title=\"\"></spoiler>", "": "<hh user=\"\"/>" }
ãSarcasmãããã³ãBoreãã¿ã°ã®å ŽåãåãŠãŒã¶ãŒãéå§ã¿ã°ãšçµäºã¿ã°ã®å€ãèšå®ã§ããããã«èšå®ãäœæããå¿
èŠããããŸãã èšå®ãã³ãã«ãè¿œå ïŒ
Settings.bundle-> Root.plistã«ç§»åããå¿
èŠãªãã¹ãŠã®ãã£ãŒã«ãã«å
¥åããŸãã 以äžã¯ãèšå®ã®ãœãŒã¹ã³ãŒããšãŠãŒã¶ãŒã«è¡šç€ºããããã®ã§ãã
ããããå®éã«ã¯ãããŒããŒããã€ã³ã¹ããŒã«ãããšãã¿ã°ã®å€ã¯è¡šç€ºãããŸãããã€ãŸããå®éã«ã¯ãã£ãŒã«ãã¯ç©ºã§ãã ãããã®ãã£ãŒã«ãã¯ãããŒ
Default Value
ã«ãã£ãŠèšå®ãããŸãã æåã¯äœãééã£ãããšãããŠãããšæããŸããã ãã ããèšå®ã«ç§»åããŠãããã®ãã£ãŒã«ãã«æåã§å
¥åããå Žåã§ããèšå®ãçµäºãããšãå€ã¯ä¿åãããŸããã ããã¯ãã°ã§ãã ä»ã®ãŠãŒã¶ãŒãåæ§ã®åé¡ã«çŽé¢ããŠãããStackoverflowã®ããã€ãã®ãããã¯ã§ããã確èªãããŠããŸããã€ãŸããåé¡ã¯ããŒã«ã«ã§ã¯ãããŸããã éçºè
ã¯
NSUserDefaults
ãªããžã§ã¯ãã®
synchronize
ã¡ãœãããåŒã³åºãã®ãå¿ããããã§ãã æ®å¿µãªãããiOS 8.1ãŸãã¯iOS 8.0.1ã®æŽæ°ãåŸ
ã€ããšããã§ããŸããã ãã®åé¡ãèæ
®ããããã«ãèšå®ããããŒãã§ããªãå Žåã¯ãã³ãŒãã®ããã©ã«ãå€ã䜿çšããŸãã
ã¿ã°ã®ã¹ãã¬ãŒãžãæŽçããŸããã次ã«ãå
¥åãã£ãŒã«ãã«ã¿ã°ãè¿œå ããããŒã¹ãããŒã¯ãã³ãã©ãäœæããŸãã
- (IBAction)onHabraButtonPressed:(id)sender { NSString *tagKey = [sender titleForState:UIControlStateNormal]; NSString *tagValue = self.tagsDictionary[tagKey]; [self.textDocumentProxy insertText:tagValue]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
åè¿°ã®ããã¯ã䜿çšããŠãã³ãŒãã®å®è¡ãé
ãããŸãã ããã¯åãã«ãŒãœã«ã«ãããã®ã§ãã
insertText:
ã¡ãœãããåŒã³åºããšãã«ãŒãœã«ã¯å³åº§ã«ç§»åããªãããããããèæ
®ããå¿
èŠããããŸãã ã«ãŒãœã«ã·ãããèæ
®ããå¿
èŠãããçç±ã説æããããã«ãäŸãæããŸããHabrauserã«ãªã³ã¯ãè¿œå ããããšããŸãã ãããè¡ãã«ã¯ãã¿ã°ãè¿œå ããŸã
ããã«ãåŒçšç¬Šã®éã«ãŠãŒã¶ãŒåãå
¥åããŸãã 䟿å®äžãåŒçšç¬Šã®éã®äœçœ®ã«ã«ãŒãœã«ãèªåçã«èšå®ããŸããã ä»ã®ã¿ã°ã«ã€ããŠãåæ§ã§ãã ãããã®ç®çã®ããã«ãäžèšã®moveTextPositionToInputPointForTag:
ã¡ãœããã䜿çšãããŸãããã®ã¡ãœããã¯ãã¿ã°è¡ã®é
åã䜿çšããŠãã«ãŒãœã«ãé
眮ããäœçœ®ã決å®ããŸãã
å®è£
ãå®äºããããã¢ã¯ãã£ããªåç·ãšããŠæ¡åŒµæ©èœãéžæããŠå®è¡ããŸãã ãããã°ã®å©äŸ¿æ§ã®ããã«ããã¹ããŒã ã®ç·šéãã«é²ã¿ããå®è¡å¯èœãã¡ã€ã«ã®ãããã°ããã§ãã¯ããã¯ã¹ããã§ãã¯ããããšããå§ãããŸãã ããã«ãããæ¡åŒµæ©èœãšã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®äž¡æ¹ãåæã«ãããã°ãããŸãã
ããŒããŒããã€ã³ã¹ããŒã«ããã«ã¯ãèšå®->äžè¬->ããŒããŒã->ããŒããŒã->æ°ããããŒããŒã...
å³åŽã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ããŠãŒã¶ãŒãããŒããŒããžã®ãã«ã¢ã¯ã»ã¹ãèš±å¯ããããšãããšãã«è¡šç€ºããããã€ã¢ãã°ã瀺ããŠããŸãã å®éããã®ããã¹ãã¯ãèš±å¯ããªãããéžæããããã«ç§ã«ã»ã®ããããŠããŸãã
ããŒãã¹ãšããŠãæšæºããŒããŒãã®ãã¥ãŒã®éå±€ã衚瀺ããããšæããŸãã ç§ã¯ãããèªåèªèº«ã«ä»»ããŠã誰ããèªåã®çµè«ãåŒãåºãããã«ããŸãïŒ
GitHubã§å©çšå¯èœãªå®å
šãªãœãŒã¹ã³ãŒãïŒ Habrakeyboard
ãã¢ã³ã¹ãã¬ãŒã·ã§ã³
転èš
ããŒããŒããšä»ã®çš®é¡ã®æ¡åŒµæ©èœã®äž¡æ¹ã®å
¬éããã»ã¹ã¯ãéåžžã®ã¢ããªã±ãŒã·ã§ã³ã®å
¬éãšå®è³ªçã«éãã¯ãããŸããããæ¡åŒµæ©èœèªäœãããã€ãã®æè¡èŠä»¶ãæºãããŠããå¿
èŠããããŸãã
- æ¡åŒµæ©èœã¯ãã³ã³ããã¢ããªã±ãŒã·ã§ã³ã®äžéšãšããŠã®ã¿å
¬éã§ããŸãã åç¬ã§ã¯ååšã§ããŸããã ã¢ããªã±ãŒã·ã§ã³ãã¢ã³ã€ã³ã¹ããŒã«ããããšåé€ãããŸãã ãšããã§ããã®å¶éã¯iOSå°çšã§ãã Macã®å Žåãæ¡åŒµæ©èœã¯åå¥ã«é
åžã§ããŸãã
- æ¡åŒµæ©èœã®å±éã¿ãŒã²ããã¯ã> = iOS 8.0ã§ãªããã°ãªããŸããã ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã¯ã以åã®ããŒãžã§ã³ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã çšã«å
¬éã§ããŸãã å€ãããŒãžã§ã³ã§ã¯ãæ¡åŒµæ©èœã¯äœ¿çšã§ããŸããã ã€ãŸããããšãã°ãHabrahabrã¢ããªã±ãŒã·ã§ã³ã®éçºè
ããã®ãããªãã®ãå®è£
ããå ŽåãDeployment Targetãäžããå¿
èŠã¯ãããŸããã
- æ¡åŒµã®ã¿ãŒã²ããã«ã¯ã64ãããã¢ãŒããã¯ãã£ïŒarm64ïŒã®ããã»ããµã®ã¢ã»ã³ããªã®èšå®ãå«ãŸããŠããå¿
èŠããããŸãã ã¢ããªã±ãŒã·ã§ã³ãæ¡åŒµæ©èœãšã®ããŒã¿äº€æãå®è£
ããå ŽåãåãèŠä»¶ãæºããå¿
èŠããããŸãã 奜ããªããšãèšã£ãŠãã ããããããã64ãããããã»ããµã®ãµããŒãã«ã€ããŠèããå¿
èŠããããŸãã è€éã§äœã¬ãã«ã®ã³ãŒããæã€å€§èŠæš¡ãªãããžã§ã¯ãã®å Žåãããã«ã¯éåžžã«æéããããå ŽåããããŸãã
Appleã¯ãŸããã¬ãã¥ãŒã¬ã€ãã©ã€ã³ã«ããã€ãã®æ°ãã段èœãè¿œå ããŸããã ãããã¯ããŒããŒãæ¡åŒµã«åºæã§ãïŒ
- ããŒããŒããéãããããŠãŒã¶ãŒã¯æ¬¡ã®ç»é¢ã«é²ãããšãã§ããŸãã
- ã€ã³ã¿ãŒãããã«æ¥ç¶ããŠããªãå ŽåãããŒããŒãã¯æäœå¯èœãªç¶æ
ã®ãŸãŸã«ããŠãã ããã
- ããŒããŒãã¯ã次ã®çš®é¡ã®ããŒããŒããå®è£
ããå¿
èŠããããŸããæ°å€ãš10é²æ°ïŒã€ãŸããå
¥åãã£ãŒã«ãã«æ°å€ã®å
¥åãå«ãŸããå ŽåãããŒããŒãã¯ãã®ããã®äŸ¿å©ãªæ¹æ³ãæäŸããå¿
èŠããããŸãïŒã
- ããŒããŒãæ¡åŒµãå«ãã¢ããªã±ãŒã·ã§ã³ã®äž»èŠãªã«ããŽãªã¯ããŠãŒãã£ãªãã£ã§ããå¿
èŠããããŸãã ãŸããã¢ããªã±ãŒã·ã§ã³ã¯ãŠãŒã¶ãŒã«ç¬èªã®ãã©ã€ãã·ãŒããªã·ãŒãæäŸããå¿
èŠããããŸãã
- ããŒããŒãã¯ãæ©èœãåäžãããããã«ã®ã¿ãŠãŒã¶ãŒããŒã¿ã䜿çšããå¿
èŠããããŸãã
å
ã®æšå¥šäºé
- ããŒããŒãæ¡åŒµã¯ã次ã®ããŒããŒãã«é²ãããã®æ¹æ³ãæäŸããå¿
èŠããããŸãã
- ããŒããŒãæ¡åŒµæ©èœã¯ããããã¯ãŒã¯ã¢ã¯ã»ã¹ãªãã§æ©èœãç¶ããå¿
èŠããããŸããæ©èœããªãå Žåã¯æåŠãããŸãã
- ããŒããŒãæ¡åŒµæ©èœã¯ãApp Extension Programming Guideã§èª¬æãããŠããããã«ãæ°åããã³10é²ããŒããŒãã¿ã€ããæäŸããå¿
èŠããããŸããããã§ãªãå ŽåãæåŠãããŸãã
- ããŒããŒãæ¡åŒµæ©èœãæäŸããã¢ããªã«ã¯ããŠãŒãã£ãªãã£ã®ãã©ã€ããªã«ããŽãªãšãã©ã€ãã·ãŒããªã·ãŒãå¿
èŠã§ããããã§ãªãå ŽåãæåŠãããŸãã
- ããŒããŒãæ¡åŒµæ©èœãæäŸããã¢ããªã¯ãiOSããã€ã¹äžã®ããŒããŒãæ¡åŒµæ©èœã匷åããããã«ãŠãŒã¶ãŒã¢ã¯ãã£ããã£ã®ã¿ãåéããããæåŠãããå ŽåããããŸãã
äžèšã®ãã¹ãŠã®èŠä»¶ãæºããããŠããå Žåãåºæ¬çã«æ¢ç¥ã®ããã€ãã®æé ãå®è¡ããŸãã
- éçºè
ããŒã¿ã«ã«ã¢ã¯ã»ã¹ããŠãæ¡åŒµæ©èœã®ã¢ããªIDãäœæããŸãã ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®èå¥åã®ç¶ãã§ããå¿
èŠããããŸãã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã®ã¢ããªIDã
com.company.application.keyboard
å Žåãæ¡åŒµæ©èœã®ã¢ããªIDã¯com.company.application.keyboard
ãŸãã 次ã«ãæ°ããã¢ããªIDã«å¯ŸããŠãããããžã§ãã³ã°ãããã¡ã€ã«ãäœæããå¿
èŠããããŸãã ãã®ããŒã¿ã¯ãXcodeã®ã¿ãŒã²ããèšå®ã§æå®ããå¿
èŠããããŸãã - æ¡åŒµæ©èœãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãšã®ããŒã¿äº€æãå®è£
ããå Žåãéçºè
ã®ããŒã¿ã«ã§ã¢ããªã°ã«ãŒããäœæããæ¡åŒµæ©èœãšã¢ããªã±ãŒã·ã§ã³ã®ã¢ããªIDèšå®ã§ã¢ããªã°ã«ãŒãã䜿çšã§ããããã«ããå¿
èŠããããŸãã å®éããã®ã¹ãããã¯ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ã段éã§å®è¡ããå¿
èŠããããŸããããããªããšãããŒã¿äº€æã衚瀺ãããŸããã
- iTunesConnectã§æ¡åŒµæ©èœã®ã¹ã¯ãªãŒã³ã·ã§ãããšèª¬æãè¿œå ããŸãã Appleã¯ããããã®ç®çã®ããã®ç¹å¥ãªãã£ãŒã«ããè¿œå ããŠããŸããã ãããã®ããŒã¿ã¯ãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã«é¢ããæ
å ±ãšãšãã«å
¥åãããŸãã
- ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã®ã¿ãŒã²ãããåéããã¬ãã¥ãŒã«éä¿¡ããŸãã æ¡åŒµæ©èœã¯æ¢ã«ã¢ããªã±ãŒã·ã§ã³ããã±ãŒãžã«å«ãŸããŠããŸãã
- ããã ãã§ããåŸ
ã€ããšããã§ããŸããã
App Review Guidelines App Store Review Guidelines