Share
Embed
モバイルアプリの行動ログの「仕込み」を快適にする / iOSDC Japan 2022 - Mobile App Logging
iOSDC Japan 2022、9/12(月) 13:55〜 Track B での発表内容です
https://fortee.jp/iosdc-japan-2022/proposal/ad544d2d-0e37-48f7-836a-3d46abe4ad2f
動画
https://youtu.be/4NGvI9PoAIQ?list=PLod2oSGQp3W6tx5JMQntpuZ-fNpP4Y_Hh
クックパッドの After Party についてhttps://cookpad.connpass.com/event/254459/
Yuji Fujisaka
September 12, 2022
Transcript
93 slides
-
ߦಈϩάͱ Ϣʔβʔૢ࡞Λىʹૹ৴͞ΕΔϩά w ྫɿݕࡧ݁Ռը໘Λදࣔ w ྫɿจϘλϯΛλοϓ ‣ ΞϓϦͷར༻ঢ়گΛੳ͠ αʔϏε։ൃͷҙࢥܾఆʹཱͯΔ ʲʓʓը໘Λදࣔʳ
ʲ˚˚˚Λλοϓʳ ʜʜ ूੵ తʹ͋Θͤͯ ूܭ ૢ࡞͝ͱʹૹ৴ -
ߦಈϩάͷ࣮ ྫɿ(PPHMF"OBMZUJDT 'JSFCBTF IUUQTpSFCBTFHPPHMFDPNEPDTBOBMZUJDTFWFOUT Analytics.logEvent("select_content", parameters: [ "content_type": "image", "content_id":
"P12453", "items": [["name": "Kittens"]] ]) ੳʹඞཁͳใʢྫɿΠϕϯτ໊ɺίϯςϯπͷछྨɺ*%ʣΛϩΨʔͰૹ৴ -
ߦಈϩάͷར༻ͷྲྀΕ ྫɿԾઆݕূͷҰ࿈ʢΫοΫύουJ04ΞϓϦ ݕূઃܭ ࢪࡦഎܠͷཧղ طଘϩάͷൃ۷ ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε
ػೳ։ൃ ৽نϩάͷՃ σʔλूܭʢ42-࡞ʣ ղऍɾධՁ -
ߦಈϩάͷར༻ͷྲྀΕ ྫɿԾઆݕূͷҰ࿈ʢΫοΫύουJ04ΞϓϦ ݕূઃܭ ࢪࡦഎܠͷཧղ طଘϩάͷൃ۷ ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε
ػೳ։ൃ ৽نϩάͷՃ σʔλूܭʢ42-࡞ʣ ղऍɾධՁ ܧଓஅ -
ߦಈϩάͷར༻ͷྲྀΕ ྫɿԾઆݕূͷҰ࿈ʢΫοΫύουJ04ΞϓϦ ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε #͞Μ "͞Μ "͞Μ
ػೳͱϩάͷ࣮ ੳ༻42-ͷ࡞ -
ߦಈϩάͷར༻ͷྲྀΕ ྫɿԾઆݕূͷҰ࿈ʢΫοΫύουJ04ΞϓϦ ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε #͞Μ "͞Μ "͞Μ
ػೳͱϩάͷ࣮ ੳ༻42-ͷ࡞ ࣮ऀͱੳऀ͕ผʑͳ͜ͱ -
ߦಈϩάͷར༻ͷྲྀΕ ྫɿԾઆݕূͷҰ࿈ʢΫοΫύουJ04ΞϓϦ ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε #͞Μ $͞Μ %͞Μ
ੳ༻42-ͷ ࡞ ػೳͱϩά ͷ࣮ -
ߦಈϩάͷར༻ͷྲྀΕ ྫɿԾઆݕূͷҰ࿈ʢΫοΫύουJ04ΞϓϦ ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε #͞Μ $͞Μ %͞Μ
ੳ༻42-ͷ ࡞ ػೳͱϩά ͷ࣮ ࣮ऀͱੳऀ͕ಉҰͳ͜ͱ -
ߦಈϩάͷར༻ͷྲྀΕ ྫɿԾઆݕূͷҰ࿈ʢΫοΫύουJ04ΞϓϦ ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε &͞Μ ػೳͱϩά ͷ࣮
ੳ༻42-ͷ ࡞ ࣄલௐࠪ اը ʮ࣍ʜʜʯ ࣮ऀͱੳऀ͕ಉҰͳ͜ͱ -
ߦಈϩάͰ͋Γ͕ͪͳͷྫ ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε w#ΞϓϦόʔδϣϯ͝ͱͷڍಈࠩҟ w#ϩάͷ࣮ϛεʢ໊߲ͷUZQPɺඞཁͳใͷܽଛɺܕͷؒҧ͍ʣ ‣ ྺ࢙తܦҢ͕ੵΈॏͳΓɺޙੈͷਓʹࡂ͕ʜʜ$
ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε Oޙ ʜʜ $ -
ߦಈϩάͰ͋Γ͕ͪͳͷྫ ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε w#ΞϓϦόʔδϣϯ͝ͱͷڍಈࠩҟ w#ϩάͷ࣮ϛεʢ໊߲ͷUZQPɺඞཁͳใͷܽଛɺܕͷؒҧ͍ʣ ‣ ྺ࢙తܦҢ͕ੵΈॏͳΓɺޙੈͷਓʹࡂ͕ʜʜ$
ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε Oޙ ʜʜ $ -
υΩϡϝϯτϕʔεͷܕ҆શͳϩά࣮ίʔυࣗಈੜ ֓ཁ wϩάఆٛυΩϡϝϯτʢ.BSLEPXOʣ͔Β ϩά࣮ίʔυʢ4XJGUʣΛࣗಈੜ τϥϯεύΠϧ # recipe_search Ϩγϐݕࡧը໘ͷΠϕϯτͰ͢ ## search
ϨγϐݕࡧΛߦͬͨࡍʹૹ͞Ε·͢ - keyword: !string 256 - ݕࡧΩʔϫʔυ - order: SearchOrder - ݕࡧॱ - latest,popularity ## show_recipe ݕࡧ݁Ռը໘͔ΒϨγϐৄࡉը໘ʹભҠ͢Δࡍʹૹ͞Ε·͢ - recipe_id: !integer - දࣔͨ͠ϨγϐͷID /// Ϩγϐݕࡧը໘ͷΠϕϯτͰ͢ public enum RecipeSearch: LogCategory { public static var categoryName: String { "recipe_search" } public var eventName: String { switch self { case .search: return "search" case .showRecipe: return "show_recipe" } } public func makePayload() -> [String: Any] { switch self { case let .search(keyword, order): return [ "keyword": keyword.validateLength(within: 256).dump(), "order": order.dump(), ].compactMapValues { $0 } case let .showRecipe(recipeId): return [ "recipe_id": recipeId.dump(), ].compactMapValues { $0 } } } /// ϨγϐݕࡧΛߦͬͨࡍʹૹ͞Ε·͢ case search(keyword: String, order: SearchOrder) /// ݕࡧ݁Ռը໘͔ΒϨγϐৄࡉը໘ʹભҠ͢Δࡍʹૹ͞Ε·͢ case showRecipe(recipeId: Int64) } ਓ͕ॻ͍ͨ.BSLEPXOܗࣜͷυΩϡϝϯτ ࣗಈੜ͞ΕΔ4XJGUͷίʔυ The Swift logo is a trademark of Apple Inc. https://developer.apple.com/swift/resources/ The Markdown Mark https://github.com/dcurtis/markdown-mark -
υΩϡϝϯτϕʔεͷܕ҆શͳϩά࣮ίʔυࣗಈੜ ۩ମྫ खॱ ɹϩά༷Λߟ͑ͯ ɹυΩϡϝϯτΛهड़ ɹ # recipe_search Ϩγϐݕࡧը໘ͷΠϕϯτͰ͢ ##
search ϨγϐݕࡧΛߦͬͨࡍʹૹ͞Ε·͢ - keyword: !string 256 - ݕࡧΩʔϫʔυ - order: SearchOrder - ݕࡧॱ - latest,popularity ## show_recipe ݕࡧ݁Ռը໘͔ΒϨγϐৄࡉը໘ʹભҠ͢Δࡍʹૹ͞Ε·͢ - recipe_id: !integer - දࣔͨ͠ϨγϐͷID -
υΩϡϝϯτϕʔεͷܕ҆શͳϩά࣮ίʔυࣗಈੜ ۩ମྫ खॱ ɹϩά༷Λߟ͑ͯ ɹυΩϡϝϯτΛهड़ ɹ # recipe_search Ϩγϐݕࡧը໘ͷΠϕϯτͰ͢ ##
search ϨγϐݕࡧΛߦͬͨࡍʹૹ͞Ε·͢ - keyword: !string 256 - ݕࡧΩʔϫʔυ - order: SearchOrder - ݕࡧॱ - latest,popularity ## show_recipe ݕࡧ݁Ռը໘͔ΒϨγϐৄࡉը໘ʹભҠ͢Δࡍʹૹ͞Ε·͢ - recipe_id: !integer - දࣔͨ͠ϨγϐͷID ## search ϨγϐݕࡧΛߦͬͨࡍʹૹ͞Ε·͢ - keyword: !string 256 - ݕࡧΩʔϫʔυ - order: SearchOrder - ݕࡧॱ - latest, popularity -
खॱ εΫϦϓτΛ࣮ߦ ˠ9DPEFϓϩδΣΫτʹ ɹίʔυ͕ࣗಈੜ͞ΕΔ υΩϡϝϯτϕʔεͷܕ҆શͳϩά࣮ίʔυࣗಈੜ ۩ମྫ /// Ϩγϐݕࡧը໘ͷΠϕϯτͰ͢ public
enum RecipeSearch: LogCategory { public static var categoryName: String { "recipe_search" } public var eventName: String { switch self { case .search: return "search" case .showRecipe: return "show_recipe" } } public func makePayload() -> [String: Any] { switch self { case let .search(keyword, order): return [ "keyword": keyword.validateLength(within: 256).dump(), "order": order.dump(), ].compactMapValues { $0 } case let .showRecipe(recipeId): return [ "recipe_id": recipeId.dump(), ].compactMapValues { $0 } } } /// ϨγϐݕࡧΛߦͬͨࡍʹૹ͞Ε·͢ case search(keyword: String, order: SearchOrder) /// ݕࡧ݁Ռը໘͔ΒϨγϐৄࡉը໘ʹભҠ͢Δࡍʹૹ͞Ε·͢ case showRecipe(recipeId: Int64) } -
खॱ εΫϦϓτΛ࣮ߦ ˠ9DPEFϓϩδΣΫτʹ ɹίʔυ͕ࣗಈੜ͞ΕΔ υΩϡϝϯτϕʔεͷܕ҆શͳϩά࣮ίʔυࣗಈੜ ۩ମྫ /// Ϩγϐݕࡧը໘ͷΠϕϯτͰ͢ public
enum RecipeSearch: LogCategory { public static var categoryName: String { "recipe_search" } public var eventName: String { switch self { case .search: return "search" case .showRecipe: return "show_recipe" } } public func makePayload() -> [String: Any] { switch self { case let .search(keyword, order): return [ "keyword": keyword.validateLength(within: 256).dump(), "order": order.dump(), ].compactMapValues { $0 } case let .showRecipe(recipeId): return [ "recipe_id": recipeId.dump(), ].compactMapValues { $0 } } } /// ϨγϐݕࡧΛߦͬͨࡍʹૹ͞Ε·͢ case search(keyword: String, order: SearchOrder) /// ݕࡧ݁Ռը໘͔ΒϨγϐৄࡉը໘ʹભҠ͢Δࡍʹૹ͞Ε·͢ case showRecipe(recipeId: Int64) } NBLFίϚϯυ -
खॱ εΫϦϓτΛ࣮ߦ ˠ9DPEFϓϩδΣΫτʹ ɹίʔυ͕ࣗಈੜ͞ΕΔ υΩϡϝϯτϕʔεͷܕ҆શͳϩά࣮ίʔυࣗಈੜ ۩ମྫ /// Ϩγϐݕࡧը໘ͷΠϕϯτͰ͢ public
enum RecipeSearch: LogCategory { public static var categoryName: String { "recipe_search" } public var eventName: String { switch self { case .search: return "search" case .showRecipe: return "show_recipe" } } public func makePayload() -> [String: Any] { switch self { case let .search(keyword, order): return [ "keyword": keyword.validateLength(within: 256).dump(), "order": order.dump(), ].compactMapValues { $0 } case let .showRecipe(recipeId): return [ "recipe_id": recipeId.dump(), ].compactMapValues { $0 } } } /// ϨγϐݕࡧΛߦͬͨࡍʹૹ͞Ε·͢ case search(keyword: String, order: SearchOrder) /// ݕࡧ݁Ռը໘͔ΒϨγϐৄࡉը໘ʹભҠ͢Δࡍʹૹ͞Ε·͢ case showRecipe(recipeId: Int64) } NBLFίϚϯυ ϩάఆٛͷྻڍܕʢFOVNʣɹ -
खॱ εΫϦϓτΛ࣮ߦ ˠ9DPEFϓϩδΣΫτʹ ɹίʔυ͕ࣗಈੜ͞ΕΔ υΩϡϝϯτϕʔεͷܕ҆શͳϩά࣮ίʔυࣗಈੜ ۩ମྫ /// Ϩγϐݕࡧը໘ͷΠϕϯτͰ͢ public
enum RecipeSearch: LogCategory { public static var categoryName: String { "recipe_search" } public var eventName: String { switch self { case .search: return "search" case .showRecipe: return "show_recipe" } } public func makePayload() -> [String: Any] { switch self { case let .search(keyword, order): return [ "keyword": keyword.validateLength(within: 256).dump(), "order": order.dump(), ].compactMapValues { $0 } case let .showRecipe(recipeId): return [ "recipe_id": recipeId.dump(), ].compactMapValues { $0 } } } /// ϨγϐݕࡧΛߦͬͨࡍʹૹ͞Ε·͢ case search(keyword: String, order: SearchOrder) /// ݕࡧ݁Ռը໘͔ΒϨγϐৄࡉը໘ʹભҠ͢Δࡍʹૹ͞Ε·͢ case showRecipe(recipeId: Int64) } NBLFίϚϯυ ϩάఆٛͷྻڍܕʢFOVNʣɹ /// Ϩγϐݕࡧը໘ͷΠϕϯτͰ͢ public enum RecipeSearch: LogCategory { ʢதུʣ ɹ /// ϨγϐݕࡧΛߦͬͨࡍʹૹ͞Ε·͢ case search(keyword: String, order: SearchOrder) /// ݕࡧ݁Ռը໘͔ΒϨγϐৄࡉը໘ʹભ…… case showRecipe(recipeId: Int64) } -
υΩϡϝϯτϕʔεͷܕ҆શͳϩά࣮ίʔυࣗಈੜ ۩ମྫ खॱ ɹੜ͞ΕͨྻڍܕͰ ɹϩάૹ৴Օॴʹ࣮ // ϨγϐݕࡧॲཧͷϦΫΤετޙ logger.post( RecipeSearch.search( keyword:
keyword, // “ಲ" order: order // .latest ) ) -
υΩϡϝϯτϕʔεͷܕ҆શͳϩά࣮ίʔυࣗಈੜ Կ͕خ͍͠ͷ͔ʁᶃ wυΩϡϝϯτ͕ৗʹඋ ‣ Ұ͔ॴʹͯ͢·ͱ·͍ͬͯΔʢ୳͍͢͠ʣ ‣ ΞϓϦͱಉ͡ϨϙδτϦͰ(JUόʔδϣϯཧ w ΞϓϦόʔδϣϯ͝ͱͷࠩҟࣗಈه w
ϩάఆٛͷഎܠ1VMM3FRVFTUΛͬͯ֬ೝͰ͖Δ ࣮ऀੳऀ͏Ε͍͠& ͜ͷϩάWͰ ഇࢭͯ͠·͢Ͷ -
υΩϡϝϯτϕʔεͷܕ҆શͳϩά࣮ίʔυࣗಈੜ Կ͕خ͍͠ͷ͔ʁᶃ wυΩϡϝϯτ͕ৗʹඋ ‣ Ұ͔ॴʹͯ͢·ͱ·͍ͬͯΔʢ୳͍͢͠ʣ ‣ ΞϓϦͱಉ͡ϨϙδτϦͰ(JUόʔδϣϯཧ w ΞϓϦόʔδϣϯ͝ͱͷࠩҟࣗಈه w
ϩάఆٛͷഎܠ1VMM3FRVFTUΛͬͯ֬ೝͰ͖Δ ࣮ऀੳऀ͏Ε͍͠& ͜ͷϩάWͰ ഇࢭͯ͠·͢Ͷ ͳΔ΄Ͳʜʜ ͜͏͍͏ܦҢͰՃ͔ -
υΩϡϝϯτϕʔεͷܕ҆શͳϩά࣮ίʔυࣗಈੜ Կ͕خ͍͠ͷ͔ʁᶄ wܕ҆શ ‣ ҙਤ͠ͳ͍͕ೖΓࠐ·ͳ͍ ‣ *%&Ͱิ͞ΕΔͷշద wਓؒػցಡΈ͍͢ ‣ ଟ͘ͷࣾһ͕.BSLEPXOʹ׳Ε͍ͯΔ
‣ υΩϡϝϯτͱ࣮ͷζϨΛ੩తղੳͰࣗಈݕग़ ͳͲ $*Ͱఆظ֬ೝ -
͏·͍͔͘ͳ͔ͬͨࣄྫ ྫɿϦϦʔεޙʹϩάͷ࣮࿙Εʹؾͮ͘ ͋Εʁ͜ͷϩά ૹΒΕͯͳ͍ʁ ΦΝʔʂ࣮࿙Ε ͯ·ͨ͠ʜʜ ʮΧʔτʹՃʯϘλϯͷϩάɺ "ը໘Ͱ࣮ࡁΈ͕ͩͬͨɺ #ը໘ʹΕ͍ͯͨʜʜ ઃܭ
࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε ࢪࡦ Φʔφʔ ࣮ऀ -
͏·͍͔͘ͳ͔ͬͨࣄྫ ྫɿϦϦʔεޙʹϩάͷ࣮࿙Εʹؾͮ͘ ͋Εʁ͜ͷϩά ૹΒΕͯͳ͍ʁ ΦΝʔʂ࣮࿙Ε ͯ·ͨ͠ʜʜ ʮΧʔτʹՃʯϘλϯͷϩάɺ "ը໘Ͱ࣮ࡁΈ͕ͩͬͨɺ #ը໘ʹΕ͍ͯͨʜʜ ઃܭ
࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε ੩తղੳʹΑΔ࣮࿙Εݕग़શͰͳ͍ ࢪࡦ Φʔφʔ ࣮ऀ -
ະղܾ՝ ΈͰΧόʔͰ͖͍ͯͨͷҰ෦ ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε ݕূతͷ ཧɾѲ ϩάఆٛ
ϩά࣮ 0,✅ #ة͏͍ ಈ࡞֬ೝ ͜ͷύλʔϯͰ ɹߟྀ࿙Εͯͨͳʜʜ -
‣ ϩάૹ৴Λཏతʹ֬ೝ͍͢͠ νΣοΫϦετ͕ࣗಈͰຒ·ΔΞϓϦϩά֬ೝπʔϧ ֓ཁ ᶄϢʔβʔͱಉ༷ʹΞϓϦΛૢ࡞ ˞։ൃ൛ϏϧυͷΈͰ༗ޮͳػೳ ᶃϩάఆٛΛνΣοΫϦετʹొ ✅ৄࡉදࣔ ✅ొλοϓ <>ղআλοϓ
ɹʜʜ ඞཁͳϩά ֘ϩά͕ૹΒΕΔͱ ࣗಈͰνΣοΫࡁΈʹ -
‣ ϩάૹ৴Λཏతʹ֬ೝ͍͢͠ νΣοΫϦετ͕ࣗಈͰຒ·ΔΞϓϦϩά֬ೝπʔϧ ֓ཁ ᶄϢʔβʔͱಉ༷ʹΞϓϦΛૢ࡞ ˞։ൃ൛ϏϧυͷΈͰ༗ޮͳػೳ ᶃϩάఆٛΛνΣοΫϦετʹొ ✅ৄࡉදࣔ ✅ొλοϓ <>ղআλοϓ
ɹʜʜ ඞཁͳϩά ֘ϩά͕ૹΒΕΔͱ ࣗಈͰνΣοΫࡁΈʹ ʜʜ -
‣ ϩάૹ৴Λཏతʹ֬ೝ͍͢͠ νΣοΫϦετ͕ࣗಈͰຒ·ΔΞϓϦϩά֬ೝπʔϧ ֓ཁ ᶄϢʔβʔͱಉ༷ʹΞϓϦΛૢ࡞ ˞։ൃ൛ϏϧυͷΈͰ༗ޮͳػೳ ᶃϩάఆٛΛνΣοΫϦετʹొ ʜʜ ✅ৄࡉදࣔ ✅ొλοϓ
<>ղআλοϓ ɹ ඞཁͳϩά Ұ௨Γͷಈ࡞֬ೝޙɺ ϩάૹ৴࿙Ε͕Θ͔Δ ະૹ৴༗Γ⾠ -
‣ ϩάૹ৴Λཏతʹ֬ೝ͍͢͠ νΣοΫϦετ͕ࣗಈͰຒ·ΔΞϓϦϩά֬ೝπʔϧ ֓ཁ ᶄϢʔβʔͱಉ༷ʹΞϓϦΛૢ࡞ ˞։ൃ൛ϏϧυͷΈͰ༗ޮͳػೳ ᶃϩάఆٛΛνΣοΫϦετʹొ ʜʜ ✅ৄࡉදࣔ ✅ొλοϓ
✅ղআλοϓ ɹ ඞཁͳϩά ඞཁͳϩά͕શͯૹ৴͞Εͨ ʹͳ͘ϦϦʔεͰ͖Δ ( શͯૹ৴֬ೝࡁΈ% -
ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε ݕূతͷ ཧɾѲ ϩάఆٛ ϩά࣮ #ة͏͍
ಈ࡞֬ೝ 0,✅ νΣοΫϦετ͕ࣗಈͰຒ·ΔΞϓϦϩά֬ೝπʔϧ ಋೖલ ͜ͷύλʔϯͰ ɹߟྀ࿙Εͯͨͳʜʜ -
ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε ݕূతͷ ཧɾѲ ϩάఆٛ ϩά࣮ 0,✅
ಈ࡞֬ೝ νΣοΫϦετ͕ࣗಈͰຒ·ΔΞϓϦϩά֬ೝπʔϧ ಋೖޙ -
ઃܭ ࣮ ޮՌଌఆ ҙࢥܾఆ ϦϦʔε ࣮ऀҎ֎ʹ ୲Ͱ͖ͯॿ͔Δ% ݕূతͷ ཧɾѲ ϩάఆٛ
ϩά࣮ 0,✅ ಈ࡞֬ೝ νΣοΫϦετ͕ࣗಈͰຒ·ΔΞϓϦϩά֬ೝπʔϧ ಋೖޙ -
ΞϓϦͷϩά࣮ͷؔ࿈ਤ ϩάఆٛ .BSLEPXO 04-PH 04-PH4UPSF ΞϓϦ ϩά֬ೝπʔϧ ϩάఆٛ 4XJGU ϩάૹ৴ϥΠϒϥϦ
PT-PHHFS ϩΨʔ 04ϩάʹग़ྗ ϩάαʔόʔૹ৴ ఆٛΛͬͯૹ৴ .BSLEPXO ύʔαʔ EBJGVLV τϥϯεύΠϥ ఆٛΛ ࢀর 04ϩάΛऔಘ தؒදݱΛ 4XJGU ίʔυԽ ʢ։ൃ൛ΞϓϦͷΈʣ -
ΞϓϦͷϩά࣮ͷؔ࿈ਤ ϩάఆٛ .BSLEPXO 04-PH 04-PH4UPSF ΞϓϦ ϩά֬ೝπʔϧ ϩάఆٛ 4XJGU ϩάૹ৴ϥΠϒϥϦ
PT-PHHFS ϩΨʔ 04ϩάʹग़ྗ ϩάαʔόʔૹ৴ ఆٛΛͬͯૹ৴ .BSLEPXO ύʔαʔ EBJGVLV τϥϯεύΠϥ ఆٛΛ ࢀর 04ϩάΛऔಘ தؒදݱΛ 4XJGU ίʔυԽ ʢ։ൃ൛ΞϓϦͷΈʣ -
ΞϓϦͷϩά࣮ͷؔ࿈ਤ ϩάఆٛ .BSLEPXO 04-PH 04-PH4UPSF ΞϓϦ ϩά֬ೝπʔϧ ϩάఆٛ 4XJGU ϩάૹ৴ϥΠϒϥϦ
PT-PHHFS ϩΨʔ 04ϩάʹग़ྗ ϩάαʔόʔૹ৴ ఆٛΛͬͯૹ৴ .BSLEPXO ύʔαʔ EBJGVLV τϥϯεύΠϥ ఆٛΛ ࢀর 04ϩάΛऔಘ தؒදݱΛ 4XJGU ίʔυԽ ʢ։ൃ൛ΞϓϦͷΈʣ -
ΞϓϦͷϩά࣮ͷؔ࿈ਤ ϩάఆٛ .BSLEPXO 04-PH 04-PH4UPSF ΞϓϦ ϩά֬ೝπʔϧ ϩάఆٛ 4XJGU ϩάૹ৴ϥΠϒϥϦ
PT-PHHFS ϩΨʔ 04ϩάʹग़ྗ ϩάαʔόʔૹ৴ ఆٛΛͬͯૹ৴ .BSLEPXO ύʔαʔ EBJGVLV τϥϯεύΠϥ ఆٛΛ ࢀর 04ϩάΛऔಘ தؒදݱΛ 4XJGU ίʔυԽ ʢ։ൃ൛ΞϓϦͷΈʣ -
ΞϓϦͷϩά࣮ͷؔ࿈ਤ ϩάఆٛ .BSLEPXO 04-PH 04-PH4UPSF ΞϓϦ ϩά֬ೝπʔϧ ϩάఆٛ 4XJGU ϩάૹ৴ϥΠϒϥϦ
PT-PHHFS ϩΨʔ 04ϩάʹग़ྗ ϩάαʔόʔૹ৴ ఆٛΛͬͯૹ৴ .BSLEPXO ύʔαʔ EBJGVLV τϥϯεύΠϥ ఆٛΛ ࢀর 04ϩάΛऔಘ தؒදݱΛ 4XJGU ίʔυԽ ʢ։ൃ൛ΞϓϦͷΈʣ -
͍͜͠) w04-PHGSBNFXPSLͷ04-PH4UPSFͳͲ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOPTMPH wPT'SBNFXPSLͷ-PHHFS04-PH IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOPTMPHHFS wPT'SBNFXPSLͷPT@MPH VOJpFEMPHHJOHTZTUFN IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOPTMPHHJOH wPT'SBNFXPSL
IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOPT J04ͷ-PHHJOHTZTUFN J04 J04 J04 J04 -
͍͜͠) w04-PHGSBNFXPSLͷ04-PH4UPSFͳͲ IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOPTMPH wPT'SBNFXPSLͷ-PHHFS04-PH IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOPTMPHHFS wPT'SBNFXPSLͷPT@MPH VOJpFEMPHHJOHTZTUFN IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOPTMPHHJOH wPT'SBNFXPSL
IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOPT J04ͷ-PHHJOHTZTUFN J04 J04 J04 J04 -
PT-PHHFS ֓ཁ J04 w ΞϓϦ͔Β౷߹ϩάγεςϜʹϩάΛॻ͖ࠐΊΔ w ඇৗʹޮతͰɺΞϓϦͷಈ࡞Ԇͳ͑͘Δ w $POTPMFBQQ9DPEFͷίϯιʔϧͰϩάΛ֬ೝͰ͖Δ w
ηϯγςΟϒͳใϚεΫͰ͖Δʢࢦఆͯ͠ެ։Ͱ͖Δʣ w IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOPTMPHHFS w IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED -
PT-PHHFS ؆୯ͳྫ import os // ϩάͷग़͕͔ࣗΔΑ͏ʹ subsystem ͱ category Λࢦఆ
let osLogger = Logger(subsystem: bundleID, category: "Activity") // ϩάΛॻ͖ࠐΉ osLogger.notice(“\(logDataString)”) J04 -
ΞϓϦͷϩά࣮ͷؔ࿈ਤ ϩάఆٛ .BSLEPXO 04-PH 04-PH4UPSF ΞϓϦ ϩά֬ೝπʔϧ ϩάఆٛ 4XJGU ϩάૹ৴ϥΠϒϥϦ
PT-PHHFS ϩΨʔ 04ϩάʹग़ྗ ϩάαʔόʔૹ৴ ఆٛΛͬͯૹ৴ .BSLEPXO ύʔαʔ EBJGVLV τϥϯεύΠϥ ఆٛΛ ࢀর 04ϩάΛऔಘ தؒදݱΛ 4XJGU ίʔυԽ ʢ։ൃ൛ΞϓϦͷΈʣ -
ΞϓϦͷϩά࣮ͷؔ࿈ਤ ϩάఆٛ .BSLEPXO 04-PH 04-PH4UPSF ΞϓϦ ϩά֬ೝπʔϧ ϩάఆٛ 4XJGU ϩάૹ৴ϥΠϒϥϦ
PT-PHHFS ϩΨʔ 04ϩάʹग़ྗ ϩάαʔόʔૹ৴ ఆٛΛͬͯૹ৴ .BSLEPXO ύʔαʔ EBJGVLV τϥϯεύΠϥ ఆٛΛ ࢀর 04ϩάΛऔಘ தؒදݱΛ 4XJGU ίʔυԽ ʢ։ൃ൛ΞϓϦͷΈʣ -
04-PH4UPSF ར༻ྫ J04 import OSLog …… let store = try
OSLogStore(scope: .currentProcessIdentifier) let predicate = NSPredicate(format: "(subsystem == %@)", Bundle.main.bundleIdentifier!) return try store.getEntries(matching: predicate) -
ΞϓϦͷϩά࣮ͷؔ࿈ਤ ϩάఆٛ .BSLEPXO 04-PH 04-PH4UPSF ΞϓϦ ϩά֬ೝπʔϧ ϩάఆٛ 4XJGU ϩάૹ৴ϥΠϒϥϦ
PT-PHHFS ϩΨʔ 04ϩάʹग़ྗ ϩάαʔόʔૹ৴ ఆٛΛͬͯૹ৴ .BSLEPXO ύʔαʔ EBJGVLV τϥϯεύΠϥ ఆٛΛ ࢀর 04ϩάΛऔಘ தؒදݱΛ 4XJGU ίʔυԽ ʢ։ൃ൛ΞϓϦͷΈʣ -
ΞϓϦϩά֬ೝπʔϧͷߏ 04-PH4UPSF ΞϓϦϩά֬ೝπʔϧ HFU&OUSJFT [OSLogEntry] [OSLogEntryLog] ߦಈϩά ఆٛ ߦಈϩάఆٛ .BSLEPXO
ϩά֬ೝπʔϧ༻ͷϞσϧ ߦಈϩάͷ+40/Λσίʔυ DPNQBDU.BQ [OSLogMessageComponent] ʹؚ·ΕΔ -
ΞϓϦͷϩά࣮ͷؔ࿈ਤ ϩάఆٛ .BSLEPXO 04-PH 04-PH4UPSF ΞϓϦ ϩά֬ೝπʔϧ ϩάఆٛ 4XJGU ϩάૹ৴ϥΠϒϥϦ
PT-PHHFS ϩΨʔ 04ϩάʹग़ྗ ϩάαʔόʔૹ৴ ఆٛΛͬͯૹ৴ .BSLEPXO ύʔαʔ EBJGVLV τϥϯεύΠϥ ఆٛΛ ࢀর 04ϩάΛऔಘ தؒදݱΛ 4XJGU ίʔυԽ ʢ։ൃ൛ΞϓϦͷΈʣ -
DPPLQBE@JPTED@BGUFS@QBSUZ w $BTF1BUIT w .BJOUBJOBCJMJUZ*OEFYͱ ίʔυͷอकੑվળ w %PD$%PDVNFOUBUJPO "SDIJWF w
0QFO"1* ͷτϐοΫͰ͠·͢ʂ IUUQTDPPLQBEDPOOQBTTDPNFWFOU