iOSDC Japan 2023 Report Day 1

iOSDC Japan 2023 Day 1のレポート記事です。

iOSDC Japan 2023 Report Day 1

iOSDC Japan 2023 Day 1のレポート記事です。

今回のiOSDC Japan 2023への参加は、iOSDC Japan 2023のプラチナスポンサーを務める、株式会社CyberAgentスカラシップ制度によって実現することができました。

ご支援をいただき、誠にありがとうございました。

参加したセッション

発表内容や発表資料をもとに、セッションの内容を自分なりにまとめます。

まとめるにあたり、参考にした資料は、各章に記載します。

TextKit 2 時代の iOS のキーボードとテキスト入力と表示のすべて

TextKit 2 時代の iOS のキーボードとテキスト入力と表示のすべて
iOS は一見、テキスト入力や表示のような基本的実装はとても簡単に思えますが、実際には一度はその動作に頭を悩ましたことがあるでしょう。 iOSDC 2020 では「iOS のキーボードと文字入力のすべて」と題してこれらの問題について詳細に検討しました。 そして、この3年間で iOS は大きく変化し、SwiftUI が広く使われるようになり、全く新しいAPI、TextKit 2 が登場しました。 TextKit 2 は大きく変化しおり、互換性に関して注意すべき点が多くあります。 このセッションでは、過去の事例と比較して、多くのユーザが使う iOS アプリにおけるリッチテキストの実装などを踏まえ…

このセッションは、世界で最も優れたiOSデベロッパーの一人と言われる @niw さんによるセッションでした。

@niw さんは、もともとTwitterのiOSエンジニアであり、先日放送された、Backspace.fmのDanbo-side#074 に出演されました。

ちょうどそのエピソードを聞いた後だったので、このセッションを聴くことができて、非常に嬉しかったです。

TextKit 1の説明、TextKit 2でどう変化したかということをお話しされていました。

TextKitについてあそこまで詳細に見る機会がなかったので、個人的に興味深いお話しでした。

日本語にとどまらず、文字の構成が異なる他の言語についても言及されていて、面白かったです。

Mastering SwiftSyntax

Mastering SwiftSyntax
Swift 5.9ではマクロが導入されます。すでにSwiftUIではマクロが広く利用されています。今後はコミュニティ製や自作したマクロを使うこともあります。 マクロはSwiftSyntaxというライブラリを使った構文変換です。これまでSwiftSyntaxはツールを介した間接的な利用がほとんどでした。しかしマクロを書いたりデバッグするには直接SwiftSyntaxを使う必要があります。 SwiftSyntaxを使うコードはかなり見慣れないコードになります。コンパイラで使用されているコードで一般的な用途のコードではないからです。 この講演ではSwiftSyntaxの構文ノードの種類やAPIの使用…

実は、このセッション、間に合わず、聞けませんでした...

もっとも楽しみにしていたセッションの1つなので、後日、アーカイブを視聴次第、追記しようと思います!

旅行アプリでより正確にパスポートを読み込む技術 ~ MLKit / Vision / CoreNFC

旅行アプリでより正確にパスポートを読み込む技術 ~ MLKit / Vision / CoreNFC
みなさん、海外旅行は好きですか?対策緩和で少し海外に行きたいと思う方も増えてきたのではないでしょうか。我々はすべての方に海外旅行をより簡単でおトクに選べて安心なサービスを作るために日々「NEWT」を開発・改善し続けています。そこで必ず必要になるのが「パスポート」です。海外旅行においてパスポートは入力を間違えると最悪の場合、出発・入国ができないなどのトラブルに見舞われてしまいます。そんなお客様のトラブルを限りなくゼロに近づけるためにパスポートの読み込みにOCRの導入を行いました。その際に検討した内容や実際に導入・決定している方針などを踏まえて以下の内容をお話しします。 - MLKit/Visio…

このセッションは、令和トラベルが開発するNEWTという旅行アプリで、パスポートを正確に読み込むためのプロセスや技術についてお話ししていました。

CoreNFCに興味があったので、このセッションを聞こうと思っていたのですが、パスポートの構造なども知ることができたので、面白かったです。

SwiftUI + KMM 開発で見えたそれぞれの長所と短所

SwiftUI + KMM 開発で見えたそれぞれの長所と短所
Wantedly では 2020年からモバイルアプリのロジック部分のクロスプラットフォーム技術として Kotlin Multiplatform Mobile (KMM) を採用しています。 2022年からは徐々に SwiftUI 導入を進めて、プロフィールをリニューアルするプロジェクトでは全面 SwiftUI での開発を試みました。 また、プロフィールのリニューアルは、Android が先行して実装し、KMM の実装もすでに完成していました。 そのため、このプロジェクトは、KMM と SwiftUI を初めて組み合わせるプロジェクトとなりました。 本トークでは、このような状況で KMM と…

こちらは、Wantedly株式会社のスポンサーセッションです。

SwiftUI + KMP といえばWantedlyというイメージを勝手に持っていたので、このセッションを聴くことができてよかったです。

メインはUIKitで、あくまでSwiftUIは部分的というプロジェクトで、どのようにSwiftUIとKMPを導入していったかというお話しでした。

KMPを使うことで、ビジネスロジックの共通化を行うことができますが、Kotlinで定義されたクラスであることから、ObservableObjectに準拠していないなどの問題があり、それをどのように解決するかということについても言及がありました。

また、UIKitとSwiftUIで差異がでる部分についても言及していました。

最後に、KMPをSwiftで扱う際のデメリットについても解説がありました。

