HomeKit frameworkを使ったtvOSアプリ開発を通して学んだ事を簡単にまとめました。
HomeKit on tvOS
View Slide
ࣗݾհ
ࣗݾհۄ৴ޛiOS Engineer!tvOSΞϓϦͷ։ൃࠓ͜ͷͷͨΊʹษڧ͠·ͨ͠ɻझຯ"ిࢠ࡞⚡ےτϨ$ΨδΣοτ%
tvOSΞϓϦͷ։ൃํ๏ʹ͍ͭͯ• ΫϥΠΞϯτ/αʔόܕͷΞϓϦέʔγϣϯ (TVML Kit)
tvOSΞϓϦͷ։ൃํ๏ʹ͍ͭͯ• ωΠςΟϒ։ൃ
OrigamiͷtvOSΞϓϦΫϥΠΞϯτ/αʔόܕͰߏங͓ͯ͠ΓɺOrigamiͷECͷӾཡػೳΛఏڙ͍ͯ͠·͢ɻ
OrigamiͷtvOSΞϓϦ• TVMLͷTemplate͕ECͷίϯςϯπͱϚονͨ͠• ϥΠϒΞοϓσʔτՄೳͰϦϦʔεͷख͕ؒগͳ͍• ৽͍͠ϓϥοτϑΥʔϜͷνϟϨϯδ
ͰࠓωΠςΟϒ࣮ʹؔ࿈ͨ͠Λ͠·͢!͖ͳࣄ͍͍ͯͬͯ͠ݴΘΕͨ͠
ૣtvOSͷΛ͢Δલʹ...
࠷ۙͷεϚʔτϗʔϜؔ࿈ͷAlexa
࠷ۙͷεϚʔτϗʔϜؔ࿈ͷGoogle Home
࠷ۙͷεϚʔτϗʔϜؔ࿈ͷSiriεϐʔΧʔʁ
ͳͥ͜ͷΛ͔ͨ͠ͱ͍͏ͱʁ
HomeKit
HomeKitͱʁApple͕ఏڙ͢ΔεϚʔτϗʔϜͷͨΊͷϑϨʔϜϫʔΫɺHomeKitରԠΛൢച͢ΔʹMFiೝূ͕ඞཁ
AppleTVͷHomeKitʹ͓͚Δׂ• Remote GatewayϦϞʔτίϯτϩʔϧɺΦʔτϝʔγϣϯ͕ՄೳՄೳ
iOS10HomeΞϓϦ͕ొ
tvOSʁ
tvOS10HomeKitରԠ
tvOS10ͷHomeKitରԠͰԿ͕ग़དྷΔͷ͔ʁ• HomeKit frameworkͷҰ෦ػೳ͕Մೳʹͳͬͨ• HomeΞϓϦtvOSʹଘࡏ͠ͳ͍
ͳͷͰHomeΞϓϦͲ͖Λࢼ࡞ग़དྷͳ͍͔ͬͯΈͨ
DEMO
tvOSΞϓϦ։ൃͷಛ• ը໘αΠζ• ੍ݶ͞ΕͨετϨʔδ• ύϥϥοΫεΞΠίϯ• ϑΥʔΧε
tvOSΞϓϦ։ൃͷಛ• ը໘αΠζ• ੍ݶ͞ΕͨετϨʔδ• ύϥϥοΫεΞΠίϯ• ϑΥʔΧε ← !
ϑΥʔΧεΤϯδϯ
tvOSΞϓϦͷ։ൃʹ͍ͭͯϑΥʔΧεͱ͍͏֓೦tvOSʹ͔͠ͳ͍ͷͰɺtvOSΞϓϦ։ൃͷ࠷େͷצॴͰͳ͍͔ͱࢥ͍ͬͯ·͢ɻαϯϓϧίʔυΛ࡞ͨ࣌͠ʹࢥ͍௨Γʹಈ͔ͳ͔ͬͨέʔεͱɺͦͷରԠʹ͍ͭͯઆ໌͠·͢ɻ※ ϫʔΫΞϥϯυͳײ͢͡ΔͷͰͬͱςΫχΧϧͳํ๏͕͋Ε୭͔͋ͱͰڭ͍͑ͯͩ͘͞ɻ
ͦͷ1
ࢥ͍௨ΓʹϑΥʔΧεग़དྷͳ͍ ͦͷ1
ࢥ͍௨ΓʹϑΥʔΧεग़དྷͳ͍ ͦͷ1λϒόʔ͔ΒӈଆͷηϧͷϑΥʔΧεΛېࢭ͢Δoverride func shouldUpdateFocus(in context: UIFocusUpdateContext) -> Bool {if let prev = context.previouslyFocusedView, String(describing:type(of: prev)) == "UITabBarButton" {return false}return true}
ͦͷ2
ࢥ͍௨ΓʹϑΥʔΧεग़དྷͳ͍ ͦͷ2
UIFocusEnvironment ProtocolUIFocusEnvironment ProtocolͷσϦήʔτϝιουͰϑΥʔΧεΛ͏·͘ίϯτϩʔϧग़དྷΔΑ͏ʹ࣮͢Δඞཁ͕͋Δɻvar preferredFocusEnvironments: [UIFocusEnvironment]func shouldUpdateFocus(in context: UIFocusUpdateContext) -> Bool {return ఆॲཧ݁Ռ}override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {//ϑΥʔΧε࣌ʹߦ͍͍ͨॲཧ}https://developer.apple.com/reference/uikit/uifocusenvironment
DebugQuick Look
Debug_whyIsThisViewNotFocusableσόοά࣌ʹ_whyIsThisViewNotFocusableϝιουΛݺͿ͜ͱͰݪҼͱߟ͑ΒΕΔࣄ߲Λग़ྗͯ͘͠Ε·͢ɻ
Θ͔ͬͨࣄશͯͷϝιου͕͑ΔΘ͚Ͱͳ͍addHome(withName homeName: String, completionHandler completion: @escaping (HMHome?, Error?) -> Void)removeHome(_ home: HMHome, completionHandler completion: @escaping (Error?) -> Void)updatePrimaryHome(HMHome, completionHandler: (Error?) -> Void)Homeͷ࡞ʹݶΒͣɺRoomΞΫηαϦʹ͍ͭͯಉ༷
Θ͔ͬͨࣄશͯͷϝιου͕͑ΔΘ͚Ͱͳ͍• ߟ• TVجຊతʹݟΔ͚ͩͰɺૢ࡞͠ͳ͍ࣄ͕ଟ͍(ϦϞίϯͷૢ࡞ͩΔ͍...)ͨΊɺͦͷػೳ͕আ֎͞Ε͍ͯΔͷͰ!
͓·͚
͋ͳ͕ͨtvOSΞϓϦͷ։ൃΛ͢ΔͷͳΒग़ઌͰͷ࣮ػσόοάͭΒ͍
͋ͳ͕ͨtvOSΞϓϦͷ։ൃΛ͢ΔͷͳΒ
͋ͳ͕ͨtvOSΞϓϦͷ։ൃΛ͢ΔͷͳΒ• ࣮ػ(AppleTV)ܞଳੑʹ͍͠ͷͰɺHomeKitͷૢ࡞෦ͷ։ൃiPhoneͰߦ͑ΔΑ͏ʹͯͨ͠ํ͕ग़ઌͰ։ൃ͍͢͠ɻ
γϛϡϨʔλͰྑ͍ͷͰʁ!
HomeKitͷDBڞ༗ʹ͍ͭͯHomeKitͷiCloudʹΑΔDBڞ༗ γϛϡϨʔλͰग़དྷͳ͍
͓Θ͔Γ͍͚ͨͩͨͩΖ͏͔!?
࣮ػ։ൃΛڧ͍ΒΕΔཧ༝• HomeKit DBڞ༗࣮ػ͚ͩ• HomeKit FrameworkͰHome/Room/AccesoryͳͲͷ৽نొɾআɾฤू͕ग़དྷͳ͍• ඞવతʹσʔλiCloudܦ༝ͷHomeKit DBڞ༗པΈͱͳΔ
Enjoy tvOS App Development
ࢀߟจݙtvOSΞϓϦέʔγϣϯϓϩάϥϛϯάΨΠυhttps://developer.apple.com/jp/documentation/General/Conceptual/AppleTV_PG/2017ͦ͜tvOSΞϓϦ։ൃΛ࢝Ί͍ͨΤϯδχΞ͚ɺUI࣮ϊϋूhttps://techblog.yahoo.co.jp/advent-calendar-2016/tvosapp-tips/
ࢀߟจݙApple TV – tvOSೖ –https://developers.cyberagent.co.jp/blog/archives/3642/UIKitCatalogͷαϯϓϧίʔυ͔ΒtvOSͷϑΥʔΧεΛֶͿhttp://qiita.com/hanawat/items/a2542df65e0534979cb0ϚωʔϑΥϫʔυͷtvOSΞϓϦέʔγϣϯΛ։ൃͨ͠https://moneyforward.com/engineers_blog/2016/02/26/moneyforward-tvos/
Ҏ্