Slide 1

Slide 1 text

ϞόΠϧΞϓϦߦಈϩάج൫ Λେ౷Ұͨ͠࿩ @giginet 2020/12/10 Cookpad Tech Kitchen #25

Slide 2

Slide 2 text

୭ʁ • Twitter/GitHub : @giginet • ϞόΠϧج൫෦ iOSςοΫϦʔυ • ίϛολʔ΍ͬͯΔ • Carthage, fastlane, XcodeGen

Slide 3

Slide 3 text

ࠓ೔࿩͢͜ͱ • ߴ଎ʹαʔϏε։ൃͰ͖Δߦಈϩάج൫ʢʮେ౷ҰϩΨʔʯʣͷ࿩ • ैདྷى͖͍ͯͨͷϩά࣮૷ͷ໰୊఺ • ʮେ౷ҰϩΨʔʯͷߏ଄ͱ࢓૊Έ • ղܾͰ͖ͨ໰୊

Slide 4

Slide 4 text

https://techlife.cookpad.com/entry/ 2020/11/05/110000 υΩϡϝϯτϕʔεͷܕ҆શͳϞόΠϧΞϓϦ ߦಈϩάج൫ͷߏங

Slide 5

Slide 5 text

ߦಈϩάͱ͸ • Ϣʔβʔ͕ߦಈΛىͨ͜͜͠ͱΛه࿥͢Δ࢓૊Έ • ಛఆͷϘλϯΛλοϓͨ͠ • ϨγϐΛݕࡧͨ͠

Slide 6

Slide 6 text

Α͋͘Δߦಈϩάͷ࣮૷ʢFirebase Analyticsʣ Analytics.logEvent("select_content", parameters: [ "content_type": "image", "content_id": "P12453", "items": [["name": "Kittens"]] ]) Πϕϯτ໊ ϝλσʔλ

Slide 7

Slide 7 text

ϞόΠϧΞϓϦͷ ߦಈϩάʹ͋Γ͕ͪͳ͜ͱ

Slide 8

Slide 8 text