僕自身、KMPについての知識・知見がないので、もうすこし学習をしてからもう一度見直してみようと思います!

アプリ内課金におけるトラブルを劇的に減らすための取り組み

アプリ内課金におけるトラブルを劇的に減らすための取り組み
アプリ開発の中でも、アプリ内課金はとりわけ高品質が要求される領域です。 課金に関するトラブルは、ユーザに対し不安や混乱を抱かせるとともに、お問い合わせなど面倒なアクションを要求します。また、事業への信頼値の低下やお問い合わせへの対応コストの増加など、ビジネスにも多大な影響を及ぼすため、可能な限り抑えたいところです。(開発メンバーのメンタルも健全に保ちたい…!) 私が開発に携わっているアプリでは、ユーザがアプリ内商品を意図せず重複購入してしまいお問い合わせが多発する問題に悩まされてきました。本トークでは、この問題を解消するに至った取り組みについて、仮説立てから設計、より良いアプリ内課金体験を提…

こちらは、AbemaTVのiOSエンジニア、Koki Hirokawaさんの発表でした。

ABEMAで実際にあったApp内課金におけるトラブルを題材に、どのような問題があり、どのように解決したのかをステップbyステップで説明されていました。

加えて、課金処理中のユーザへのフィードバック、ログと公式ドキュメントの重要性を認識しました。

現状、ABEMAでは、OriginalAPIを利用しているようで、StoreKit2を使うとどうなるのかが気になります。

ソーシャルログイン機能のデバッグ地獄をくぐり抜けてリファクタリングした話

ソーシャルログイン機能のデバッグ地獄をくぐり抜けてリファクタリングした話
今日のモバイルアプリはログイン機能を持つものが多いですが、プロダクトの成長に伴って複数のソーシャルログイン機能を導入することは少なくありません。私たちが担当する出前館アプリもその一つです。 我々の今後の開発予定を考えると、ソーシャルログイン機能の改修が必要でした。しかし、その仕様に関するドキュメントやデバッグ方法のナレッジが不足している、という大きな課題がありました。そこで我々は各ソーシャルログイン機能に対してデバッグ作業を地道に進めつつ、ドキュメントの整備を進めました。 本セッションでは我々が取り組んだソーシャルログイン機能リファクタリングに関する苦労話とそれによって実現できた機能改善事例…

出前館のiOSアプリのUI改善のお話や、ログイン周りのリファクタリング、テストの増強のお話がありました。

ソーシャルログインならではの苦労や改善のためのアクションについて聴くことができました。

一般的な通信でも使えるバックグランドURLSessionの活用方法

一般的な通信でも使えるバックグランドURLSessionの活用方法
バックグランドURLSessionとは、アプリがバックグランドに行っても、終了されても、別プロセスでデータ通信が可能なURLSessionです。 バックグランドで長時間ダウンロードする必要がある時のみ使われるイメージはありますが、アプリやWidgetに必要な情報の先読み、バックグランドに行ったことによるタイムアウトの回避にも使えます。 Date taskがサポートされず、upload taskかdownload taskを使う必要があるので、使い方は少し特殊ですが、一度対応しておけば普通のURLSessionと同じ使い勝手になるので、バックグランドURLSessionを一般的な通信で使ってみま…

バックグラウンドで通信したい場面があっても、アプリのプロセスと共にサスペンドされたり、フォアグラウンドに戻った際にタイムアウトになっている可能性があります。

また、メモリ不足等の理由により、バックグラウンドのプロセスが強制終了される可能性もあります。

URLSessionをバックグラウンドで使うことにより、別プロセスで実行されるようになるため、以上の問題を回避することができます。

また、システムの状態を監視し、最適な行動をしてくれるというメリットもあります。

このようなメリットのもと、どのように活用できるかという話もありました。

中でも興味深かったのは、Background App Refresh Taskの代わりとして使うということです。

SwiftUIでの非同期処理データの状態管理を考える

SwiftUIでの非同期処理データの状態管理を考える
みなさんはSwiftUIで非同期処理データの状態管理をどう行なっていますか? - enumを使う方法: `enum DataState { case loading; case success(Value); ... }` - コンポーネントを使う方法: `LoadingContent(fetch: fetch) { Content($0) }` などがあると思いますが - リロード中は前回の結果を表示したい場合 - ページングに対応する場合 等の要件で、微妙に異なるバリエーションがいくつか存在する上、それらの方法にはメリットとデメリットがあります。 パフォーマンス低下を引き起こしてい…

非同期処理データの状態管理にenumを上手に使うというテーマで、いくつかのケースについて詳細に説明されていました。

そうか、こういう使い方もできるのか!ということがそれぞれのケースにあって、非常に面白かったです。

enumは、Swiftの強みの1つだと思うので、これからさらに使いこなしていきたいと思います。

オープニングパーティー

iOSDCの恒例らしい (2019年以来最初の) オープニングパーティーに参加しました。

すごい盛り上がりでした...笑

全然話せる感じじゃないので、みなさん各々おもいっきり楽しんでいましたね。

念願の@tomozohさんとの2ショットが撮れて、とても嬉しかったです。

↓ 明日はリアル@hakさんに会えるのかと思って、ドキドキしている僕です。

@tomozohさんとの2ショット

Day 1 まとめ

いろいろなテーマのセッションがあって、ついていくのがかなり大変でしたが、それぞれのセッションの内容が濃く、聞いていてとても楽しかったです。

また、常に、新たな視点が増えていく感覚があって、これからの学習に役立てたいという気持ちが強く残りました。