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

  2. Who am I!? • Yutaro Muta ◦ @yutailang0119 • Hatena

    Co., Ltd. ◦ @Kyoto
  3. 前置き SBPAsyncImageの紹介

  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+
  5. SwiftUI.AsyncImage struct AsyncImage<Content> where Content : View AsyncImage(url: URL(string: “https://example.com/icon.png"))

    .frame(width: 200, height: 200) BackportAsyncImage struct BackportAsyncImage<Content> where Content : View BackportAsyncImage(url: URL(string: “https://example.com/icon.png")) .frame(width: 200, height: 200)
  6. Goal • バックポートにおける戦略の共有 ◦ SBPAsyncImageの例 • バックポートのおもしろさを発見

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

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

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

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

  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)
  12. Agenda • なぜバックポートするのか • 新APIの調べ方 • バックポート実装のTips • メンテナンス上の難点 •

    まとめ
  13. 新APIの調べ方

  14. 新APIの調べ方 • Apple Developer Document ◦ API diff ◦ Technologies

    • Videos • Xcode ◦ Jump to Definition ⌃⌘
  15. Apple Developer Document

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

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

  18. 新APIの調べ方 • Apple Developer Document ◦ API diff ◦ Technologies

    • Videos • Xcode ◦ Jump to Definition ⌃⌘
  19. 新APIの調べ方 • Apple Developer Document ◦ API diff ◦ Technologies

    • Videos • Xcode ◦ Jump to Definition ⌃⌘ 根気強く見ていく
  20. https://yutailang0119.hatenablog.com/entry/2022/02/24/163000 宣伝 【2022年】Xcode/Apple Platform/Swiftアップデートの歩き方

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

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

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

  24. サポートOSの範囲

  25. サポートOSの範囲 • 2022年における基本はiOS 13+ ◦ Module Stabilityが達成されたSwift 5.1が同梱され たのがiOS 13

    ▪ Swift ConcurrencyのバックポートもiOS 13+ ◦ SwiftUIのAvailabilityがiOS 13+ • サポート範囲、動作の割り切りも必要 ◦ Appleも苦戦する領域
  26. ライブラリ、 モジュールの名付け

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

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

  29. 名前衝突を避ける工夫 • 伝統的なPrefix回避 ◦ e.g. ▪ IBP = iOS Backport

    ▪ SBP = Swift Backport • 冗長にバックポートとわかる名前を付ける ◦ e.g. BackportAsyncImage
  30. SE-0339 Module Aliasing For Disambiguation

  31. SE-0339 Module Aliasing For Disambiguation • SwiftPM 5.7+ ◦ Xcode

    14.0+ • moduleAliasesキーワードで、パッケージの 外からモジュール名を変更可能 • 利用側で指定が必要
  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"), ]) ]
  33. Beta期間の取り扱い

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

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

    まとめ
  36. メンテナンス上の難点

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

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

  39. 小さい機能を支える広い領域 • e.g. AsyncImage ◦ SwiftUI ▪ @StateObject, @ObservedObject, @Published,

    ViewBuilder ◦ UIKit ▪ UIImage ◦ AppKit ▪ NSImage ◦ Foundation ▪ URLSession
  40. OS毎の挙動差

  41. OS毎の挙動差 • OSバージョン毎に利用できる手段の差異 ◦ iOS 14+ @StateObject ◦ iOS 13+

    @ObservedObject • プラットフォーム毎にフレームワークの差異 ◦ UIKit vs AppKit ▪ e.g. UIImage vs NSImage
  42. Originとの優先度

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

  44. SBPAsyncImageの戦略

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

    SBPAsyncImageの戦略
  46. • Originを優先し、移行を促す戦略 ◦ @availableを駆使 ▪ deprecated, obsoleted, unavailable • バックポート実装は独立させる戦略

    ◦ 利用側は別物として扱う SBPAsyncImageの戦略
  47. • typealiasでOriginに合わせ、意識せずに利用 させる ▪ ▪ ▪ @available ▪ モジュールを指名することで、使い分け可能 @available(iOS,

    deprecated: 15.0, renamed: "SwiftUI.AsyncImage") public typealias AsyncImage = BackportAsyncImage SBPAsyncImageの戦略
  48. Agenda • なぜバックポートするのか • 新APIの調べ方 • バックポート実装のTips • メンテナンス上の難点 •

    まとめ
  49. まとめ

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

  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
  52. Enjoy iOSDC, Thanks!!! • @yutailang0119 • yutailang0119

  53. hatena.co.jp/recruit