Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

前置き SBPAsyncImageの紹介

Slide 4

Slide 4 text

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+

Slide 5

Slide 5 text

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)

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

なぜバックポートするのか ● 例外もある ● 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)

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

新APIの調べ方

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Apple Developer Document

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

バックポート実装のTips

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

サポートOSの範囲

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

名前衝突を避ける工夫

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

SE-0339 Module Aliasing For Disambiguation

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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"), ]) ]

Slide 33

Slide 33 text

Beta期間の取り扱い

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

メンテナンス上の難点

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

OS毎の挙動差

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

Originとの優先度

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

SBPAsyncImageの戦略

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

● typealiasでOriginに合わせ、意識せずに利用 させる ■ ■ ■ @available ■ モジュールを指名することで、使い分け可能 @available(iOS, deprecated: 15.0, renamed: "SwiftUI.AsyncImage") public typealias AsyncImage = BackportAsyncImage SBPAsyncImageの戦略

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

まとめ

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

hatena.co.jp/recruit