potatotips #47 のブログまとめ枠で参加させていただきましたのブログです。
オイシックスドット大地さんの会場。(移転されていたことに向かう途中まで気づきませんでした…)
隣の部屋はキッチンになっていて、そこで調理してくださったのであろう料理がとても本格的でおいしかったです。
以下発表内容です。間違いや気になるところなどあればご指摘ください。埋まっていない資料は公開されたのを見つけ次第反映します。
審査なしでiOSアプリのアイコンを変更する / Hideyuki Okuni さん
審査なしでiOSアプリのアイコンを変更する方法がある。
iOS10.3から使用可能な機能で、それ以前のiOSをサポートしている場合は if #available(iOS 10.3, *) {}
を使う必要がある。
やり方は意外と簡単で、CFBundleIconsというKeyの設定をInfo.plistに追加して、アイコンをプロジェクトに追加、UIApplication.shared.setAlternateIconName()
を使うだけ。このときアイコンはAssets.xcassetsではなく直接追加する必要がある。
注意点としては、これをやると「アイコンが変わりましたよ」的なアラートが出るので、ユーザーのヘイトが溜まらなさそうなタイミングを見計らってやったほうが無難。
Advanced Usecase for Codable / d_date さん
Swift4からCodableというものが使えるようになった。これはJSONをEncode & Decodeできるもの。
デコードする機能ほうはよく語られていると思うが、エンコードの機能もなかなか便利。
たとえばキャッシュを作る時。サーバーからデータを取ってきたいが、サーバーにアクセス出来ない場合はキャッシュを返すようなときに、Encodableを使ってローカルに置いておくことで実現できる。Keychainにトークンを保存しておきたい場合もData型にすれば保存できるので簡単。
Swipe Transition / tattn さん
画面のどこでもスワイプジェスチャーする機能を実装してみた(SwipeBackと呼ぶ。Sloppy Swipingとも呼ばれている)。あと下スワイプでモーダルを閉じるやつ(なんというのかわからないが今回はSwipeToDismissと呼ぶ)も実装した。
実装方法。まずUIPanGestureRecognizerという有名なクラスがあって、これで指の移動量を取得できるのでこれでスワイプを検出する。
また UIViewControllerAnimatedTransitioning プロトコルを使うと自作の画面遷移を実装できるので、これを使ってViewの表示位置を移動させる(SwipeBackなら右、SwipeToDismissでは下)。
UIViewControllerTransitioningDelegate はpresent/dismiss時に前述のUIViewControllerAnimatedTransitioningを指定するためのプロトコルで、SwipeToDissmissで自作の画面遷移を利用するために使用する。
UINavigationControllerDelegateはUINavigationで発生するイベントの補足や、前述のUIViewControllerAnimatedTransitioningを指定するためのプロトコルで、SwipeBackで自作の画面遷移を利用するために使用する。
UIPercentDrivenInteractiveTransitionは画面遷移の補完の指定や、画面遷移が何%完了しているのかを設定するクラス。これによってどこまでスワイプしたのかを表現する。
これらを組み合わせて実際にSwipeBackを実装する方法を紹介。このとき、遷移元のviewの下に遷移後のviewをinsertして、遷移後のviewにパララックス効果(これにより、遷移前と遷移後のViewを異なるスピードで動かすことで、立体感や奥行きを演出する)を付けつつ遷移前のviewを右へ移動することで自然なアニメーションを実現している。少ないコードで実現できた。
せっかくなのでライブラリ化した。ScrollViewがあっても動作するようにしたり、Method Swizzlingですべての画面に適用する機能も備えている。
UXデザインをやるやらないで変わったUIの精度 / HaraguchiYumiko さん
UXデザインの手法を取り入れたらUIが洗練された話。
動画から指定した位置の静止画を切り出せるという、スナップショット機能という機能を作り、その後指定した範囲の動画を切り出せる機能を作ることになった。
UXデザインの手法を取り入れ、ユーザーストーリーを考え→ユーザーテスト→ユーザーテストを反映→再度ユーザーテストすることにした。
ユーザーストーリーを取り入れたことにより、操作に統一感が出てきた。その後ユーザーテストを行いUIを洗練した(このとき15名ぐらいにお願いしたのだがこの機能の場合5名ぐらいで良かったという気づきがあった)。
UXデザインを導入することで、洗練されたUIを提供しながら、UIデザインで正解がわからなくなったときの判断材料として使えるようになるので、時間は掛かるが、UIを洗練するためには良い。ユーザーストーリは簡単な機能の追加でも有効だと思うので試して見ると良い。
初めてのSwift Intermediate Language / kitasuke さん
Swift のコードは実行ファイル(.o)になるまでに以下のようなフェーズを踏んでいる。
(【】で囲んであるのがコンポーネント、囲んでないのが成果物) 【lib/Parse】→AST→【lib/Sema】→ (type checked) AST→【lib/SILGen】→(raw) SIL→【lib/SILOptimizer】→canonical SIL→【lib/IRGen】 →LLVM IR→【LLVM】→.o
発表では、局所変数を定義して、代入したものを返すような簡単なコードが、SILになったときどんな感じになるのかというのを紹介。
またSILOptimizerが通常やる最適化以外にも、コンパイラに-Oオプションを付けた場合のOptimizeもあって、格納しても使われない変数なんかがある場合はアドレスそんまま返すとかをやってくれる。
SIL、思ったより難しくないし、最適化の仕組みが知れるのはなかなかSwiftエンジニアとして良いと思うのでおすすめです。とくに最適化の部分。
詳しく知りたい場合はswift/docs/SIL.rst などを読むと良い。
ほか参考資料
既存のプロジェクトに、Firestoreを導入してみた / sun54907 さん
FireStoreはオフライン、リアルタイム更新にも対応するデータベース。Firebase Realtime Databaseの後継でまだbeta。
開発合宿をやったときにFireStore導入しようという話になった。
普段できないことを取り組むというやつで、sun54907 さんのチームではリアルタイム通信を導入することにした。リアルタイム通信の方法はいくつかあって、WebsocketとかRealmとか使う方法もあるけど、websocketを自前実装するのは大変そうだし、外部サービスにメッセージ等の個人情報を置くのも嫌。
そんなとき、「マッチングアプリにつきまとう状態管理のつらさ」というLT資料を見つけた。
これは最終的にFirebaseに新着件数だけを置いて、その更新をフックして既存のAPIを叩くということをしており、今回のケースにもマッチすると思ったので採用することにした。
ユーザー認証も必要なのでFirebaseのAuthを使った。サーバーから得られたカスタムトークンを使うことで認証できる。
この方法を使えば2日程度で実装できるほど簡単だが、現時点ではβ版なので動作保証されない(SLAもない)ことに注意。
Introducing Relax -- A release tool for Xcode / SCENEE さん
Swift言語とSwiftという上下昇降デスクにハマってらっしゃるSCENEE さん。
Relaxというツールを作ったのでその紹介。
アプリ申請時、xcodebuildでAutomatic Signing/Manual Signingでハマったとか、ipaに想定と異なるProvisioning Profileが入ってるとか、色々ハマりどころがある。
Relaxを使うと、Relfileという名前のYAMLを置くだけで、Codesignエラーに悩まされることなく、IPAファイルを作成することが出来る。
brewで入る。xcarchive, ipaの作成だけでなく、ValidateコマンドでArchiveした後のIPAを簡単に検証したり、別のProvisioning Profileを使ってipaのresignをしたり、ほかにも色々機能がある。
感想
今回はiOSの発表がめちゃくちゃ続いて(potatotipsはAndroidとiOSの発表が交互にやられるので、いつもはAndroidの発表を聞きながらiOS側の発表を咀嚼しつつまとめるみたいなことをしてた)、まとめるのはちょっと大変でしたが、勉強になって楽しかったです!