Α͋͘Δߦಈϩάͷ࣮૷ʢݱ࣮ʣ Analytics.logEvent("select_contnts", parameters: [ "content_type": “video", "content_id": nil, ]) UZQP DPOUFOU͕ਖ਼͍͠ ະఆٛͷ஋Ҭ OJM͕ૹΒΕͯ͠·͏ ϝλσʔλ͕଍Γͳ͍ JUFNT͕ඞཁ

Slide 9

Slide 9 text

ߦಈϩάʹ͋Γ͕ͪͳ͜ͱ • όʔδϣϯʹΑͬͯڍಈ͕มΘΔ • ࣮૷ϛεΛ͢Δ • ͍ͭͷ·ʹ͔ϩά͕ૹΒΕͳ͘ͳ͍ͬͯΔ

Slide 10

Slide 10 text

dmemo • σʔλϕʔευΩϡϝϯτ؅ཧπʔϧʢWebΞϓϦʣ • σʔλϕʔεͷςʔϒϧ΍ΧϥϜʹυΩϡϝϯτΛఴ෇Ͱ͖Δ • https://github.com/hogelog/dmemo

Slide 11

Slide 11 text

ϩάͷυΩϡϝϯςʔγϣϯ • ૹΓଛͳͬͯमਖ਼ͨ͠ͱ͖ʹυΩϡϝϯτΛॻ͚ΔΑ͏ʹͳ͕ͬͨɺ ΧϥϜຖʹແݶͷ஫ऍ͕ඞཁ • Ͳ͏͍͏ڍಈʁ • ఆٛҬ͸ʁ • ͲͷόʔδϣϯͰʁ

Slide 12

Slide 12 text

৽͍͠ߦಈϩάج൫ͷཁٻ • ڍಈ΍࢓༷ͳͲͷυΩϡϝϯςʔγϣϯΛ͠΍͍ͨ͘͢͠ • ϦϦʔεόʔδϣϯຖͷมԽΛ௥͍͍ͨ • ؒҧͬͨ஋͕ૹΒΕͳ͍Α͏ʹ͍ͨ͠ • ϩά࣮૷ͷϛεʹؾ͚ͮΔΑ͏ʹ͍ͨ͠

Slide 13

Slide 13 text

৽͍͠ϩάج൫ʮେ౷ҰϩΨʔʯ • ࣗવݴޠͰॻ͔ΕͨυΩϡϝϯτ͔Βܕ҆શͳϩΨʔͷ࣮૷Λੜ੒ • υΩϡϝϯτ͸ίʔυͱಉ͡ϦϙδτϦͰ؅ཧ͞ΕΔͷͰ௥͍΍͍͢ • ੜ੒ػ΍ίϯύΠϥͰϛεΛ๷͙࢓૊Έ

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

ϩάͷఆٛΛ.BSLEPXOͰهड़

Slide 16

Slide 16 text

.BSLEPXOΛύʔε

Slide 17

Slide 17 text

ιʔείʔυΛੜ੒

Slide 18

Slide 18 text

ϩάόοΫΤϯυʹૹ৴

Slide 19

Slide 19 text

ΧςΰϦ Πϕϯτ ΧϥϜͱܕ

Slide 20

Slide 20 text

/// Ϩγϐݕࡧը໘ͷΠϕϯτͰ͢ 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) }

Slide 21

Slide 21 text

presentRecipeDetailViewController(recipeID: 42) logger.postLog(RecipeSearch.showRecipe(recipeId: 42)) ϩάΛૹΔ࣮૷

Slide 22

Slide 22 text

υΩϡϝϯτϕʔεͷϩΨʔͷಛ௃ • ϩάఆٛ͸ϦϙδτϦ಺ʹ͋Δ • ಛఆͷόʔδϣϯͷίʔυͱඥ෇͘ • ϩάͷ࣮૷͕ܕ҆શʹͳΔ • ϛεͮ͠Β͍ • IDEͷิ׬͚ͩͰ࣮૷Ͱ͖Δ

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

ϩάͷૹ৴ϛεΛ๷͙࢓૊Έ࡞Γ

Slide 25

Slide 25 text

ϩάͷഇࢭϚʔΧʔͱ੩తղੳ • ഇࢭͨ͠ϩάΛυΩϡϝϯτʹهड़Ͱ͖ΔΑ͏ʹͨ͠ • ഇࢭͨ͠ϩά͸ίʔυੜ੒͔Βআ֎͞ΕΔͨΊૹ৴Ͱ͖ͳ͘ͳΔ • ٯʹഇࢭ͞Ε͍ͯͳ͍ϩά͕ૹ෇͞Ε͍ͯͳ͍৔߹͸Կ͔͓͔͍͠ ͷͰؾ͚ͮΔΑ͏ʹͳΔ • ੩తղੳͰ࢖͍ͬͯͳ͍ϩάఆٛΛνΣοΫͯ͠ܯࠂ

Slide 26

Slide 26 text

[obsolete]ࢦఆ ഇࢭϚʔΧʔ

Slide 27

Slide 27 text

/// όφʔΛλοϓͨ͠ͱ͖ʹૹ෇͞Ε·͢ ///όʔδϣϯXX.X͔Βόφʔ͸දࣔ͞Εͳ͘ͳΓ·ͨ͠ @available(*, unavailable) case tapPromotionBanner()

Slide 28

Slide 28 text

ϩά࣮૷ͷίϯύΠϧ࣌νΣοΫ • ֤ݴޠͷܕͷػೳΛ࢖ͬͯɺෆਖ਼ͳ஋͸ૹΕͳ͍Α͏ʹ • Optional • σϑΥϧτͰ͸nilΛૹΕͳ͍ɻૹΕΔΧϥϜ͚ͩࢦఆͰ͖Δ • ΧελϜܕ • ૹΕΔ஋ΛenumͳͲܕͰ੍໿

Slide 29

Slide 29 text

OJMڐ༰ʢΦϓγϣφϧʣ ΧελϜܕ

Slide 30

Slide 30 text

logger.postLog(RecipeSearch.search(keyword: "ܲͷ౜༲͛", excludeKeyword: nil, order: .popularity)) FNVNͰ੍໿͞ΕΔ OJM΋ૹΕΔ

Slide 31

Slide 31 text

ߦಈϩάʹ͋Γ͕ͪͳ͜ͱ • ✅όʔδϣϯʹΑͬͯڍಈ͕มΘΔ • →ϦϙδτϦʹυΩϡϝϯτ͕࢒ΔΑ͏ʹͳͬͨ • ✅࣮૷ϛεΛ͢Δ • →ܕ҆શͳͷͰ࣮૷Λϛεͮ͠Β͍ • ✅͍ͭͷ·ʹ͔ϩά͕ૹΒΕͳ͘ͳ͍ͬͯΔ • →੩తղੳʹΑ͙ͬͯ͢ʹؾ͚ͮΔ

Slide 32

Slide 32 text

େ౷Ұʁ • υΩϡϝϯτͷ؅ཧํ๏͕౷Ұ͞Εͨ • ϓϥοτϑΥʔϜؒͰ౷Ұ͞Εͨ • Swift, Kotlin, TypeScriptͷίʔυੜ੒ػ͕࣮ݱ • ੜ੒ͷ࢓૊Έ͕ڞ௨ͳ͚ͩͰɺϩάͷఆٛ͸ผ • ϩά෼ੳͷͨΊͷςʔϒϧ͕౷Ұ͞Εͨ • ৄ͘͠͸࣍ͷൃදͰʂ

Slide 33

Slide 33 text

·ͱΊ • υΩϡϝϯτͷ؅ཧ͕༰қʹͳͬͨ • υΩϡϝϯτΛॻ͚ͯ؆୯ʹӾཡͰ͖ΔΑ͏ʹ • ϦϦʔεόʔδϣϯͱυΩϡϝϯτ͕ඥ෇͘Α͏ʹ • ։ൃதʹ֬ೝ͠΍͍͢Α͏ʹ

Slide 34

Slide 34 text

·ͱΊ • ϩάͷૹΓؒҧ͍͕࢓૊ΈͰ๷͛ΔΑ͏ʹͳͬͨ • ఆٛ֎ͷ஋ΛૹΕͳ͍Α͏ʹͳͬͨ • ࣮૷͠๨ΕΛܯࠂͰ͖ΔΑ͏ʹͳͬͨ

Slide 35

Slide 35 text

https://techlife.cookpad.com/entry/ 2020/11/05/110000 υΩϡϝϯτϕʔεͷܕ҆શͳϞόΠϧΞϓϦ ߦಈϩάج൫ͷߏங

Slide 36

Slide 36 text

͝ਗ਼ௌ ͋Γ͕ͱ͏ ͍͟͝·ͨ͠