iOSDC Japan 2020 9/19 TrackA のセッション
ॴ༑ଠ:VUB5PLPSP J04UW04"QQ1SPHSBNNFS)PNF,JUJ04%$+BQBO
View Slide
@tokorom tokoromSpinners Inc.ॴ ༑ଠ / Yuta Tokoro
)PNF,JU֓ཁ)PNF,JUͱ
)PNF,JU֓ཁ)PNF,JUશମ૾w J1IPOFͳͲͷ"QQMF͔Β༷ʑͳσόΠεΛཧɾίϯτϩʔϧ͢ΔͨΊͷΈ)PNF,JU
)PNF,JU֓ཁ)PNF,JU'SBNFXPSLw αʔυύʔςΟΞϓϦ͕ରԠΛίϯτϩʔϧ͢ΔͨΊͷ'SBNFXPSL)PNF,JU'SBNFXPSL
)PNF,JU֓ཁ)PNF,JU"%,w )PNF,JUʹରԠσόΠεΛ։ൃ͢ΔͨΊͷΩοτ)PNF,JU"%,
)PNF,JU֓ཁ)"1w "QQMFͱ)PNF,JUରԠσόΠε͕૬ޓʹ௨৴͢ΔͨΊͷϓϩτίϧ)PNF,JU"DDFTTPSZ1SPUPDPM)"1
"HFOEBw )PNF,JU'SBNFXPSLͬ͘͟Γೖw )PNF,JUͷ#SJEHFʹ͍ͭͯw )PNFCSJEHFͰ)PNF,JUະରԠΛ)PNF,JUରԠw )PNF,JU"%,Ͱ࡞Δࣗ࡞ΞΫηαϦ
)PNF,JU'SBNFXPSLͬ͘͟Γೖ)PNF,JU'SBNFXPSLͰͰ͖Δ͜ͱ
)PNF,JU'SBNFXPSLͬ͘͟Γೖ)PNF,JU'SBNFXPSLͰͰ͖Δ͜ͱw ϗʔϜϧʔϜͳͲͷάϧʔϐϯάͷཧw σόΠεͷཧͱૢ࡞w σόΠεΛҰʹૢ࡞͢Δγʔϯͷཧw ΦʔτϝʔγϣϯͷͨΊͷτϦΨʔͷཧw ϗʔϜʹΞΫηεͰ͖ΔϢʔβʔͷཧw ϗʔϜσόΠεͷมߋݕ
)PNF,JU'SBNFXPSLͬ͘͟Γೖཧཁૉͷߏ
)PNF,JU'SBNFXPSLͬ͘͟Γೖ)PNF,JUͷߏ
)PNF,JU'SBNFXPSLͬ͘͟ΓೖిٿΛ౮ͤ͞Δίʔυlet power = home.servicesWithTypes([HMServiceTypeLightbulb])?.first?.characteristics.filter { $0.characteristicType == HMCharacteristicTypePowerState }.firstpower.writeValue(true) { error in}
)PNF,JU'SBNFXPSLͬ͘͟Γೖαϙʔτ͍ͯ͠ΔΩϟϥΫλʔlet power = home.servicesWithTypes([HMServiceTypeLightbulb])?.first?.characteristics.filter { $0.characteristicType == HMCharacteristicTypePowerState }.firstpower.writeValue(true) { error in}
)PNF,JU'SBNFXPSLͬ͘͟Γೖαϙʔτ͍ͯ͠ΔΩϟϥΫλʔ
)PNF,JU'SBNFXPSLͬ͘͟ΓೖӅ͠ΩϟϥΫλʔΛࢀর͢Δ&MHBUP&WF8FBUIFS8JSFMFTT0VUEPPS4FOTPS
)PNF,JU'SBNFXPSLͬ͘͟ΓೖӅ͠ΩϟϥΫλʔΛࢀর͢Δw ؾԹw ࣪w ؾѹ)PNF,JUະαϙʔτͷΩϟϥΫλʔʂ
)PNF,JU'SBNFXPSLͬ͘͟ΓೖӅ͠ΩϟϥΫλʔΛࢀর͢Δlet power = home.servicesWithTypes([HMServiceTypeLightbulb])?.first?.characteristics.filter { $0.characteristicType == HMCharacteristicTypePowerState }.firstpower.writeValue(true) { error in}
)PNF,JU'SBNFXPSLͬ͘͟ΓೖӅ͠ΩϟϥΫλʔΛࢀর͢Δlet airPressure = home.servicesWithTypes(["E863F00A-079E-48FF-8F27-9C2605A29F52"])?.first?.characteristics.filter { $0.characteristicType == "E863F10F-079E-48FF-8F27-9C2605A29F52" }.firstairPressure.readValue { error inlet value = airPressure.value as? Float}
)PNF,JU'SBNFXPSLͬ͘͟ΓೖӅ͠ΩϟϥΫλʔΛࢀর͢Δfor characteristic in service.characteristics {print("ID: \(characteristic.characteristicType)”)print("આ໌: \(characteristic.metadata?.manufacturerDescription ?? "")")}
)PNF,JU'SBNFXPSLͬ͘͟Γೖ).$BNFSB7JFX
)PNF,JUͰͰ͖Δ͜ͱ۩ମྫଞϓϥοτϑΥʔϜΑΓࡉ͔ͳઃఆw ΫϦεϚεϥΠτΛʮͷೖʯʹ౮͢Δw Ոʹ୭͍ͳ͘ͳͬͨΒશͯͷిؾΛফ౮ͯ͠ώʔλʔΛࢭΊΔw ࣗಈ౮ͨ͠ϥΠτΛඵޙʹফ౮͢Δw தͰτΠϨ͕े໌Δ͚Εࣗಈ౮͠ͳ͍
)PNF,JUͷ#SJEHFʹ͍ͭͯ)VFͷྫ
)PNF,JUͷ#SJEHFʹ͍ͭͯ)VFͷྫ)PNF,JUະରԠʂʁ
)PNF,JUͷ#SJEHFʹ͍ͭͯ)VFͷྫ)VF#SJEHF
)PNF,JUͷ#SJEHFʹ͍ͭͯ)PNFCSJEHFIUUQTIPNFCSJEHFJP
)PNF,JUͷ#SJEHFʹ͍ͭͯ)VFͷྫ)PNFCSJEHF"#$ %
)PNFCSJEHFରԠσόΠεͷ۩ମྫϧϯό#SPBEMJOL3.NJOJʢ֎ઢϦϞίϯʣ4&4".&ʢεϚʔτϩοΫʣΧϝϥ
)PNFCSJEHFࣗͰ)PNFCSJEHFΛ͏ʹ"#$ %
)PNFCSJEHFࣗͰ)PNFCSJEHFΛ͏ʹ"#$ %IUUQTIPNFCSJEHFJP
)PNFCSJEHF)PNFCSJEHFΛ)PNFʹՃ
)PNFCSJEHFϓϥάΠϯΛࣗ࡞IUUQTHJUIVCDPNIPNFCSJEHFIPNFCSJEHFQMVHJOUFNQMBUF
)PNF,JU"%,֓ཁw )PNF,JU"DDFTTPSZ%FWFMPQNFOU,JUw ΞΫηαϦʔϝʔΧʔ͕)PNF,JUରԠσόΠεΛ։ൃ͢ΔͨΊͷΩοτw ݄ʹΦʔϓϯιʔε൛͕ϦϦʔεw झຯͰͳΒࣗ༝ʹ։ൃͯ͠0,
)PNF,JU"%,)PNFCSJEHFͱͷҧ͍)PNFCSJEHF#$ %"
)PNF,JU"%,)PNFCSJEHFͱͷҧ͍"%,#$ %""%,"%,"%,
)PNF,JU"%,ࣗͰΞΫηαϦʔΛ࡞ΔIUUQTHJUIVCDPNBQQMF)PNF,JU"%,
)PNF,JU"%,ࣗͰΞΫηαϦʔΛ࡞Δ$ brew install [υΩϡϝϯτʹॻ͔Ε͍ͯΔͷ͍͔ͭ͘]$ make all$ ./Output/লུ/Debug/IP/Applications/Lightbulb.OpenSSL
)PNF,JU"%,ࣗͰΞΫηαϦʔΛ࡞ΔInfo [com.apple.mfi.HomeKit.Core:AccessoryServer] Accessory server starting.
)PNF,JU"%,ࣗͰΞΫηαϦʔΛ࡞Δ
)PNF,JU"%,ࣗͰΞΫηαϦʔΛ࡞ΔInfo HandleLightBulbOnWrite: true...Info HandleLightBulbOnWrite: false
)PNF,JU"%,ࣗͰΞΫηαϦʔΛ࡞Δlightbulb_slack/Applications/Lightbulb/App.c#include HAPError HandleLightBulbOnWrite(// ...if (value) {system("./handleLightBulbOn");}// ...}
)PNF,JU"%,ࣗͰΞΫηαϦʔΛ࡞Δ#!/usr/bin/swiftimport Foundationlet slackURL = URL(string: "Incoming Webhook URL")var request = URLRequest(url: slackURL!)request.httpMethod = "POST"request.setValue("application/json", forHTTPHeaderField: "Content-type")let message = "ϥΠτ͕౮"let postData = "{\"text\": \"\(message)\"}".data(using: .utf8)request.httpBody = postDatalet semaphore = DispatchSemaphore(value: 0)let session = URLSession(configuration: URLSessionConfiguration.default)let task = session.dataTask(with: request) { _, _, _ insemaphore.signal()}task.resume()semaphore.wait()
.PSF*OGPSNBUJPOw J041SPHSBNNJOHw Ξοϓϧͷ)PNF1PEͱ)PNF,JUٕज़ຊIUUQTQFBLTDDCPPLTJ04IUUQTCPPUIQNKBJUFNT