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

  • 大幅な最適化がなされた
    • iPhone 5Sのような古い端末でも滑らかに動くことを強調していた
    • iOS 11よりも速いとのこと
  • ARアプリ
    • ARKit 2
    • メジャーアプリ
      • カメラを起動して、画面に写ったものを採寸できる
  • 写真アプリ
    • search, suggestion, for you, share
    • 機械学習を基盤にした各種機能が追加される
  • SiriKit Shortcuts
    • キーワードを登録できる
    • Siriからアプリ操作するショートカットを作成できる
  • Shortcuts app
    • IFTTTみたいに複数のアプリをピタゴラスイッチのように連携できる
    • 以前買収したWorkflowが本家に取り込まれた形
  • ニュースアプリ
    • personalized, secure, trusted
  • 株価アプリ
    • ニュースアプリと連携できる
  • ボイスメモアプリ
    • iPadでも使えるようになった
  • iBooks
    • Apple Books になり、アプリが一新
    • ebook, audio book
  • 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
    • iPhoneMacのスクショをシームレスに扱える
  • ニュース、株価、ボイスメモ、ホームアプリがMacアプリに提供される
  • macOSFaceTimeも 複数人に対応
  • セキュリティの強化
    • ユーザの設定次第でWebサービスからのトラッキングを完全にOFFすることができる
    • 強度の高いパスワードを自動生成し、管理する機能が強化された
  • Mac App Storeがリニューアル

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) に適用する場合

    • ビジネスロジックをUseCaseの代わりにActionに書いて、それをPresenterから呼ぶ
    • StateはPresenterでsubscribeする
    • ビジネスロジックは Action にとどめておいて、 Reducerは状態の管理に徹する
    • newState に降ってくるイベントは今まで通りViewControllerにdelegateする
  • Redux にすることで、今までdelegate とかクロージャでばらばらに受け取っていたコールバックを1つのメソッドで、1つの状態として扱えるようになる

引数とメソッド呼び出しについて

  • データを fetch するaction で引数にデータを渡さなくても、クロージャのstate を通じて、欲しい状態を取れるようになる
  • ようするにグローバル変数と変わらないのだが、状態の変更 をAction, Reducer を用いるよう制限することで、データの流れを把握しやすくする

Promise を使った非同期処理の連結

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