wwdc2019 misc
Introducing Low-Latency HLS
資料だけざざっと。配信をより低レイテンシ、ユーザが操作すれば、すぐに再生位置が切り替わるとか、ライブ配信とか。 今は1セグメントが6秒。これをサブセグメントに細かくする。250ミリ秒くらい。リアクションは、600ミリ秒くらい。 大規模な配信で、HTTP(S)は、途中に入るネットワークルータでブロックされたりとかしないという意味で、偉大。
HTTPベースで配信するとして、しかし低レイテンシでは、HTTP/2を使う。 PUSHが使えるので、1つのセグメントを取得したら、サーバー側から次のセグメントのPUSHをしておけば、クライアントはそれを受けて、次のセグメントの取得へと、スムースに要求がつながる。
配信元がすることは、ソースのファイルのセグメントを細かくした配信データを用意する。CDNはHTTP/2にする。
Using Core Data With CloudKit
CoreDataとCloudKitとを統合した振る舞いを、少ないコード量で、実現できる。
CoreDataは、ローカルのデータ永続性、CloudKitは、クラウド側に保存される永続性を提供している。 これを1つの振る舞いとして扱うフレームワークを提供する。
SwiftUIがアプリケーションデータの可視化的な振る舞いをするから、アプリケーションデータをどう実装するかはとても重要で、かつコアになる。また一人のユーザでも、複数端末で作業を継続するのは当たり前の体験だから、このセッションの意味は大きい。
調査すべきは: ClouldKitは、ウェブサービスにもデータを取り出せる。ウェブ側にアプリを取り出す実装は、できるのか?
- 03:55
- Xcodeでのデモンストレーション。
- iCloud capabilityで追加。
- background capabilityで Remote notification。
- 07:23
- NSPersistentCloudKitContainer、AppDelegate.swiftに。追加して。lazy var persistentContainer。
- 09:04
- クラウドキットのローカルレプリカ。
- ローカルとクラウドでの伝送速度は桁違いに違うよと。
- 同期スケジュールは自動化されている。
- 14:11
- Containerの拡張。
- 複数のストア、
- CloudKitSchemaを弄る。外部ウェブとの連携。
- データモデル、コラボレーション。
- 14:50
- Multiple store
- 制約が異なる場合
- スロットルするとき。
- 15:50
- 頻繁な更新があるもの。いちいち同期してもね。
- ロケーション情報だけローカル保存とか。
- 19:54
- Schema、
Creating Great Localized Experiences with Xcode 11
https://developer.apple.com/videos/play/wwdc2019/403/
-
iOS13では、システム言語とは別に、preffered languageが設定できる。
- インドではお昼の授業は英語で、家に帰ればヒンディー語でと、1日で使う言語が切り替わる生活をしているところは、よくある。そのような利用場面で、iOSを再起動しなくても、言語を簡単に切り替えできる。
-
コードからの言語設定変更はサポートされない。設定アプリに遷移する。
- UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString!))
-
言語設定の変更は、アプリを再起動させる。 AppDelegateの application(:shouldSaveApplicationState:) application(:shouldRestoreApplicationState:) restorationIdentifier、言語切り替えをシームレスにするのに、コントローラのを設定する。
-
Locale.preferredLanguages ユーザが設定しているpreferred languageのリスト取得
- でもこれ設定だから、アプリのバンドルにない言語があったりもする。
-
Bundle.main.preferredLocalizations.first バンドルで一致する言語を返す。
クライアントアプリで、サーバー側と言語を合わせたければ、 let availableLanguages = Server.requestAvailableLangues() Bundle.preferredLocalizations(from: availableLanguages).first でバンドルのなかでのリストの中から適当なのを選ばせる。
-
シーンステートの復元
- stateRestorationActivity(for scene:)、NSUserActivity、シーンステートをエンコードしている。
-
デバイスごとに異なる文字列の扱い。
- .stringsdictで、NSStringDeviceSpecificRuleType (appletv, applewatch, ipad, iphone, ipod, mac)
- Settingbundle
-
ローカライゼーションのテスト。
- クリップ、truncation, レイアウトの重なり、右から左の言語。
- テストの設定で、スクリーンショットの生成。
Working with USD
https://developer.apple.com/videos/play/wwdc2019/602/
- usdをアーカイブファイル化するのがusdz。
- usdzconvert
- .obj, .fbx, .gltf, .abcなどのファイルをusdzに変換する、コマンドラインツール。
SceneKitから.usdzを出力。 let scene = SCNScene(…) … scene.write(to: baseURL.appendingPathComponent(“file.usdz”), delegate: nil)
- カーブした表面の再分割。
- OpenSubdiv。 Pixarが開発した。
What’s New in Swift
- Xcode11, Swift5.1
- ABI stability
- Swift 5 またはそれ以降でビルドされたフレームワークやプログラムであれば、コンパイラーが異なっていても、ABIが安定しているので、ビルドできる。
- Module stability
- Swift5.1 で、stable and textual module interface fileが導入。
- Module + ABI stability = Binary frameworks
- アプリのランタイムはOSにそれがあれば、それを使う。
- iOS12.2 以降は、ストアで無駄なコピーされたランタイムを取り除く。
- SwiftNIO
- 非同期のクロスプラットホームのネットワークアプリケーションフレームワーク。
- docker pull swift;
- docker run -it -rm -v ~/swift-nio:/swift-nio swift
-
cd / swift-nio; swift build;
-
明示的な単1の表現でのreturnは省略できると。 var area: Double { return width * height }. から var area: Double { width * height }, に。
let quantity = 10 return Text( “You have (quantity) apples”, comment: “Number of apples” ) このyou haveの部分を、ローカライズのキーにできる。ビルド時に、you have + 数値 + applesと分解し、数値部分はローカライズした数値表現で置換する。
Swift DSL。HTMLを例に、HTMLBuilder()をコード内に分散する書き方が、DSLだと、構造のみをすっきりとかけるようにと。
Introducing Desktop-class Browsing on iPad
https://developer.apple.com/videos/play/wwdc2019/203/
- iPadにデスクトップクラスのWebブラウザ。
- iPhoneは小さな画面で、タッチがあって。このiPhoneの利点を活かす、Webの機能を入れてきた。
- ビッグスクリーン、ラージスクリーンで、ウェブサイトは2つある。でiPadは今までスモールだったけど、これからは大きな方に。
- タッチインプット、マウスインプット。マウスオーバー、out of boxで動くよ。
- リンクフォロー。
- 画面分割表示で、領域が小さい時は、ミニモードな表示になるとか。
- WKWebViewでデスクトップなウェブ体験を有効にするには、
- ユーザエージェントを設定する
- webViewConfiguration.applicationNameForuserAgent ユーザエージェントを設定できる。
- WwebViewで、WKWebPagePreferences , recommended, mobile, desktop、設定できる。
- WebNavigationで、このpreferencesを設定できると。
セッションの2/3くらいがデモや具体例の紹介。
Introducing SwiftUI: Building Your First App
https://developer.apple.com/videos/play/wwdc2019/204/
最初はコードデモ。コードがリアルタイムに画面表示に反映され、またデザインツール側の設定がリアルタイムにコードに反映される。ビューのスタック、レイアウト、パディングやアライメントの設定、デバッグ用のプレビュー表示設定、ナビゲーションの入れかたなど。
Viewはstruct。Viewは、bodyプロパティを持つだけ。Viewはpiece of UI。 Viewは、dependencyを示す。"@State private var zoomed = false"とか。ステートプロパティ。
時間のかかる処理、UI操作をはさみ。アクティブインディケータの表示、ステートの数で指数的に複雑度は増えるよねと。
データバインディング。配列とリストUIとの自然な結合。
What’s New in Clang and LLVM
https://developer.apple.com/videos/play/wwdc2019/409/
-Ozオプション Function outlining 処理コードが部分的に同じものを、関数としてまとめて、ブランチすることで、タスクプログラムの25%くらい。 この節約はどこから来るの? 関数の呼び出し最初と戻りの時、SPの退避とか、同じ処理コードがある。
Obj-Cのプロパティ、初期化で値設定するときに、NSObjectでポインタからのオフセットをアドレス加算して、そこに演算処理をする。Xcode11以前。 オフセット値はビルド時にわかるのだから、直接オフセットした値でメモリ操作してしまえばいい。 2%くらいコードサイズ節約。
C++で、スタティックなインスタンス。終了時のデストラクタ呼び出しは意味がない?
Advances in Camera Capture & Photo Segmentation
https://developer.apple.com/videos/play/wwdc2019/225/
フロントとバックのカメラからそれぞれフレームを取れるようになった。 マイクも前後で複数あるから、それはアプリ側で合成する重みを調整して、ビームの指向性を作ってね。
顔の領域分割ができる。顔全体、髪の毛、肌部分、歯の部分。髪の毛を毛の単位で識別する。マットの画像サイズは、元画像の縦横1/2サイズ。 A12以降で動く。マットは、ポートレイトモードのキャプチャに埋め込まれている。あるいは独自のキャプチャアプリを作って、オプトインするか。 マットはCoreImageに統合されているので、画像処理にはそちらで。 HEIFに、メインの画像データに追加して、auxillary matte CIImagesを保存できる。
Data Flow Through SwiftUI
https://developer.apple.com/videos/play/wwdc2019/226/
Source of trueth, “@State”; Viewのstructのプロパティを修飾する。 “@Binding” Stateから派生する。値自体はownしないもの。
外部からのデータ。Combine publisher。
BindableObject protocol
@ObjectBinding クラスでdidChange()で変更を伝えて、モデルの変更を伝える。
@EnvironemtObject ビュー階層でモデルを渡すときに便利。基本ObjectBindingでいいけど、階層でモデルを渡していかなくても、Environmentだとグローバルに渡せる。
@State, View-local, Value, Framework Managed. BindableObject, External, Reference, Developer Managerd.
Introducing Sign In with Apple
https://developer.apple.com/videos/play/wwdc2019/706/
2ファクタ認証。 アプリが同じなら、全てのデバイスで。
メールアドレスはAppleが認証しているので、認証メールの受信とリンクふみは不要。
AppleID紐付け、メール/パスワード認証。
Real user indicator。
JS SDK。
What’s New in Core Location
https://developer.apple.com/videos/play/wwdc2019/705/
Allow onceが追加。 User alwaysで2回目の利用認証を取らないなら、when in userステートに落ちる。
Beacon ranging Region monitoring no longer requires always authorization.
CLBeaconIdentityConstraint
Advances in App Background Execution
https://developer.apple.com/videos/play/wwdc2019/707/
Power, Performance, Privacy
これまでのバックグラウンドのbest practice: メッセージ、コール、muted threads, バックグラウンドダウンロード。
メッセージは遅れば即時に処理が終わると期待するが、実際にはそうでもないかもしれない。アプリが終了されては。 UIApplication.beginBackgroundTask() message, Phone calls, コード例の紹介。 VoIP Pushed other tips, callder info in push payload, 即時に処理ができるように。 Set apns-expiration on push to 0 電話コールだから、その場で応答できないなら意味がないので。 バナーを出したければ、VoIP pushはバナーを出さないので、別のpushも使う。
Muted Thread,どれを読みどれを読まないかはユーザの設定次第。 alert, sound, badgeは設定しないで、“content-available: 1"でpushを送る。
New: Background Pusheds apns-priority=5 アプリは起動しない。 apns-push-type = background, watchOSでは必要、その他はめちゃ推奨。
Download Past attachments メッセージアプリを開いたら最新のメッセージはそこにあってほしい。システムに、程よい時間までダウンロードを遅延させることを許す。 充電中にダウンロードを走らせるとか。パラメータを設定してあげる。
New: BackgroundTasks バックグラウンドタスクをスケジュールする新しいフレームワーク。 Processing Task, 機械学習のモデル更新など。 App Refresh Task, 30秒。
Mastering Xcode Previews
https://developer.apple.com/videos/play/wwdc2019/233/
struct CellView: View { var body: some View { // dynamically replaced with __preview__body } }
extension CellView { var __preview__body: some View { Text(“hello”) } }
PreviewProviderを使う Struct AnimalCell: View { … }
struct AnimalCellPreview: PreviewProvider { static var previews: some View { AnimalCell(.redFox) } }
UIViewControllerRepresentableを実装して、xibのインスタンを作れば、xibのVCをインスタンスしてプレビュー表示ができる。
データモデルをtransferするとか。 self.scentificName =”(anima.genus) (animal.species)"
Model Layer -> XCTest -> View Model -> Preview -> View
Core NFC Enhancements
https://developer.apple.com/videos/play/wwdc2019/715/
これまでに追加してきた機能: NFCのリード バックグラウンドでのNFCのリード
NDEF tag writing Native tag reading
API changes もともとSessionベースのAPI。スキャンは最大60秒間。
新しく、NFCTagReaderSesion。 ISO14443, ISO15693, ISO18092タグのポーリング。特定のタグの発見コールバック、ポーリングのリスタート。
NFCDEFReaderSession NDEFタグオブジェクトの、新規発見、読み書き操作。
NFCMiFareTag ISO15693 Felica
Advances in UI Data Sources
https://developer.apple.com/videos/play/wwdc2019/220/
UICollectionViewControllerDataSource 10年来の構造。data source プロトコル、とてもシンプル。
Apps are often complicated
Diffable Data Source UICollectionViewDiffableDataSource NSDiffable DataSourceSnapshot
snapshotを作り、apply()で更新される。 セクションはenumで、デーモモデルはHashable。
デモ。検索でリストが変わっていくもの。 apply()はバックグラウンドキューから呼び出しても、安全。
performBatchUpdates() から apply() に。
Optimizing Storage in Your App
https://developer.apple.com/videos/play/wwdc2019/419/
画像アセット カメラの解像度が上がり、表示器の解像度も上がっていて、今は画像ファイル1つが25MBくらいある。
HEICがおすすめ。 JPEGと比較して半分近い(25から17とかそんな感じ)のサイズ。iOS11から対応。 aux画像データもはいる、アルファ対応。
Asset Catalog App icon, Device and scale variants. Storage efficiency. App slicing(iOS). App launch( up to 10% faster) Easy GPU based compression, Lossless by default. Lossy image compression available. AssetCatalog(前の写真だと JPEG 25MB, HEIC 18MB, カタログ 15 MB)。なので積極的に使いましょうと。
File system metadata plist. one read, three writes. 240バイトのNSDictionaryをファイルに書き込む時。 ファイルシステムノードの更新、新しいファイルにまず書き出し。オブジェクトマップの更新。それぞれ4Kで、合計8Kメタデータ。 ファイルそのもの4K。合計12K。小さなデータだと妙にデータが必要。
non-persistent fileの効率。ファイルを開いて、fsyncせずに使う。
F_BARIRIERFSYNC F_FULLFSYNC 全てのデータキャッシュをストレージに吐き出す。負荷は大きい。 F_BARRIERSYNC 特定のデータファイルにI/O順序を確保する。
Plists, XML, and JSON 便利に使えるけど、ファイル全てを更新することになったり、色々と微妙?
更新頻度が高いならCoreDataがおすすめ。 SQLiteの上にある。 SQLite、WALモードジャーナルにするとファイルアクセス減るかも?(同じページを変更する場合は) これが、おすすめ。
VACCUM はコストが高い。 incremental auto vacuum と fast secure delete が、ファイルサイズとセキュリティの2つの管理に使えるよと。 Partial indexes。
Embedding and Sharing Visually Rich Links
https://developer.apple.com/videos/play/wwdc2019/262/ リンクにメタデータを追加して、リッチな表現にできる。URLは、ウェブでもローカルファイルURLでも。 リンクの表示。共有シートでも使える。
LPMetadataProvider, LPLinkMetadata。ウェブからメタデータを引っこ抜いてくれる。 LPLinkMetadataはシリアライズできる。
Advances in Networking, Part 1
https://developer.apple.com/videos/play/wwdc2019/712/
Low Data Mode データ量が厳しい場面で、WiFiやセルラーごとに設定できる、ネットワークデータ利用量を小さくるシグナル。
アプリケーションは、adoption。 画像解像度を下げる、プリフェッチを少なくする。同期を少なくする。オートプレイを止める。タスクをdiscretionaryにする。 でも、ユーザの操作は止めないように。
URL Session プリフェッチや大きなデータは、allowConstrainedNetworkAccess = false error.networkUnavailableReason == .constrained のエラーが出たら、Low Data Modeに切り替えるとか。
Network.framework NWParameters の prohibitConstrainedPaths を設定。 NWPath の isConstrained をチェック。 パスの更新の処理。
URLSession allowExpensiveNetworkAccess
Network.framework NWParameters prohibitExpensivePath, NWPath isExpensive
Combine in URLSession .debounce(0.2) キー入力の、値の遅延。 .removeDuplicates()
URLSesssion Single value publisher URLSession.datatTask()に近い。
WebSocket
Advances in Networking, Part 2
https://developer.apple.com/videos/play/wwdc2019/713/
Bonjour NWBrowser クラス。Bonjour サービスタイプのブラウジング。 デモで、ゲームのアプリ。Bonjourでの、アドバタイジング、発見、接続。
user space network stack, threadで動いている。 やり取りとすると、header/bodyで2回のやりとり。タイプやbodyの可変サイズを取得するのに必要。 header/bodyを1つの塊にして送る。1-65535の大きさで途切れるから、再構築が必要。 Framing。アプリケーションメッセージを、カプセル、エンコードする。
スタックがユーザランドにあるから、このフレームワークで独自のプロトコルを追加したり、TLSを追加したり、層を扱えるのですね。 TCP, Lenght-Value Framer, UDPは? どっちでも動く。
let message NWProtocolFramer.Message(definition: MyProtocol.definition) message[“key”] = “value // key-valueを追加できる。 NWConnection.ContentContext(identifier: “hoge”, metadata: [message])
CNCopyCurrentNetworkInfo Access Wi-Fi Information.
Introducing Combine
https://developer.apple.com/videos/play/wwdc2019/722/
パスワード入力画面を例に。 ユーザ目0を表示、UIのtarget/action, 入力に対する反応の遅延時間のtimer, activity(kvo)。 非同期インタフェース、target/action, notificationcenter, url session, kvo, ad-hoc callbacks… これらすべてを置換するのがCombine、over timeで値を扱う仕組み。 Generic, type safe, composition first, request driven,
Operation API Functional transofrmations, List operations, Error handling, Thread or queue movement, Scheduling and time.
Compositionの積極的利用。Syncでの配列に相当するものは、AsyncでPublisherに相当。
Zip、複数の入力を1つのタプルに。when/andオペレーション。全ての入力が完了。 CombineLatest, 複数の入力を1つの値に、when/or おオペレーション。
Modern Swift API Design
https://developer.apple.com/videos/play/wwdc2019/415/
Clarity No prefix in swift-only framewoks
Rference or Value? リファレンスに意味があるならクラス、リファレンスカウントとdeinitが使う場面。 identity と equality は違うもの。
プロトコル,クラス。 プロトコルで書き出さない。必要なところでプロトコルに。ジェネリックの使い方。
Property Wrappers 使う前に初期化されているべき属性、繰り返される同じコードを、定義にまとめて属性として定義できれば? @proprtyeWrapper public struct LateInitialize { …. } public struct MyType{ @LateInitialized public var text: String // これをコンパイラが内部コード生成する var $text: LateInitialized = LateInitialized() public var text: String { get {$text.value } set {$text.value = newValue } } }
@UserDefault(key: “BOOSTER_IGNITED”,defaultValue: false) static var isBoosterIgnited: Bool
@ThreadSpecific var localPool: MemoryPool @Option(shorthand:“m”, documentation: “Minimum value”, defaultValue: 0) var minimum: Int
SwiftUIで@state, @Bindingなど…
Modernizing Your UI for iOS 13
https://developer.apple.com/videos/play/wwdc2019/224/
Launch storyboard, 2020年までの対応が必要。 Be resizable. iOS13でビルドすると、全画面表示になる。リサイズにすること。 Support any size, split screen multitasking. New bar appearance, let appearance = UINavigationBarAppearance()
Presentation レイヤードな、全画面に近い情報表示。Sheets。 UIModalPresntationStyle. .pageSheet, .formSheet / .automatic Readable widthが、ダイナミックタイプで画面に占める幅が変わる。
Search UISearchViewController/UISearchBar, UISearchTextField, CancelButton, ScopeBar, SearchResultController, Search Tokens, 色付きタグ表示なテキスト、
Gestures UITextInteraction CollectionViewControllerで複数アイテムの選択ジェスチャ。
UIContextMenuInteraction Rich preview,