Cookpad Tech Kitchen #25 日本最大レシピサービスのモバイルアプリ開発事情 https://cookpad.connpass.com/event/195190/
https://techlife.cookpad.com/entry/2020/11/05/110000
ϞόΠϧΞϓϦߦಈϩάج൫Λେ౷Ұͨ͠@giginet2020/12/10 Cookpad Tech Kitchen #25
View Slide
୭ʁ• Twitter/GitHub : @giginet• ϞόΠϧج൫෦ iOSςοΫϦʔυ• ίϛολʔͬͯΔ• Carthage, fastlane, XcodeGen
ࠓ͢͜ͱ• ߴʹαʔϏε։ൃͰ͖Δߦಈϩάج൫ʢʮେ౷ҰϩΨʔʯʣͷ• ैདྷى͖͍ͯͨͷϩά࣮ͷ• ʮେ౷ҰϩΨʔʯͷߏͱΈ• ղܾͰ͖ͨ
https://techlife.cookpad.com/entry/2020/11/05/110000υΩϡϝϯτϕʔεͷܕ҆શͳϞόΠϧΞϓϦߦಈϩάج൫ͷߏங
ߦಈϩάͱ• Ϣʔβʔ͕ߦಈΛىͨ͜͜͠ͱΛه͢ΔΈ• ಛఆͷϘλϯΛλοϓͨ͠• ϨγϐΛݕࡧͨ͠
Α͋͘Δߦಈϩάͷ࣮ʢFirebase AnalyticsʣAnalytics.logEvent("select_content", parameters: ["content_type": "image","content_id": "P12453","items": [["name": "Kittens"]]])Πϕϯτ໊ϝλσʔλ
ϞόΠϧΞϓϦͷߦಈϩάʹ͋Γ͕ͪͳ͜ͱ
Α͋͘Δߦಈϩάͷ࣮ʢݱ࣮ʣAnalytics.logEvent("select_contnts", parameters: ["content_type": “video","content_id": nil,])UZQP DPOUFOU͕ਖ਼͍͠ະఆٛͷҬOJM͕ૹΒΕͯ͠·͏ϝλσʔλ͕Γͳ͍ JUFNT͕ඞཁ
ߦಈϩάʹ͋Γ͕ͪͳ͜ͱ• όʔδϣϯʹΑͬͯڍಈ͕มΘΔ• ࣮ϛεΛ͢Δ• ͍ͭͷ·ʹ͔ϩά͕ૹΒΕͳ͘ͳ͍ͬͯΔ
dmemo• σʔλϕʔευΩϡϝϯτཧπʔϧʢWebΞϓϦʣ• σʔλϕʔεͷςʔϒϧΧϥϜʹυΩϡϝϯτΛఴͰ͖Δ• https://github.com/hogelog/dmemo
ϩάͷυΩϡϝϯςʔγϣϯ• ૹΓଛͳͬͯमਖ਼ͨ͠ͱ͖ʹυΩϡϝϯτΛॻ͚ΔΑ͏ʹͳ͕ͬͨɺΧϥϜຖʹແݶͷऍ͕ඞཁ• Ͳ͏͍͏ڍಈʁ• ఆٛҬʁ• ͲͷόʔδϣϯͰʁ
৽͍͠ߦಈϩάج൫ͷཁٻ• ڍಈ༷ͳͲͷυΩϡϝϯςʔγϣϯΛ͍ͨ͘͢͠͠• ϦϦʔεόʔδϣϯຖͷมԽΛ͍͍ͨ• ؒҧ͕ͬͨૹΒΕͳ͍Α͏ʹ͍ͨ͠• ϩά࣮ͷϛεʹؾ͚ͮΔΑ͏ʹ͍ͨ͠
৽͍͠ϩάج൫ʮେ౷ҰϩΨʔʯ• ࣗવݴޠͰॻ͔ΕͨυΩϡϝϯτ͔Βܕ҆શͳϩΨʔͷ࣮Λੜ• υΩϡϝϯτίʔυͱಉ͡ϦϙδτϦͰཧ͞ΕΔͷͰ͍͍͢• ੜػίϯύΠϥͰϛεΛ͙Έ
ϩάͷఆٛΛ.BSLEPXOͰهड़
.BSLEPXOΛύʔε
ιʔείʔυΛੜ
ϩάόοΫΤϯυʹૹ৴
ΧςΰϦΠϕϯτΧϥϜͱܕ
/// Ϩγϐݕࡧը໘ͷΠϕϯτͰ͢public enum RecipeSearch: LogCategory {public static var categoryName: String { "recipe_search" }public var eventName: String {switch self {case .showRecipe: return "show_recipe"}}public func makePayload() -> [String: Any] {switch self {case let .showRecipe(recipeId):return ["recipe_id": recipeId.dump(),].compactMapValues { $0 }}}/// ݕࡧ݁Ռը໘͔ΒϨγϐৄࡉը໘ʹભҠ͢Δࡍʹૹ͞Ε·͢case showRecipe(recipeId: Int64)}
presentRecipeDetailViewController(recipeID: 42)logger.postLog(RecipeSearch.showRecipe(recipeId: 42))ϩάΛૹΔ࣮
υΩϡϝϯτϕʔεͷϩΨʔͷಛ• ϩάఆٛϦϙδτϦʹ͋Δ• ಛఆͷόʔδϣϯͷίʔυͱඥ͘• ϩάͷ࣮͕ܕ҆શʹͳΔ• ϛεͮ͠Β͍• IDEͷิ͚ͩͰ࣮Ͱ͖Δ
ϩάͷૹ৴ϛεΛ͙Έ࡞Γ
ϩάͷഇࢭϚʔΧʔͱ੩తղੳ• ഇࢭͨ͠ϩάΛυΩϡϝϯτʹهड़Ͱ͖ΔΑ͏ʹͨ͠• ഇࢭͨ͠ϩάίʔυੜ͔Βআ֎͞ΕΔͨΊૹ৴Ͱ͖ͳ͘ͳΔ• ٯʹഇࢭ͞Ε͍ͯͳ͍ϩά͕ૹ͞Ε͍ͯͳ͍߹Կ͔͓͔͍͠ͷͰؾ͚ͮΔΑ͏ʹͳΔ• ੩తղੳͰ͍ͬͯͳ͍ϩάఆٛΛνΣοΫͯ͠ܯࠂ
[obsolete]ࢦఆഇࢭϚʔΧʔ
/// όφʔΛλοϓͨ͠ͱ͖ʹૹ͞Ε·͢///όʔδϣϯXX.X͔Βόφʔදࣔ͞Εͳ͘ͳΓ·ͨ͠@available(*, unavailable)case tapPromotionBanner()
ϩά࣮ͷίϯύΠϧ࣌νΣοΫ• ֤ݴޠͷܕͷػೳΛͬͯɺෆਖ਼ͳૹΕͳ͍Α͏ʹ• Optional• σϑΥϧτͰnilΛૹΕͳ͍ɻૹΕΔΧϥϜ͚ͩࢦఆͰ͖Δ• ΧελϜܕ• ૹΕΔΛenumͳͲܕͰ੍
OJMڐ༰ʢΦϓγϣφϧʣΧελϜܕ
logger.postLog(RecipeSearch.search(keyword: "ܲͷ༲͛",excludeKeyword: nil,order: .popularity))FNVNͰ੍͞ΕΔOJMૹΕΔ
ߦಈϩάʹ͋Γ͕ͪͳ͜ͱ• ✅όʔδϣϯʹΑͬͯڍಈ͕มΘΔ• →ϦϙδτϦʹυΩϡϝϯτ͕ΔΑ͏ʹͳͬͨ• ✅࣮ϛεΛ͢Δ• →ܕ҆શͳͷͰ࣮Λϛεͮ͠Β͍• ✅͍ͭͷ·ʹ͔ϩά͕ૹΒΕͳ͘ͳ͍ͬͯΔ• →੩తղੳʹΑ͙ͬͯ͢ʹؾ͚ͮΔ
େ౷Ұʁ• υΩϡϝϯτͷཧํ๏͕౷Ұ͞Εͨ• ϓϥοτϑΥʔϜؒͰ౷Ұ͞Εͨ• Swift, Kotlin, TypeScriptͷίʔυੜػ͕࣮ݱ• ੜͷΈ͕ڞ௨ͳ͚ͩͰɺϩάͷఆٛผ• ϩάੳͷͨΊͷςʔϒϧ͕౷Ұ͞Εͨ• ৄ࣍͘͠ͷൃදͰʂ
·ͱΊ• υΩϡϝϯτͷཧ͕༰қʹͳͬͨ• υΩϡϝϯτΛॻ͚ͯ؆୯ʹӾཡͰ͖ΔΑ͏ʹ• ϦϦʔεόʔδϣϯͱυΩϡϝϯτ͕ඥ͘Α͏ʹ• ։ൃதʹ֬ೝ͍͢͠Α͏ʹ
·ͱΊ• ϩάͷૹΓؒҧ͍͕ΈͰ͛ΔΑ͏ʹͳͬͨ• ఆٛ֎ͷΛૹΕͳ͍Α͏ʹͳͬͨ• ࣮͠ΕΛܯࠂͰ͖ΔΑ͏ʹͳͬͨ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