iOSDC 2017 in Tokyo, September 16-17, 2017 https://iosdc.jp/2017/node/1438
US ൛ Mercari Λ·Δ͝ͱ1͔Β࡞Γͨ͠iOSDC Japan 2017Naoki Ishikawa @jarinosuke
View Slide
ࣗݾհ• ੴथ (@jarinosuke)• Mercari, Inc (joined at 2016/05)•iOS Engineer
աڈͷεϥΠυ• Drink Meetup with Mercari iOS(20166݄)• https://speakerdeck.com/jarinosuke/drink-meetup-with-mercari-number-36• Mercari Day 2017(20171݄)• https://speakerdeck.com/jarinosuke/mercari-day-2017
Agenda1. ࡞Γͨ͠എܠɺ͘͠ੵΈॏͶΒΕͨྺ࢙2. Ͳ͏ͬͯ࡞Γͨ͠ͷ͔ʢώτɺ࣌ؒɺํ๏ʣ3. ࡞Γͯ͠ղܾͨ͠ίτ
1.࡞Γͨ͠എܠɺ͘͠ੵΈॏͶΒΕͨྺ࢙
mercari-ios ͷྺ࢙!" 2016/11master
mercari-ios ͷྺ࢙!" 2016/11ࠒmasterjp/master
ιʔείʔυׂ• ϚϧνιʔεϚϧνόΠφϦ• ୯Ұ repos Ͱ branch ͰϦʔδϣϯຖʹׂ
mercari-ios ͷྺ࢙!" 2016/11ࠒmasterjp/master2017/4த०3,4ϲ݄
ιʔείʔυׂͨ͠ޙͷ3,4ϲ݄• ϋϯόʔΨʔϝχϡʔ->λϒԽ• ϖʔδͷϦχϡʔΞϧ• ϓϥΠϕʔτνϟοτػೳ• ͳͲͳͲ…• ͍αΠΫϧͰͨ͘͞Μͷ৽ػೳΛϦϦʔεͰ͖ͨ
ґવͱͯ͠Δ՝• ϦʔδϣϯذɺABςετͷංେԽ• Objective-Cͱܕ• ΞʔΩςΫνϟ(MVC, MVVM)͕ࠞࡏमਖ਼ʹରͯ͠ͷίετ͕ͱͯߴ͘ͳ͖͍ͬͯͯͨ
ϦʔδϣϯذɺABςετͷංେԽ• if (isUS) {} else {}• if (AB_improve_xxx) {} else {}• if (isUS) { if (AB) {} else {} } else { if (AB) {} else {} } * ͋͘·ͰྫͰ࣮͢ίετ↗ QAίετ↗
Objective-Cͱܕ• class A { init(with string: String) }• NSDictionary *data;• [[A alloc] initWithString:data[@“id”]];• ಈతܕ͚ͱ੩తܕ͚͕ࠞࡏ͠ɺ༧ظͤ͵Ϋϥογϡ
ΞʔΩςΫνϟ(MVC, MVVM)͕ࠞࡏ• ϝϧΧϦ iOS 2013ʹϦϦʔε(iOS7͕ϦϦʔε͞Εͨࠒ)• ग़ը໘VC Created by Shinichiro Oba on 2013/04/20 • ObjC/Swift, MVC/MVVM ͷڞଘʢࠞࡏʣ
mercari-ios ͷྺ࢙!" 2016/11ࠒmasterjp/master2017/4த०
⇧ + ⌘ + N
⇧ + ⌘ + NCreate New Project
2.Ͳ͏ͬͯ࡞Γ͔ͨ͠ʢώτɺ࣌ؒɺํ๏ʣ
νʔϜߏ• kitasuke• chuganzy• yoichi• jarinosuke
νʔϜߏ• kitasuke Introducing protobuf in Swift• chuganzy ϝϧΧϦͰ࣮ࢪͨ͠աڈ࠷େنͷABςετʮυϩϫʔvs Լλϒʯͷཪ• yoichi ϞόΠϧΞϓϦͰࠔΒͳ͍ΤϥʔϋϯυϦϯάͱϩΪϯάͷϕετϓϥΫςΟε• jarinosuke US ൛ Mercari Λ·Δ͝ͱ1͔Β࡞Γͨ͠
࣮ػೳ• Tab, Home, Login/Signup, Network, Overall architecture• Checkout, Search, WebView• DI, Item Detail, ReactNative• Listing, Local DB, Migration from current appΊͪΌͪ͘Ό͋Δ
࡞ۀ୲• Tab, Home, Login/Signup, Network, Overall architecture• Checkout, Search, WebView• DI, Item Detail, ReactNative• Listing, Local DB, Migration from current app
։ൃεέδϡʔϧ• 4݄த०։ൃ։࢝• 6݄ϦϦʔεඪ• ࣮࣭2ϲ݄
࡞ۀλΠϜϥΠϯ4݄ 5݄ 6݄Checkout WebView SearchTab, Home, Login/Signup, Network, Overall architectureDI, Item Detail ReactNativeLocalDB Listing Migration
༏ઌͨ͠ίτ• ͓٬༷͕ϦχϡʔΞϧΛҙࣝͤͣ͏͜ͱ͕Ͱ͖Δ• ΞʔΩςΫνϟΛ౷Ұ͢ΔɺςελϒϧͳߏΛҡ࣋͢Δ• ϦϦʔε͓ͯ͠٬༷ʹ৽͍͠ΞϓϦΛಧ͚Δ
༏ઌ͠ͳ͔ͬͨίτ• ॆͳςετίʔυ• iPad ରԠ• طଘΞϓϦͷ༷ʢθϩ͔Βߟ͑Δʣ
before after
3.࡞Γͯ͠ղܾͨ͠ίτ
طଘʹ༷͋ͬͨʑͳϢʔεέʔεΛআ• Ϧʔδϣϯ("/!)ʹΑΔίʔυذ • 20ݸऑͷABςετʹΑΔίʔυذ • ΞϓϦέʔγϣϯϩδοΫͷΈʹूதͰ͖ΔΑ͏ʹͳͬͨ
Swift/protobufͰܕ҆શbeforeafterObjective-C Free
Swift/protobufͰܕ҆શ• protocol buffer• API Request/Response Ͱѻ͏ Model ͱͦͷϓϩύςΟͷܕ͕อূ͞Εͨ• ৄ͘͠ kitasuke ͞Μͷ͜ͷهࣄ• kitasuke Introducing protobuf in Swift
BitriseʹҠߦ͠ϝϯςφϯείετݮ• ࠓ·Ͱࣗલͷ Jenkins on Mac• සൟʹωοτϫʔΫʹΞΫηεͰ͖ͣʹམͪΔ• ֎෦IP͔ΒΞΫηεͰ͖ͳ͍• Xcode ͷόʔδϣϯΞοϓ
Swinject ʹΑΔ DI Ͱ Testable ͳߏʹ• ΞϓϦશମͷΞʔΩςΫνϟ DI Λҙࣝͨ͜͠ͱʹΑΓ౷Ұ͞Εͨ• Author ͷ yoichi ͞ΜࣗΒಋೖͯ͘͠Εͨ • ViewModel ʹରͯ͠ Service Λ Injectable ͳߏʹͨ͠
Swinject ʹΑΔ DI Ͱ Testable ͳߏʹViewModelstruct ViewModel {let service: Servicetypealias Dependency = Serviceinit(dependency: Dependency) {service = dependency}}֎෦ʹґଘ͍ͯ͠Δ Service protocolʹΓग़͠ɺMock Ͱ͖ΔΑ͏ʹઃܭ
Swinject ʹΑΔ DI Ͱ Testable ͳߏʹMercari Tech Conf 2017 US൛Mercari iOSΞϓϦͷΞʔΩςΫνϟͱDependency Injection
͓ΘΓʹ
ืूhttps://open.talentio.com/1/c/mercari/requisitions/detail/4256