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

バックポートして学ぶ新APIの仕組み

Yutaro Muta
September 11, 2022

 バックポートして学ぶ新APIの仕組み

Yutaro Muta

September 11, 2022
Tweet

More Decks by Yutaro Muta

Other Decks in Programming

Transcript

  1. バックポートして学ぶ
    新APIの仕組み
    Yutaro Muta / @yutailang0119
    2022/09/11 iOSDC JAPAN 2022

    View Slide

  2. Who am I!?
    ● Yutaro Muta
    ○ @yutailang0119
    ● Hatena Co., Ltd.
    ○ @Kyoto

    View Slide

  3. 前置き
    SBPAsyncImageの紹介

    View Slide

  4. yutailang0119/SBPAsyncImage
    ● Backport of SwiftUI.AsyncImage to iOS
    14, macOS 11, tvOS 14 and watchOS 7
    and earlier.
    ● SwiftUI.AsyncImageは2021年OSから
    ○ iOS 15.0+ iPadOS 15.0+ macOS 12.0+ Mac Catalyst 15.0+ tvOS 15.0+ watchOS 8.0+

    View Slide

  5. SwiftUI.AsyncImage
    struct AsyncImage where Content : View
    AsyncImage(url: URL(string: “https://example.com/icon.png"))
    .frame(width: 200, height: 200)
    BackportAsyncImage
    struct BackportAsyncImage where Content : View
    BackportAsyncImage(url: URL(string: “https://example.com/icon.png"))
    .frame(width: 200, height: 200)

    View Slide

  6. Goal
    ● バックポートにおける戦略の共有
    ○ SBPAsyncImageの例
    ● バックポートのおもしろさを発見

    View Slide

  7. Agenda
    ● なぜバックポートするのか
    ● 新APIの調べ方
    ● バックポート実装のTips
    ● メンテナンス上の難点
    ● まとめ

    View Slide

  8. Agenda
    ● なぜバックポートするのか
    ● 新APIの調べ方
    ● バックポート実装のTips
    ● メンテナンス上の難点
    ● まとめ

    View Slide

  9. なぜバックポートするのか

    View Slide

  10. なぜバックポートするのか
    ● WWDCのアップデートは一部を除き、最新
    OSにのみ提供される
    ● アプリによっては、使えるのは数年後

    View Slide

  11. なぜバックポートするのか
    ● 例外もある
    ● Swift Concurrency関連のAPIの一部は、 
    公式でバックポートされている
    ■ Xcode 14.0で、URLSessionのバックポートが増えた
    iOS 13.0+ iPadOS 13.0+ macOS 10.15+ Mac Catalyst 16.0+ Beta tvOS 13.0+ watchOS 6.0+
    func data(from url: URL) async throws -> (Data, URLResponse)

    View Slide

  12. Agenda
    ● なぜバックポートするのか
    ● 新APIの調べ方
    ● バックポート実装のTips
    ● メンテナンス上の難点
    ● まとめ

    View Slide

  13. 新APIの調べ方

    View Slide

  14. 新APIの調べ方
    ● Apple Developer Document
    ○ API diff
    ○ Technologies
    ● Videos
    ● Xcode
    ○ Jump to Definition ⌃⌘

    View Slide

  15. Apple Developer Document

    View Slide

  16. ● ?changes=latest_beta
    ● ?changes=latest_minor
    ● ?changes=latest_major
    API diff

    View Slide

  17. https://developer.apple.com/documentation/technologies?changes=latest_minor

    View Slide

  18. 新APIの調べ方
    ● Apple Developer Document
    ○ API diff
    ○ Technologies
    ● Videos
    ● Xcode
    ○ Jump to Definition ⌃⌘

    View Slide

  19. 新APIの調べ方
    ● Apple Developer Document
    ○ API diff
    ○ Technologies
    ● Videos
    ● Xcode
    ○ Jump to Definition ⌃⌘
    根気強く見ていく

    View Slide

  20. https://yutailang0119.hatenablog.com/entry/2022/02/24/163000
    宣伝
    【2022年】Xcode/Apple Platform/Swiftアップデートの歩き方

    View Slide

  21. Agenda
    ● なぜバックポートするのか
    ● 新APIの調べ方
    ● バックポート実装のTips
    ● メンテナンス上の難点
    ● まとめ

    View Slide

  22. バックポート実装のTips

    View Slide

  23. バックポート実装のTips
    ● サポートOSの範囲
    ● ライブラリ、モジュールの名付け
    ● Beta期間の取り扱い

    View Slide

  24. サポートOSの範囲

    View Slide

  25. サポートOSの範囲
    ● 2022年における基本はiOS 13+
    ○ Module Stabilityが達成されたSwift 5.1が同梱され
    たのがiOS 13
    ■ Swift ConcurrencyのバックポートもiOS 13+
    ○ SwiftUIのAvailabilityがiOS 13+
    ● サポート範囲、動作の割り切りも必要
    ○ Appleも苦戦する領域

    View Slide

  26. ライブラリ、
    モジュールの名付け

    View Slide

  27. ライブラリ、モジュールの名付け
    ● 名前衝突を避ける工夫
    ● SE-0339
    ○ Module Aliasing For Disambiguation

    View Slide

  28. 名前衝突を避ける工夫

    View Slide

  29. 名前衝突を避ける工夫
    ● 伝統的なPrefix回避
    ○ e.g.
    ■ IBP = iOS Backport
    ■ SBP = Swift Backport
    ● 冗長にバックポートとわかる名前を付ける
    ○ e.g. BackportAsyncImage

    View Slide

  30. SE-0339
    Module Aliasing For
    Disambiguation

    View Slide

  31. SE-0339
    Module Aliasing For Disambiguation
    ● SwiftPM 5.7+
    ○ Xcode 14.0+
    ● moduleAliasesキーワードで、パッケージの
    外からモジュール名を変更可能
    ● 利用側で指定が必要

    View Slide

  32. SE-0339
    Module Aliasing For Disambiguation
    // swift-tools-version: 5.7
    targets: [
    .executableTarget(
    name: "App",
    dependencies: [
    .product(name: "Game",
    package: "swift-game",
    moduleAliases: ["Utils": "GameUtils"]),
    .product(name: "Utils",
    package: "swift-draw"),
    ])
    ]

    View Slide

  33. Beta期間の取り扱い

    View Slide

  34. Beta期間の取り扱い
    ● Beta期間はインターフェース、挙動ともに破
    壊的変更が何度も起こるものとして注視
    ○ API diff ?changes=latest_beta
    ● 現行Stable、過去のXcodeサポートの有無

    View Slide

  35. Agenda
    ● なぜバックポートするのか
    ● 新APIの調べ方
    ● バックポート実装のTips
    ● メンテナンス上の難点
    ● まとめ

    View Slide

  36. メンテナンス上の難点

    View Slide

  37. メンテナンス上の難点
    ● 小さい機能を支える広い領域
    ● OS毎の挙動差
    ● Originとの優先度

    View Slide

  38. 小さい機能を
    支える広い領域

    View Slide

  39. 小さい機能を支える広い領域
    ● e.g. AsyncImage
    ○ SwiftUI
    ■ @StateObject, @ObservedObject, @Published, ViewBuilder
    ○ UIKit
    ■ UIImage
    ○ AppKit
    ■ NSImage
    ○ Foundation
    ■ URLSession

    View Slide

  40. OS毎の挙動差

    View Slide

  41. OS毎の挙動差
    ● OSバージョン毎に利用できる手段の差異
    ○ iOS 14+ @StateObject
    ○ iOS 13+ @ObservedObject
    ● プラットフォーム毎にフレームワークの差異
    ○ UIKit vs AppKit
    ■ e.g. UIImage vs NSImage

    View Slide

  42. Originとの優先度

    View Slide

  43. ● 利用側にOriginとバックポート実装のどちら
    を優先させるか、考える必要あり
    Originとの優先度
    Beta期間 Stable~その後
    Origin @available調整
    Backport 現行Xcodeのサポート

    View Slide

  44. SBPAsyncImageの戦略

    View Slide

  45. ● AsyncImageの利用可能なOSが浸透すれば、
    バックポートは役目を終えていく
    ○ iOS 15+の世界
    ○ 段階的に移行させたい
    ● Beta期間からAsyncImageを感じたい
    SBPAsyncImageの戦略

    View Slide

  46. ● Originを優先し、移行を促す戦略
    ○ @availableを駆使
    ■ deprecated, obsoleted, unavailable
    ● バックポート実装は独立させる戦略
    ○ 利用側は別物として扱う
    SBPAsyncImageの戦略

    View Slide

  47. ● typealiasでOriginに合わせ、意識せずに利用
    させる


    ■ @available
    ■ モジュールを指名することで、使い分け可能
    @available(iOS, deprecated: 15.0, renamed: "SwiftUI.AsyncImage")
    public typealias AsyncImage = BackportAsyncImage
    SBPAsyncImageの戦略

    View Slide

  48. Agenda
    ● なぜバックポートするのか
    ● 新APIの調べ方
    ● バックポート実装のTips
    ● メンテナンス上の難点
    ● まとめ

    View Slide

  49. まとめ

    View Slide

  50. まとめ
    ● バックポートには、機能開発と違う難易度、
    視点、マインドがある
    ● 2022年におけるサポートOSは最低iOS 13+
    ● バックポートはOriginの実装、挙動を熟知で
    きるのでおすすめ

    View Slide

  51. References
    ● https://github.com/yutailang0119/SBPAsyncImage
    ● https://developer.apple.com/documentation/swiftui/asyncimage
    ● https://developer.apple.com/documentation/foundation/urlsession/3919873-data
    ● https://developer.apple.com/documentation
    ● https://developer.apple.com/documentation/technologies?changes=latest_minor
    ● https://yutailang0119.hatenablog.com/entry/2022/02/24/163000
    ● https://github.com/apple/swift-evolution/blob/main/proposals/0339-module-aliasing-f
    or-disambiguation.md
    ● https://developer.apple.com/documentation/packagedescription/target/dependency/pr
    oduct(name:package:modulealiases:)
    ● https://docs.swift.org/swift-book/ReferenceManual/Attributes.html

    View Slide

  52. Enjoy iOSDC,
    Thanks!!!
    ● @yutailang0119
    ● yutailang0119

    View Slide

  53. hatena.co.jp/recruit

    View Slide