Upgrade to Pro — share decks privately, control downloads, hide ads and more …

大規模プロジェクトにおける段階的な技術刷新

CyberAgent
March 05, 2025
8

 大規模プロジェクトにおける段階的な技術刷新

ABEMAではKotlin Multiplatformの本格採用を加速させつつ、ネイティブ実装部分をSwiftUIやSwift Concurrencyといったモダンな技術スタックに移行するため、プロジェクトを新たに作成して画面単位で移行する長期的なプロジェクトが進んでいます。 この発表では移行プロジェクトの概要と、主にSwift 6についての対応方針やXcode Playgroundを活用したキャッチアップの取り組みについてご紹介します。

https://cyberagent.connpass.com/event/342952/

CyberAgent

March 05, 2025
Tweet

More Decks by CyberAgent

Transcript

  1. ࣗݾ঺հ • ҆Ҫ ӯஉ / Akio Yasui • 2019೥ גࣜձࣾAbemaTV

    ৽ଔೖࣾ • SNS: @akkyie • iOS ΞϓϦͷج൫पΓΛ୲౰ • 2021೥͝Ζ͔ΒΞʔΩςΫνϟؔ࿈ͷऔΓ૊Έ
  2. എܠ Kotlin Multiplatformͷಋೖ • 2021೥͝Ζ͔ΒKotlin MultiplatformͷಋೖݕূΛ։࢝ → ຊ֨ಋೖΛܾఆ • 2025೥ݱࡏɺiOSଆΛؚΊͨ΄ͱΜͲͷϞόΠϧΤϯδχΞ͕

    Kotlin Multiplatformͷڞ௨࣮૷΋ؚΊͯ։ൃ͍ͯ͠Δ ABEMAϞόΠϧΞϓϦ։ൃͷDevOpsઓུ (2022) https://cadc.cyberagent.co.jp/2022/program/abema-mobile-app-devops/ AbemaTV, Inc. All Rights Reserved
 1 Multiplatform Engineering Roadmap for the Future (2021) https://developer.abema.io/2021/sessions/bvjpwJEoGP/
  3. എܠ Kotlin Multiplatformͷಋೖ CocoaPods RxSwift Unmaintained Third-party Libraries Storyboard ෛ࠴Խͨ͠

    ґଘ΍ઃܭɾ࣮૷Λ Ҿ͖ܧ͗ͭͭҠߦ͢Δͷ͸ ίετ͕ߴ͍ ผϓϩδΣΫτԽͯ͠ ஈ֊తʹҠߦ
  4. ҠߦϓϩδΣΫτͷਐΊํ ৽ͨͳϓϩδΣΫτߏ੒ KMP ڞ௨࣮૷ طଘ࣮૷ ґଘϥΠϒϥϦ (CocoaPods) ৽ϓϩδΣΫτ ґଘϥΠϒϥϦ (SwiftPM)

    abema-ios abema-native ৽ϓϩδΣΫτͰ͸ େ෦෼ΛKMPͰڞ௨Խ͢Δ લఏͷઃܭɾ࣮૷ʹدͤΔ SwiftPMɺConcurrencyͳͲ ৽نٕज़ελοΫͷಋೖ
  5. ҠߦϓϩδΣΫτͷਐΊํ ৽ͨͳϓϩδΣΫτߏ੒ KMP ڞ௨࣮૷ طଘ࣮૷ ґଘϥΠϒϥϦ (CocoaPods) ৽ϓϩδΣΫτ ґଘϥΠϒϥϦ (SwiftPM)

    abema-ios abema-native ❌ ৽ϓϩδΣΫτ͔Β طଘ࣮૷ʹ͸ ΞΫηεͰ͖ͳ͍ → چ࣮૷͕ ࢒Γଓ͚ΔͷΛ๷͙
  6. ҠߦϓϩδΣΫτͷਐΊํ ৽ͨͳϓϩδΣΫτߏ੒ KMP ڞ௨࣮૷ طଘ࣮૷ ґଘϥΠϒϥϦ (CocoaPods) ৽ϓϩδΣΫτ ґଘϥΠϒϥϦ (SwiftPM)

    abema-ios abema-native طଘ࣮૷͔Β SwiftPMͷґଘ΋࢖͑Δ → ੵۃతʹґଘ؅ཧΛ ҠߦͰ͖ΔΑ͏ʹ
  7. ҠߦϓϩδΣΫτͷਐΊํ ৽ͨͳϓϩδΣΫτߏ੒ abema-ios abema-native طଘ࣮૷ public class NewViewController: UIViewController {

    ... } public struct NewView: View { ... } طଘϓϩδΣΫτ͸ը໘୯ҐͰ ৽ϓϩδΣΫτͷ࣮૷Λར༻ → طଘͷϧʔςΟϯάʹ૊ΈࠐΈ΍͘͢
  8. ҠߦϓϩδΣΫτͷਐΊํ ৽ͨͳϓϩδΣΫτߏ੒ abema-ios abema-native طଘ࣮૷ public class NewViewController: UIViewController {

    ... } public struct NewView: View { ... } ը໘දࣔ࣌ʹ Feature Flag ʹΑͬͯ੾Γସ͑Δ ஈ֊తʹద༻ൣғΛ޿͛Δɾෆ۩߹͕͋Ε͹طଘ࣮૷ʹ੾Γ໭͠ ʢετϥϯάϥʔϑΟάɾύλʔϯͷ࣮ફʣ
  9. ৽ϓϩδΣΫτͷٕज़ελοΫ • Swift Package Manager • طଘͷCocoaPods͔Βஈ֊తʹґଘΛҠߦத • ΞϓϦ಺ͷϞδϡʔϧఆٛʹ͸࢖༻͍ͯ͠ͳ͍ʢޙड़ʣ •

    SwiftUI • طଘͱͷܨ͗ࠐΈ΋౿·͑ͯɺϧʔςΟϯά͸UIKitϕʔε ʢUIViewControllerϕʔεʣͰߦ͏ • ֤ը໘୯ҐͰͷUI࣮૷΍ঢ়ଶ؅ཧ͸SwiftUIϕʔε • SwiftUIಋೖʹ͋ͨͬͯͷ޻෉͸ኍ઒͞Μͷηογϣϯʹͯ • Concurrency • Strict Checking΋CompleteͰӡ༻தʢޙड़ʣ
  10. ৽ϓϩδΣΫτͷٕज़ελοΫ Swift Package Manager • αʔυύʔςΟʔϥΠϒϥϦ΁ͷґଘͳͲΛCocoaPods͔ΒҠߦத • ΞϓϦ಺ͷϞδϡʔϧఆٛʹ΋࢖༻͍ͯͨ͠ → طଘͱಉ͘͡XcodeGenʹΑΔఆٛʹ໭ͨ͠

    • Kotlin Multiplatformͱͷ૬ੑ໰୊ʢݕূ౰࣌ʣ • KMPଆ΋౎౓Ϗϧυ͍͕ͨ͠ɺSwiftPMͰ͸੍໿͕ଟ͍ ʢBuild ToolͰ͸ϑϨʔϜϫʔΫ͸ੜ੒ɾࢀরͰ͖ͳ͍ɾ Gradleͷ࣮ߦʹඞཁͳωοτϫʔΫΞΫηεͳͲΛڐՄͰ͖ͳ͍ʣ • XcodeଆͷPre-build ActionͰXCFrameworkΛੜ੒ͯ͠ࢀর͢Δ͔͠ͳ͍ → Ϗϧυ͕ෆ҆ఆʹͳΔ໰୊͕͋ͬͨ • طଘϓϩδΣΫτଆʹ΋໰୊͕೾ٴͨ͠ • Debug/ReleaseͰґଘΛ੾Γସ͑ΒΕͳ͍ʢະ࣮૷ʣ
  11. ҠߦϓϩδΣΫτͷਐΊํ Concurrency • طଘϓϩδΣΫτʹ͓͚ΔରԠํ਑ • Swift 5ϞʔυͰӡ༻͠ɺConcurrency͸ੵۃతʹ͸ಋೖ͠ͳ͍ • ޿ൣʹར༻͍ͯ͠ΔRxSwiftͳͲͱซ༻͢ΔܗͰӡ༻͢Δͷ͸ ೉қ౓͕ߴ͍

    • → ಘΒΕΔԸܙʹରͯ͠ɺ݁ՌతʹෳࡶԽͨ͠Γෆ҆ఆͳ࣮૷ʹͳΔ ϦεΫ͕େ͖͍ • طଘϓϩδΣΫτ಺ͰͷҠߦΑΓ΋ɺ৽ϓϩδΣΫτ΁ͷҠߦΛ ༏ઌ͢Δ
  12. ҠߦϓϩδΣΫτͷਐΊํ Concurrency • ৽ϓϩδΣΫτʹ͓͚ΔରԠํ਑ • Swift 6Ϟʔυʹ͸Ͱ͖͍ͯͳ͍ʢҰ౓༗ޮԽͨ͠ޙʹແޮԽʣ • KMP͕ੜ੒ͨ͠Objective-CϑϨʔϜϫʔΫʹ౉ͨ͠Ϋϩʔδϟ͕ ݺͼग़͞Εͨͱ͖ɺSwiftϥϯλΠϜ͕Ϋϥογϡ͢Δ৔߹͕͋Δ

    • ࢀߟ: https://aplus.rs/2024/objective-c-callback-crashes-swift6/ • → Swift 5Ϟʔυʹ໭ͭͭ͠ɺSwift 6Ͱ ༗ޮʹͳΔUpcoming FeaturesΛ શͯΦϯʹͯ͠ӡ༻த ʢStrict Checking: CompleteΛؚΊͯʣ • KotlinͷSwift exportʹظ଴ʁ
  13. ৽ϓϩδΣΫτͷٕज़ελοΫ Concurrency ରԠํ਑ • ४ڌͰ͖Δσʔλܕ͸ Sendable ʹ४ڌͤ͞Δ • UIؔ࿈ͷܕ΍ॲཧ͸ @MainActor

    Λ෇༩͢Δ • UIͷঢ়ଶ؅ཧͳͲΛεϨουηʔϑʹ࣮૷͢ΔϝϦοτΑΓ΋ ࣮૷ෛ୲ͷܰݮΛʢݱঢ়Ͱ͸ʣ༏ઌ͢Δ • Swift 6 ͕ಋೖ͞Ε͍ͯͳ͍֎෦ϥΠϒϥϦΛ࢖͏ࡍͷରԠखஈ • MainActor ͷΈ͔ΒΞΫηε͢Δ • Sendable ʹ४ڌͤ͞Δ • Sendable ͳܕͰϥοϓ͢Δ • nonisolated(unsafe) let ม਺Λఆٛ͢Δ • ʢ࠷ऴखஈͱͯ͠ʣ @preconcurrency import Λ࢖͏
  14. ৽ϓϩδΣΫτͷٕज़ελοΫ Concurrency ӡ༻্ͷ޻෉ • TaskBag ܕͷಋೖ • RxSwiftͷ DisposeBag ͱಉ༷ͷ

    ࢖͍উखͰ Task Λ؅ཧ • TaskBag Ͱ͸ @_implicitSelfCapture ଐੑΛ Ϋϩʔδϟʹ෇༩͠ͳ͍ • deinit ىҼͰΩϟϯηϧ͍ͨ͠ ॲཧ͕ self ͷ҉໧తͳΩϟϓνϟ ʹΑͬͯΩϟϯηϧ͞Εͳ͘ͳΔ ࣄ৅Λ๷͙
  15. ࠓޙͷऔΓ૊Έ • ҠߦϓϩδΣΫτͷਐߦ • ֤ը໘ͷ࣮૷΍ج൫࣮૷ɺґଘ؅ཧͷҠߦΛਐΊΔ • ϞϊϦϙδτϦԽ • ։ൃޮ཰Λߋʹ޲্ͤ͞ΔͨΊɺطଘϓϩδΣΫτ΋KMP࣮૷΍ ৽ϓϩδΣΫτͱಉ͡ϦϙδτϦʹҠ؅͢Δ

    • ௕ظతʹ͸Android΍tvOSͷϓϩδΣΫτ౷߹΋ࢹ໺ • ӡ༻ϙϦγʔɾΩϟονΞοϓࢿྉͷॆ࣮ • ConcurrencyͳͲ৽͍ٕ͠ज़ελοΫͷӡ༻࣮੷ΛੵΈͭͭɺ ஌ݟΛࢿྉԽ͍ͯ͘͠ • Ώ͘Ώ͘͸ࣾ֎ൃ৴΋…ʁ