WWDC18 Keynoteメモ
WWDC18 Keynote
Keynoteの内容を書き下したメモ
https://developer.apple.com/videos/play/wwdc2018/101
tl; dr
- 新しいハードの発表は無し
- 今回のリリースは最適化、セキュリティの改善を強調しており、OSの基盤を固めるリリースと言える
- AR, 機械学習分野の強化がなされた(ARKit 2, Creating ML, Metal 2)
iOS
iOS12
- 大幅な最適化がなされた
- ARアプリ
- ARKit 2
- メジャーアプリ
- カメラを起動して、画面に写ったものを採寸できる
- 写真アプリ
- search, suggestion, for you, share
- 機械学習を基盤にした各種機能が追加される
- SiriKit Shortcuts
- キーワードを登録できる
- Siriからアプリ操作するショートカットを作成できる
- Shortcuts app
- IFTTTみたいに複数のアプリをピタゴラスイッチのように連携できる
- 以前買収したWorkflowが本家に取り込まれた形
- ニュースアプリ
- personalized, secure, trusted
- 株価アプリ
- ニュースアプリと連携できる
- ボイスメモアプリ
- iPadでも使えるようになった
- iBooks
- CarPlay
- 新しいマップアプリがサポートされた
- google mapなど
- Do Not Disturb
- 特定の期間通知をOFFにすることができる
- Grouped Notification
- 通知をまとめて表示する
- アプリ毎
- 通知をまとめて表示する
Screen Time
- アプリの起動時間、通知を確認できる、アプリの使用に時間制限をかけられる
- 子供のアクティビティを監視できる
- 子供の端末をより安全にセットアップできる
Animoji, tongue
- iMessageで動くアニメを送れるように
- Memoji
- Animoji をカスタムして自分の似顔を作れる
- FaceTime
- 32人まで同時に使えるようになった
watchOS
watchOS 5
- competition, Awards
- 友達と競える
- Walkie-Talkie
- AppleWatch を使ってメッセージを送れる
- WatchOSだと "Hey Siri" 言わなくてよくなる
- WebKitサポート
- Podcasts アプリがリリースされる
- 学生向けのID管理機能がリリースされる、6大学に対応
macOS
macOS Mojave (モハべ)
- Dark Mode を搭載する
- 画面を黒基調のアピアランスに変更できる
- Dynamic Desktop
- 壁紙の色が時間帯によって変わる
- Stacks
- デスクトップのアイコンをまとめられる
- Gallery view, Quick Actions
- Quick Look , macOSのビューアアプリで画像、動画pdfをさくっと編集できる
- Screenshots , video recording
- ニュース、株価、ボイスメモ、ホームアプリがMacアプリに提供される
- macOS の FaceTimeも 複数人に対応
- セキュリティの強化
- Mac App Storeがリニューアル
- App Store Connect
tvOS
Technologies
ReSwiftをためした所感
現在仕事で開発中のiOSアプリにReSwiftを導入できないか検討した。
結論としては今回は導入を見送ったが、良いと感じた部分が沢山あったので雑な作業メモを転記する。
ReSwift とは
Redux は複雑な状態を管理するために生まれたJS発祥の技術
そのRedux をSwiftに移植したものがReSwift
ReSwift/ReSwift: Unidirectional Data Flow in Swift - Inspired by Redux
こちらに大変わかりやすくまとまっている
ReSwiftでアプリの状態管理 / Reactive Swift Meetup // Speaker Deck
モチベーション
- アプリ全体で共有する状態の管理をうまくしたい
- グローバルなスコープのシングルトンにアプリの様々な箇所からアクセスするのは不健全な気がした
インストールから簡単に使うところまでの作業メモ
まずは以下のリポジトリをそのままアプリに移植し、それを拡張していった
ReSwift/CounterExample: Demo Application of Unidirectional Data Flow in Swift, Built with ReSwift
ReSwift を Cartfile に追加
$ carthage update --platform iOS --no-use-binaries
ReSwift の設定をプロジェクトに反映
AppState を作成
- アプリ全体の状態を持つ
- Action からしか変更できない
CounterReducer を作成した
- counterの状態を変更する Reducer
- AppState を返す状態を持たない関数
Actions を作成した
Action protocol を実装した struct として定義する
subscribe すると、最初に newState が呼ばれて現在の state が降ってくる
- 最初の state は 特に action をdispatchしていないので、ReSwiftinit 型になっている
- action を dispatch すると、その結果また newState が呼ばれて状態の更新が通知される
subscribe しないで dispatch することもできる
- 状態は変更できるが、newStateに通知されない
ネットワークエラーでアラートを出したいときはどうする?
- ErrorActionを発行して、subscribeしているViewControllerで新しいstateに応じてエラーを表示する
アプリアーキテクチャに関する考察
MVP(Clean Architecture) に適用する場合
Redux にすることで、今までdelegate とかクロージャでばらばらに受け取っていたコールバックを1つのメソッドで、1つの状態として扱えるようになる
引数とメソッド呼び出しについて
- データを fetch するaction で引数にデータを渡さなくても、クロージャのstate を通じて、欲しい状態を取れるようになる
- ようするにグローバル変数と変わらないのだが、状態の変更 をAction, Reducer を用いるよう制限することで、データの流れを把握しやすくする
Promise を使った非同期処理の連結
- AsyncActionCreator を使えば非同期処理の結果をActionとして発行できる
- 状態をクロージャ間で引数として渡すのではなく、それぞれのクロージャを別のメソッドに切り出す
- newStateが呼ばれるたびに状態をチェックして発火させる
- ReSwift の話題でよくstate machineが出てくる所以はまさにここっぽい
Reducer の分割について
How could i use multiple reducer in Reswift 4.0.0 · Issue #241 · ReSwift/ReSwift いいかんじ
ユニットテスト
まだ書いたことはないが、Action は基本的に状態を持たないのでテストは書きやすそう
デバッグのしやすさ
- クラッシュした時のStateをキャプチャできるので、再現してデバッグするのが簡単になるのではないか
- ReSwift Recorderという仕組みもある
やめた理由
- 今後自分以外の人も保守することを考えると、ReSwiftにロックインされるのはあまり良くない
- 今開発中のアプリは大量の状態を持っているわけではないので、現状の要件にはそこまでマッチしていない
- newState の取り回しが若干面倒な気がしている
- pros が cons を上回るなら導入も吝かではない
- もう少し練度が上がればスムーズに使っていけるのかもしれない
SwiftGenの使い方を調べた
仕事で新しいプロジェクトに導入したく、 SwiftGen の使い方を調べていた
環境
- Xcode 9.2
- SwiftGen 5.3.0
SwiftGen とは
https://github.com/SwiftGen/SwiftGen
プロジェクトのリソース用のSwiftコードを自動的に生成し、タイプセーフな使用を可能にするCLIツール 具体的には以下の5つに対応している
- Asset Catalogs
- Color
- Font
- Storyboard およびそのシーン
- Localizable.strings
モチベーション
iOS開発では、前述のようなリソースにアクセスするには文字列を使う必要があるが、それらをタイプセーフにすることで人的なエラーを排除することが目的
導入方法
1. ディレクトリ作成
生成されたコードを格納するディレクトリを作成する
2. Cocoapods
iOSアプリで使用する場合、 Cocoapodsを使ってインストールが可能。
Podfileの内容は以下のとおり
target 'YoutTargetName' do use_frameworks! pod 'SwiftGen' end
3. swiftgen.yml
プロジェクトルートに swiftgen.yml を作成する 一例として、以下のように書ける
strings: paths: Resources/Base.lproj/Localizable.strings # パスを指定する templateName: structured-swift4 # Swift 4 を使用 output: CodeGenerated/strings.swift # どこに生成したファイルを格納するか xcassets: paths: - path/to/Assets.xcassets templateName: swift4 output: CodeGenerated/assets-images.swift storyboards: paths: - path/to/Storyboards templateName: swift4 output: CodeGenerated/storyboards.swift colors: paths: - path/to/colors.json templateName: swift4 output: CodeGenerated/colors.swift
4. スクリプトの実行
Run Scriptを設定するやり方と、コマンドラインで実行するやり方の2種類が考えられる
Run Script の設定
TARGETS -> プロジェクト名 -> Build Phrases -> New Run Script Phrase を追加して、以下のスクリプトを実行するように設定する
"${PODS_ROOT}/SwiftGen/bin/SwiftGen"
コマンドライン
プロジェクトルートで
$ Pods/SwiftGen/bin/SwiftGen
を実行する
SwiftGen と R.swift の比較
SwiftGen に近いツールでよく知られたものに R.swift がある
機能面はほぼ同等で、以下のような違いがある
SwiftGen | R.swift | |
---|---|---|
導入 | やや面倒 | 簡単 |
制御 | 不要な機能は disable できる | 全部入り |
ビルド | クラスがリソースごとに分かれているため、毎回全ビルドが走ることはない | リソースファイルに増減がある度に R.generated.swift の全ビルドが走るので、大規模プロジェクトでは時間がかかる |
好みの範疇と言えそうだが、 SwiftGen の方が取り回しが良さそうなので、 SwiftGen を使う予定
Sourceryの使い方を調べた
Sourceryの使い方を調べたので記録を残しておく
Sourceryとは
Sourcery は Swift のボイラープレートを自動生成するためのツール try! Swift Tokyo 2018における作者のトーク によると Sourcery は 5000 以上の実プロジェクトで使われていて、 Apple 社員のなかにもユーザがいるとのこと。
モチベーション
Swift は厳格な静的型付言語であるがゆえ、大量のボイラープレートが必要になる。例えばオブジェクト同士を比較するためのEquatableも開発者が実装する必要がある。1つのクラスであれば大した作業ではないが、クラス数が増えることで大変な手間となり、バグが混入する原因にもなる。それらを自動化するためのツールが Sourcery である。
利点として導入にリスクがなく、不要になったらテンプレートを削除すればOKであること、タイプセーフであることが挙げられる。
導入方法
Sourcery のリポジトリにあるサンプルプロジェクト を参考にするとよい。
1. ディレクトリ作成
以下のディレクトリをあらかじめ作成しておく
2. Cocoapods
iOSアプリで使用する場合、 Cocoapodsを使ってインストールが可能。
Podfileの内容は以下のとおり
target 'YoutTargetName' do use_frameworks! pod 'Sourcery' end
3. Run Script の設定
TARGETS -> プロジェクト名 -> Build Phrases -> New Run Script Phrase を追加して、ビルドの度に以下のスクリプトを実行するように設定する
各引数に
を指定する
"${PODS_ROOT}/Sourcery/bin/sourcery" --sources "${SRCROOT}/YourProjectName" --templates "${SRCROOT}/Templates" --output "${SRCROOT}/CodeGenerated"
もちろんBuild Phrasesにこのスクリプトを追加せず、手動で実行する運用でも問題ない。
4. プロトコルの実装
AutoEquatable, AutoHashableなど自動生成するプロトコルを予めどこかに実装する。これをやっておかないとツールがエラーになり、生成に失敗する。
protocol AutoEquatable {}
5. ビルド
1 ~ 4 までの手順が完了すれば、ビルドする度にSourceryによるコード生成が行われる。
Templatesの書き方
テンプレートは Stencil という Django template, Mustache に似た記法を使って書く。
リポジトリ にサンプルがあるのでこの辺りから出発するのが良さそう。
try! Swift Tokyo 2018にいってきた
今年もtry! Swiftに参加してきた。昨年に続きとても楽しい時間を過ごすことができた。運営の方々に感謝。
今年はSwiftの言語仕様、OSS、コミュニティ、エコシステム、マルチプラットフォームといった話題についてより深い内容を扱っているトークが多かった。iOSアプリ開発の文脈でのトークは昨年に比べて少なかった。
個人的に面白かった発表
言語プロセッサに精通することは、作業効率化ツールを作ることができたり、たくさん実利があると感じた。最近LLVMやコンパイラについて調べたりしているので、そのあたりの自分の興味ともマッチして、とても面白かった。
今 In Review とのことだが、iOS版のCharlesが出るそう。会場もかなり沸いていた。
所感
今年は言語自体に関する話が多かった印象
- Swiftの言語仕様
- SIL, ASTなどSwift言語、LLVMフロントエンドに関する発表
- マルチプラットフォーム, Linux
- ASTを用いたツール開発による効率化
- iOSDCとの棲み分けができていて良い (向こうはアプリ設計、デザイン、運用の話が中心)
国際カンファレンス
- 海外からの参加者と気軽にコミュニケーションできるのが良い
- 海外からの参加者への配慮が行き届いていると感じた
- Slack
- 翻訳レシーバ
- 場内の英語表示
beta配信したアプリをインストールできない時のチェックリスト
仕事でよくCrashlytics betaを使ってアプリの配布を依頼されるのだが、インストールできないと問い合わせを受けることがある。 その時にチェックする項目を備忘のためリストにしておく。
- UDIDは登録済みか
- Provisioning Profileは更新したか
- ビルドには更新したProvisioning Profileを使ったか
- Crashlyticsにメールアドレスは登録済みか
- Crashlyticsからの再配信は試したか
- 端末にbeta配信したアプリと同じbundle idを使っているアプリが入っていないか
それでも駄目なら
- 端末からプロファイルを削除して登録からやり直す
- ipaファイルを直接インストールする
GNU開発ツールを読んだ
正月休みにGNU開発ツールを読んだ。とても良い本だった。
C言語で書かれたHello Worldのプログラムをビルドして実行する時に、裏で行われていることについて書かれている。最初にgccドライバが何をしているか大まかな流れを説明し、その後プリプロセス、コンパイル、アセンブル、リンクの各工程を解説するという構成で大変分かりやすかった。また文章も平易で理解しやすかった。細かいコマンドの全てに詳しい説明が書いてあり、実際にコマンドをUbuntu上で実行しながら読んだ。
以前、理論寄りのコンパイラの本を何冊か読んでみたことがあったが、自分には敷居が高かった。この本はコンパイラ初学者の入門に最適だと感じた。
絶版で、現在は著者のページで電子ファイルのみ購入することができる。 www.oversea-pub.com