皆さん、*許可リクエストをしっかりハンドリングできてますか?👀
アプリ上で位置情報やATTなどのプライバシーデータを扱う場合、アクセスするために*許可リクエストを適切に行うことはアプリ開発者において重要な責務の一つです。
ただ、データを扱うフレームワークごとに許可リクエストのAPIは異なっており、後続処理の制御にコールバックが提供される場合もあれば、位置情報やBluetoothのようにDelegateパターンで提供される場合もあります。
そのため、複数のリクエストを同時に呼び出したり、”データをこのように使用します”という事前説明画面の後に呼び出すなど、前後処理に紐づけて柔軟に呼び出すケースでは複雑な実装となりがちです。
本記事では、以下の二つをコードを交えてハンズオン形式で紹介していきます。
・既存のコールバックやDelegateパターンの実装をSwift Concurrencyのasync/awaitで扱えるようにする
・異なるフレームワークの許可リクエストを共通のAPIから呼び出せるようにする
withCheckedContinuationでコールバックやDelegateを置き換えたり、Actorでデータ競合対策など、実際のコードを置き換えながら学んでいきましょう!
* 本記事では、プライバシーデータにアクセスするための処理を「許可リクエスト」と表現しています。
みなさん、技術書を書いたことはありますか?
紙の本として印刷する場合、様々な決まりに従ってレイアウトを施す必要があります。例えば、用紙サイズ・左綴じと右綴じ・余白・断ち切り・背幅・トンボ・ノンブルなどがあります。
これらの設定を手助けしてくれるツールは数多く存在しますが、本稿では Adobe InDesign を例に技術書作りのノウハウをご紹介します。
特に、言語設定が原因で締め切りギリギリで再入稿することになった経験など、実体験を踏まえた注意点や便利な機能の活用法を紹介します。
パンフレットを読んで「私もパンフレット記事を書いてみたい!」と思った方はもちろん、他のツールを使って執筆を行っている方にとっても有益な情報となること間違いありません!
SwiftDataはCore Dataの後継としてリリースされたAppleの新しいデータ永続化フレームワークです。SwiftDataはCore Dataよりもはるかに簡単で安全に使うことができますが、Swift Concurrencyとともに利用する際はデータ競合に注意が必要です。これは、SwiftDataがCore Dataの上に構築されたAPIであるためです。
そこで本トークでは、SwiftDataをSwift Concurrencyと共に安全に扱う方法を解説します。SwiftDataをこれから利用する方やCore DataでConcurrencyの扱いに苦労した経験を持つ方を主な対象とします。SwiftDataの技術スタックをSwift Concurrencyの観点およびSwiftDataの元であるCore Dataの観点から解説し、SwiftDataを並行安全に扱うための原則、ならびにコーディングにおけるベストプラクティスを紹介します。
本トークによって、参加者の皆さまはSwiftDataをより自信を持って扱えるようになるでしょう。
iOSDC Japan 2023 のパンフレット記事として掲載された「Apple Silicon のためのアセンブリ入門」の続編です。
前回はニーモニックと文字出力について解説しましたが、本稿では演算処理をアセンブリで記述する方法に焦点を当てます。
Intel CPU を搭載した Apple デバイスがストアから姿を消すなど、 Apple Silicon は大きく進化しました。
私たちがこの Apple Silicon と非常に近い距離で対話する手段、それがアセンブリです。
アセンブリは機械語に非常に近い低水準言語であり、特定の CPU アーキテクチャに依存して記述方法が異なります。これに対して、Swift などの高水準言語では記述方法がほとんど変わらないため、アセンブリの特性について疑問を抱く方もいるかもしれません。
本稿では、 Apple Silicon 上でアセンブリを用いて演算処理を行う方法を紹介します。最初は仕事に直接役立たないように思えるかもしれませんが、日常的に Swift で書いている演算処理がコンパイラによってどのように機械語に変換されているのかを理解する絶好の機会です。きっと Apple Silicon がさらに魅力的に感じられるでしょう!
永続化されたデータの保護は、現代のiOSアプリ開発において必要不可欠な要素です。
しかし、Appleが提供する永続化フレームワークであるCore Dataは標準でデータの暗号化を提供しません。
また、Core Dataのデータ暗号化には、「データベース全体を暗号化する方法(SQLCipher)」や「保存するデータを個別に暗号化する方法(CryptoKit)」があります。
このトークでは、それぞれのメリット/デメリットを比較した上で、Core Dataにおけるデータの暗号化手法とその選定方法について詳しく紹介します。
参加者は以下の内容を学ぶことができます。
このトークを通して、「Core Data」の暗号化に必要なナレッジや各利点について理解を深めて頂ければ幸いです。
2年前、弊社アプリはSQLiteからFirestoreへデータ基盤の移行プロジェクトを行いました。
Firestore自体は当時のユースケースとしてはベストな選択でしたが、ここ最近求められる新機能や施策の実現に対してFirestoreではコスト面や横断したデータの活用などの観点から実現が難しいと判断することが増え、今回アプリ・サーバーサイドと合わせデータ基盤を大きく作り変える決断をしました。
そうして始まった大規模な移行プロジェクトですが、今回は「グロースなどの開発を並行しながらデータ基盤を移行してほしい」というオーダーもあったため、iOSチームとして通常の施策実装と並行して安全にデータ基盤を差し替えていく仕組みを考え実践しました。
今回のトークでは安心・安全にデータ基盤を移行するためにアプリ開発チームとして工夫したこととその実践内容について、
以下の内容を踏まえつつお話していきます
WWDC23で発表されたMergeable Libraryは、Static/Dynamicに続く新たなライブラリの形式です。
これまで、依存関係にStatic Libraryを利用することで、アプリの起動高速化や、バイナリサイズの圧縮などのユーザー体験を改善する手法が知られていました。
その一方で、この手法はDynamic Libraryのもたらす開発体験とのトレードオフになってしまう部分もありました。
Mergeable Libraryを使うことで、それらの良いとこどりができるのです!
このトークではMergeable Libraryを使った、新しいプロジェクト構成がもたらすメリットと導入のヒントをお伝えします。以下のようなトピックが含まれます。
新たな仕組みを学び、開発者・ユーザー体験の両立を目指しましょう!
「SwiftLint」という、Swift用の静的解析ツールがあります。
SwiftLintには標準で多数のルールが用意されていますが、正規表現を使って自分でカスタムルールを作ることもできます。
私は主に以下の観点でカスタムルールを作っています。
Date()
より .now
を好む)foregroundColor()
より foregroundStyle()
を使う)本記事では私が実際に使っているカスタムルールを紹介します。
取り入れなくても読むだけで勉強になりますし、正規表現なのでそのまま一括で置換もできます。
ぜひこの機会に処理の統一化や非推奨APIの置き換えを図りましょう!
時は20XX年
「おう、きたな!まあ茶でも飲んで座ってけや。そうだな、あれは俺が何十年前、iOSDCというカンファレンスに参加したときや...」。
ついに明かされるフレモンの過去、最終回で明かされるすべての伏線。今までの被害s...ゲストや読者の皆さんに感謝を込めて、まごころを君に。「おめでとう」、「おめでとう」、「おめでとう」...「ありがとう」
iOSDC パンフレット連載漫画。3年の時を経て、輝け!俺のViewController、堂々の完結!
Swiftでもシェルスクリプトのようなことができるのは既に知られていることかと思います。
しかし、標準の開発環境であるXcodeではSwiftスクリプトのサポートがほとんどされておらず、標準APIのコード補完すらできないのが現状です。
一方で、VSCode (Visual Studio Code)にSwiftプラグインを導入することでコード補完はもちろん、変数の型の確認が容易になるなどの恩恵を受けられます。
更に、GitHub Copilotも標準サポートされているのである程度の単純作業であればすぐにスクリプト化することができます。
本記事では、VSCodeにSwiftプラグインを導入する手順を解説し、実際にzshで書いたスクリプトをSwiftで書き直した事例を紹介します。
swiftUIで pull to refresh を実現するにはApple純正のrefreshableを使うのが一般的です。
ただし、私が開発しているアプリでは、この純正機能を使用することで、レイアウト崩れや予期しない動作が発生していました。
具体的には、リフレッシュした後にスクロールview の画面が下にずれる問題が発生していました(詳細はこちら: https://stackoverflow.com/questions/76943913/swiftui-scrollview-refreshable-doesnt-work-appropriately)
他にも対応している、アプリがiOS15以下も対応していたため、そもそもScrollViewのリフレッシュが使えない。
私のUIKit経験値が低いために、UIKitでのリフレッシュバグが起きた際に対応しきれなかった。
そのためswiftUIのみでcustomRefreshableを作ろうと思いました。
swiftUIで pull to refresh を実現するにはApple純正のrefreshableを使うのが一般的です。
ただし、私が開発しているアプリでは、この純正機能を使用することで、レイアウト崩れや予期しない動作が発生していました。
具体的には、リフレッシュした後にスクロールview の画面が下にずれる問題が発生していました(詳細はこちら: https://stackoverflow.com/questions/76943913/swiftui-scrollview-refreshable-doesnt-work-appropriately)
他にも対応している、アプリがiOS15以下も対応していたため、そもそもScrollViewのリフレッシュが使えない。
私のUIKit経験値が低いために、UIKitでのリフレッシュバグが起きた際に対応しきれなかった。
そのためswiftUIのみでcustomRefreshableを作ろうと思いました。
Swift Package Managerの登場により、iOSアプリにおけるライブラリの導入に大きな変化が起きました。
最近ではアプリ開発でもSwift Packageによるマルチモジュール開発の手法が確立しつつあります。
しかし、何も考えずにPackage.swiftを書いていると不要なライブラリがキャッシュに混ざったり、余計なビルド時間がかかってしまう場合があります。
本トークでは、個人でライブラリを複数リリースした経験とそのライブラリを実際に使ってアプリ開発を行ってきた経験を元に、Package.swiftを最適化するためのポイントを紹介します。
具体的には、以下の内容を解説します。
このトークを通じてビルド時間の短縮や不要なライブラリの混入を防ぐことでDX(開発者体験)の向上に寄与することを目指します。
Flutterを用いてモバイルアプリを開発する際には、
showModalBottomSheet
は必須の機能と考えます。
しかし、特定の要件や要求に対応するためには、showModalBottomSheet
だけでは不十分な場合もあります。
例えば
showModalBottomSheet
に関する情報を調べることが日常茶飯事かもしれません。そこで、今回はFlutterにおけるモーダルシートの基本について深く掘り下げ、
外部パッケージの紹介や、特定の要件に対応するためのモーダルシートの実装方法に焦点を当てて話していきたいと思います。
具体的には、以下の内容について説明します。
showModalBottomSheet
の内部実装の解説このトークを通じて、Flutterのモーダルシートに関する理解を深めていただけることを心から願っています。
WWDC2023でAppleが発表したObservationフレームワークは、オブザーバーパターンによりデータバインディングを高いパフォーマンスで実現することが可能なフレームワークです。
このセッションでは、昨年の発表以降におけるObservationの最新事情を探ります。また、今後iOS17以降をターゲットとするアプリでは、SwiftUI、Concurrency、Observationがデファクトスタンダードになることも踏まえながら、Observationの実践方法を紹介します。
【このセッションで紹介するトピック】
私は23新卒iOSエンジニアとしてChatworkに入社し、この1年で多くの対外活動に取り組んできました。
具体的には、
対外活動に取り組んでみると「日々の自分の活動をふりかえることができる」「自分の知見を共有することでフィードバックや思わぬ意見から学びが得られる」「さまざまな経歴を持った社外の方々と交流ができる」など、良いことがたくさんありました。
そして、通常業務と並行して対外活動に取り組むことで、自然と「通常業務での学びをイベントでアウトプット」 → 「アウトプットへの反応からの学びを通常業務に活かす」 → 「通常業務での学びをイベントでアウトプット」 …といったようなサイクルを回すことができたり、対外活動の取り組みが評価され、社内のアワードを受賞することができました。
このLTでは、僕が新卒1年に取り組んできた対外活動の経験を交えながら、そこから得られた学びや通常業務への学びの活用を共有し、対外活動に取り組む良さを紹介したいと思います。
iOS開発者にとって避けて通れない「アプリ審査」。
リリースには「新しい審査基準で審査が通るのか」「どのようなことが確認されるのか」といった疑問を抱えることが多いのではないでしょうか?
そこで、Appleでは審査プロセスをスムーズに進めるために「1 on 1 App Reviewコンサルテーション」を実施しています。
このセッションでは、私自身の経験を基に「1 on 1 App Reviewコンサルテーション」の詳細とその活用方法を紹介します。
具体的な手順や注意点を共有し、iOS開発者がアプリ審査の疑問を解消する手助けとなることを目指します。
「良いコードを書きたい!」というエンジニアの願いに応えるべく、このパンフレットではiOSアプリケーションの品質向上と保守性の観点から、Swiftデザインパターンを解説します。アンチパターンから堅牢な実装に改善する具体的な手法を紹介し、プロダクトの品質や開発効率に直結するデザインパターンに焦点を当てます。
【本編で紹介する予定のデザインパターン】
本編では、読者が実際のコーディング例を通じてSwiftデザインパターンの理解を深め、アプリケーションの品質向上に役立つベストプラクティスを得られるようにすることを目指します。このパンフレットが、開発者のスキル向上とプロジェクトの成功に貢献する貴重な情報源となることを願っています。
アプリ開発において重要な通信系処理ですが、OpenAPI Generatorを利用することで、OpenAPIのAPI定義書からクライアントコードを自動生成することができます。
このトークでは、OpenAPI GeneratorをKotlin Multiplatform環境で活用し、より効率的にアプリを実装する具体的な方法と工夫を紹介します。
以下のポイントに焦点を当ててお話します。
Kotlin MultiplatformでAndroidとiOSの開発を効率化したうえで、更に楽に実装できるようにしていきましょう!
近年注目度が上がっている生成AIですが、その中でもGitHub Copilotはコーディングをサポートするツールとして最も注目度の高いサービスの一つです。
GitHub Copilotは2024年2月にリリースされたGitHub Copilot Enterpriseや、現在開発段階で非常に注目されているCopilot Workspaceなど、より便利な機能が追加予定であり、今後デファクト・スタンダードになると私は期待しています。
しかし、このように注目されているGitHub Copilotですが、iOS開発においては少し盛り上がりに欠けているような印象があります。最も大きな理由としては、Xcodeが公式にサポートされていないためだと考えられます。
本セッションでは、GitHub Copilotの「Chat」機能に焦点を当て、Xcodeが公式にサポートされていない中でも使い方次第でとても便利なツールであることを実際のデモ動画などを交えて紹介いたします。
また、その他にも以下のトピックについてお話しいたします。
・ 弊社におけるGitHub Copilot普及のための取り組みとそのポイント
・ 全社的に実施したGitHub Copilot使用者のアンケート結果(全社/iOSチームの比較も紹介)
・ VScode(公式サポートエディター)とXcodeでできることの差