わふうの人が書いてます。

iOSアプリケーション開発、BLEのファームウェアとハードウェア試作のフリーランスエンジニア。

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、
      <!–
      Object
      CoreDta
      NSManagedObject
      Cloud Kit
      CKRecord

Models
NSManagedObjectModel
Schema

Stores
NSPersistentStore
CKRecordZone

これを2つを1つのフレームワークに。
–>

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 previewbody
}
}

extension CellView {
var previewbody: 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。

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,