Swift Concurrencyは、WWDC2021で発表されたSwiftの言語に追加された大きな機能です。個人的な興味から、Swift ForumにSwift Concurrency Roadmapが登場して以来、40以上のスレッドを追っかけてきましたが、様々な機能やルールがあり、とても便利であるように見えるものの、学習コストは決して低いとは言えず、使いこなすのはかなり大変になるのではないかと感じています。
そこで、今回は、みなさまと一緒に、Swift Concurrencyの世界へ最初の一歩を踏み出したいと思い、このプロポーサルを出しました。
このトークでは、これからSwift Concurrencyを学ぶために
など、Swift Concurrencyのなぜ?や何?を見ていきたいと思います。
また、WWDC2021の時点では機能が完全に揃ったわけではなく、WWDC2021の後も議論は継続しており、現在も色々な変更が入っています。そういった変更点などにも触れていきたいと思います。
Swift Concurrencyの世界はとても壮大ですが、まず一歩、新しい世界へ一緒に踏み出してみるのはいかがでしょうか?
iPhone 12 Pro 以降に搭載されたLiDARスキャナにより、
ARだけでなく、カメラのオートフォーカス(以下AF)性能が飛躍的に向上しています。
特に、画像から距離情報を取り出すタイプのAFが苦手とする
暗所での撮影において、非常に高速なAFが実現されています。
この講演では、LiDARスキャナを利用したシンプルなAFと、
対象物の背景にぼかしを作る機能を盛り込んだカメラアプリを作成し、コードを中心に解説します。
AF自体はiOSに標準搭載されていますが、自分で作ってみることでAFとLiDARの理解を深めることができます。
この講演では、以下のトピックを中心にお話しします。
・各AF方式の簡単な説明
・暗所での性能比較 (iPhone12 Pro / iPhone11)
・LiDARによるオートフォーカス機能の実装方法
・背景ぼかし機能の実装方法
・動画によるデモ
・実装が困難だったところとその解決方法の提案
私たちは常日頃、日付や時刻、時間、数字、名前などを表示するために、最終的に様々な情報を String に変換しています。
その際に便利な API が Formatter です。Date を String にする DateFormatter が良く使われる一例ですが、実は真の力はそこにとどまりません。
数字を3桁おきに 「,」を入れた表示をしたい
「0.85」を「85%」と表示したい
「-1700」を「(1,700)」と表示したい
1日前を「昨日」、1ヶ月後を「来月」と表示したい
[“Apple”, “Banana”, “Orange”] の Array を「Apple, Banana and Orange」と表示したい
…これらを実現するために独自で実装を行っていませんか?
コーディングのトレーニングのために独自実装する分には問題ありませんが、実プロダクトでは工数がかかり、考慮漏れがあると問題になります。しかし大抵は対応する Formatter が標準で用意されています。
日付、時刻、時間、%、通貨、指数表記、バイトサイズ(MB、GB…)、人の名前、加速度、角度、面積、体積、質量、濃度、期間、電気、エネルギー、周波数、燃費、照度、長さ、圧力、速度、温度…
これらの Formatter は i18n 対応を含めて強力にサポートしてくれますが、1つの言語のみに対応する場合でも Formatter を使うべきです。言語は同じでも地域によって適切なフォーマットが違う場合があるからです。
このセッション(40分版)では標準で用意されている Formatter のすべてと、その使用例、絶対にしてはいけない使い方を紹介します。
誤った使い方をすると、あなたも「令和2021年」に飛ばされますよ…
Happy Formatting!
アプリケーションの体験にはUIがザラつかない・カクつかないことは重要です。
Xcode12ではInstrumentsにAnimation Hitchesが追加され、WWDC21でもスクロールパフォーマンス関連のセッションがありました。この手のアップデートは毎年のようにあり、Appleも力を入れています。
本トークでは、UIが描画されるまでの基本的な原理を紹介し、その後描画を軽くするための実践的なテクニックを紹介します。
残念ながらUIKitは内部動作を知ることができないため、基本原理はFlutterを通してMetalの動作を覗くことで紹介します。実践的なテクニックはUIKit(やSwiftUI)で使えるものを紹介します。
主な題材として影の描画を取り扱う予定です。
ヤプリはアプリの開発・運用・分析をノーコードで提供するアプリプラットフォームです。
豊富な40以上の機能と外部サービス連携で、優れたユーザー体験を提供しており、
アプリ制作を非エンジニアが行うことが可能です。
本セッションでは、エンジニアが手を動かさなくてもストア申請までできるようにした自動化の仕組みや、
複数のアプリを作れる仕組みだからこそ直面する開発時の課題やアプローチについてご紹介します。
樫原 @kashihararara と共同でお話します。
Wantedly では 2020年からモバイルアプリのロジック部分のクロスプラットフォーム技術として Kotlin Multiplatform Mobile (KMM) を採用しています。これまでは iOS ネイティブ のコードに加えて 一部の画面で React Native を利用していましたが、React Nativeのメンテナーが不在になり負債化し、代替手段として KMM を部分的に導入し始めました。
KMMは、iOSとAndroidのビジネスロジックを単一のコードベースで共通化するモバイルSDKです。UIの共通化はせずにビジネスロジックだけを共通化し、UIはプラットフォームに最適な形で提供できます。
本トークでは Wantedly が KMM を利用し始めて約1年の運用を経て得られたメリットと、導入に際して様々なつまづき・iOS アプリエンジニアから見て障壁が高かった部分などを赤裸々に語っていきたいと思います。
対象者
数億人のユーザがコミュニケーションに利用するLINEアプリの開発チームでは、モバイルプラットフォームのアップデートに合わせて組織横断のタスクフォースを毎年立ち上げて開発を行っていました。 今年はさらにこういったモバイル体験向上の取り組みを進める為に、モバイルエクスペリエンス開発室を立ち上げました。iOS/Androidヘの新機能対応や、LINEアプリを複数のデバイスで利用する際の体験向上、モバイルプラットフォーム特有のビルド環境改善に取り組んでいます。
本セッションでは、立ち上げの背景から具体的な取り組みについてご紹介します。
UICollectionView を利用してレイアウトを実現する際の選択肢は下記のように複数存在します。
また、アニメーションの複雑度やセルの更新頻度によっては、
DataSource実装に DiffableDataSource やサードパーティー製の RxDataSource を利用したいことがあります。
これらをレイアウト実装と組み合わせて要求されたデザインを実現することになりますが、
複数の選択肢があるため要求を満たすための最適な組み合わせに悩む場合があるかと思います。
そこで、本トークでは具体的なレイアウトの事例を基にケースを明文化した上でそれぞれの最適な利用パターンを提供します。
みなさんMultipeer Connectivityをご存知ですか?Multipeer ConnectivityはAirDropでも利用されているWi-FiやBluetoothを利用した近距離でのpeer-to-peer通信を実現するフレームワークです。AirDropの登場とともに公開されたこのフレームワークですが、実践導入されている機会は少ないように思います。
私は現在Multipeer Connectivityを使って端末間で撮影している動画のプレビューや動画ファイルの転送をするモバイルアプリを開発しています。このトークではMultipeer Connectivityの概要や実践導入した理由、実際に開発を進めていくにあたって工夫した点、現在抱えている課題などについてご紹介したいと思います。
何かと距離が求められる今だからこそ、近距離通信の世界を覗いてみませんか?
iOS 14で追加されたウィジェット機能により、ホーム画面でアプリの機能を直接提供できるようになりました。
ユーザーとの接点を増やせるウィジェットはとても魅力的で作りたいアイデアが色々と湧いてきますが、
現在のWidgetKitでは実現の難しい動作が意外にあり、期待する体験を提供できないことがあります。
また、WidgetKitは電池の消耗を抑えるためにウィジェットの更新タイミングに制限があります。
これを曖昧にして実装してしまうと、ウィジェットが更新されなくなったり、無駄な通信が行われたりしてしまうので注意が必要です。
このトークではいくつかのウィジェットを実装したり、仕様レビューをする中で見つけた、ウィジェットで良い体験を提供するために必要な知識とテクニックをウィジェットの動作のしくみとともにお話します。
Date型はとても原始的なクラスで地球上の時間の一点を表現します。
例えば、Date(timeIntervalSince1970: 1631836800)は
このようにタイムゾーンによって表示上の日付や時間は変わってしまいます。
なので、誕生日などを表すときやサマータイムなどを考慮した時間計算にDate型は適していません。
DateComponents型はこういった悩みを解決してくれます。
日付計算においてDateComponents型はDate型よりも直感的で、使いやすいものになっています。
DateComponent型の使い方を学び、Date型に苦しめられるのとはおさらばしましょう。
WWDC2020にて華々しくデビューしたApp Clipsですが、それから1年過ぎた現在においてはあまり見向きをされていないような印象があり、少し寂しく思うところです。
(というか、正直誰もApp Clips の話をしていない気がするのですが、私の周りだけでしょうか...)
そのようなわけで、この発表ではより多くの人に App Clips の魅力や伸び代をお伝えすべく
・App Clips が目指したかった(と思われる)もの
・App Clips にできること
のおさらいをしつつ
・App Clip をビルド、テストできるようになるまで
・iOS向けSDK の App Clip 対応時のTips
・App Clips が今後できるようになる(と思われる)こと
などについてもお話しします。
UITableViewはもう捨てましょう!SwiftUIのGridビューはまだまだUICollectionViewの力に追いついていません!
近年、UICollectionViewが激変し、飛躍的なパワーアップをしているので、最新の機能と使い方をまずおさらいします。また、今までの技術背景を説明した上でSwiftUIのGridやListと比較して、どのときにどのAPIを使えば良いかがわかるように説明します。そして、UITableViewがなぜiOS 14から特に存在意義が薄れていて、そのUIKitのキープレーヤーだったビューに「さよなら」と言う時期がなぜ近づいていそうかについても解説します。
近年の追加内容は以下のとおりですが、日々の開発でなかなか覚えきれないほどたくさんの機能やきめ細かな設定があるので、簡単に紹介して、UICollectionViewを保守しやすい形で最大限に活用できるように支援します。
私たちのチームは、SwiftUIで実装したPOSレジアプリ「STORES レジ」を今年6月にローンチしました。
「SwiftUIは破壊と再構築を繰り返すプロダクトに強い」
これは、リリースまで1年以上何度もプロトタイプのUIを刷新し続けてきた今だからこそ実感する、SwiftUIの大きなアドバンテージの1つです。
また、モバイルアプリはUIデザインだけでなく、外部要因により変更を余儀なくされる部分が多数存在します。
本トークではこういった課題に対して、主にSwiftUIやGraphQLが「変更」に対してどう効果的に働いてきたのかを、実例を交えて紹介します。
コンテンツ
聞き手の想定
ローカライゼーションを念頭に置いてAppを構築することは重要ですが、規模が大きくなればなるほどデザイナー・プロダクトマネージャー・デベロッパー間の莫大なコミュニケーションコストがかかります。Xcodeでアップルが提供する標準的なローカライゼーション方法は優秀ですが、大規模なアプリ開発はそれだけでは解決できない様々な問題が存在します。
「GO」を開発しているMobility TechnologiesのiOS開発チームでのレガシーな文言管理でぶつかった課題と、プロダクトチームメンバー間のコミュニケーションコストを減らすため、より専門的なローカライゼーションプラットフォームを導入することになった経緯を紹介します。
そして
1. Japantaxiアプリのローカライゼーション(with Poeditor)、GOアプリでのローカライズ課題
2. Lokaliseとは、 OTA配信、Rest apiよる文言連動
3. Phraseとは、文言のFigma / Sketch 連動
4. GOで導入することになったプラットフォームの話と、それによりできること・メリット・解決できた課題
クラッシュが発生して、原因が分からないとかなしくなりますよね。
このトークでは、配信アプリで使用している Broadcast Extension 上で発生したクラッシュの詳細について、クラッシュ発生時のスタックトレースを取得して解析し、複数のクラッシュの修正に繋げた話をしようと思います。
クラッシュが発生した際、以下のようなスタックトレースを取得することができます。
0 broadcast 0x0000000100fa8b6c broadcast + 183148
1 libsystem_platform.dylib 0x00000001f8a0a290 73F3E459-0F82-3377-A7D1-EF05CAE41C0A + 21136
2 AVFAudio 0x00000001bf5e9e18 53161832-5A1C-3C33-AF53-6816B1D1C2C5 + 441880
...
スタックトレース、クラッシュした端末のアーキテクチャの情報、対応する dSYM ファイルを組み合わせると、クラッシュが発生した箇所を詳しく調べることができます。
この集計は Command line tools for Xcode を使用するのですが、手作業では1行づつしか解析できず、処理も時間がかかります。そこで、キャッシュによる高速化や解析結果の集計のために、専用の mac アプリを SwiftUI で作成しました。
上記の取り組みにより明らかになったクラッシュ情報を用いて、発生していた3割のクラッシュを修正し、プロダクトの改善に繋げることができました。
家で過ごす時間が増えた今、iPadなどで動画コンテンツを楽しむ機会が増えた方も多いのではないでしょうか。
コンテンツ保護はクリエイターや作品を守るのにとても重要なものです。Appleのプラットフォームで動画を再生するクラスであるAVPlayerは、かつてのQuickTime APIを置き換える形で登場し、以降現在に至るまで機能の充実、拡張、ブラッシュアップが続けられ、時代とともに高品質化する動画形式をサポートし、時にはHLSのように自ら仕様を牽引しながら成長を続けてきました。コンテンツ保護機能についても例外ではなく、WWDC15でDRMとして紹介されたFairPlay streamingを扱うAPIは今や成熟し、昨今の高品質な作品を楽しめる世界の実現に一役買っています。
このトークではAVPlayerの持つコンテンツ保護の仕組みについて幅広く解説します。一言でコンテンツ保護と言っても、トピックは再生や配信だけでなく、ダウンロードやAirPlayなどさまざまです。普段から利用することはない方が大半だと思いますが、いつも楽しんでいる動画を支える技術について「へ〜、そうやって動いているのか」と感じていただき、知識のストックとして役立てていただければ幸いです。
iOSアプリを作成する上でこれってセキュリティ上大丈夫だろうか?
セキュリティ上どういうところが危ないんだろう?って思ったことないでしょうか。
iOSアプリを作成する上でセキュリティ上気をつけた方が良い基礎を紹介します。
コンテンツ(予定):
・通信する上で気をつけた方が良いこと
通信の暗号化とSSL証明書、ATS対応
・URLスキームの脆弱性
URLスキームであり得る複数の攻撃手法と対策
・ハードウェアへの重要情報をどこに保存すれば良いの?
Keychain、UserDefaults、ファイル保存などの保存方法とセキュリティの違いについて
・認証って何?
OAuthなどのいくつかの認証フローの仕組みについて
今秋リリース予定のSwift 5.5には、async/awaitやactorなどの並行処理関連の新機能が多く含まれます。これによって、iOSアプリ開発における非同期処理や並行処理のコードは劇的に変化します。本トークでは、iOSアプリ開発でよく見かけるようなケースを取り上げ、Before & Afterのコードを示し、何がどのように変わるのかを説明します。
async/awaitやactorは使いこなせばとても便利ですが、新しい概念を初めから抽象的に学ぶのは大変です。しかし、それらが解決しようとしている問題自体はiOSアプリ開発者にとって馴染み深いものです。async/awaitやactorで書くコードが既存コードのどのような処理に対応するのか、既存コードにはどんな問題があり、async/awaitやactorはそれをどう解決してくれるのか、具体的なケースで学べば入口のハードルはぐっと下がります。
Swiftの並行処理関連の新機能は、async/await、async let、Task、CheckedContinuation、actor、Sendable、MainActorなど多岐に渡ります。それらを一つ一つ取り上げ、具体例を題材に、iOSアプリ開発のコードがどのように改善されるのかを説明します。
Swift Package Manager(以下Swift PM)はXcodeに統合された公式のパッケージマネージャーです。
CocoaPodsやCarthageのように、他の方が作ったライブラリを導入・管理することができます。
しかし、Swift PMが管轄するのはライブラリに留まりません。
Xcodeと組み合わせることにより、アプリのプロジェクト構成を柔軟に変更することができます。
特別なツールを利用することはありません。これまで開発者を苦しめていたXcodeプロジェクトファイルのコンフリクトを解消するだけでなく、
マルチモジュールにおけるFrameworkの参照やリンクといった、手動で設定するには面倒な項目も簡単にセットアップできます。
このトークでは、まず、Swift PMをまだ利用したことがない方に向けてSwift PMの基本的な事柄をお話しし、Swift PMでのライブラリ管理をお手元のプロジェクトで利用できるようにします。
次に、Swift PMをアプリ開発のプロジェクトに導入することで、Assetsやローカライズファイルを含むほとんどのソースコードの管理をSwift Packageに移管する方法をお話しし、Xcode Projectの責務を軽くします。
そうして身軽になったXcode Projectを、今度は複数作ってみて、マルチプロジェクト・マルチモジュールな構成を実現します。
この構成により得られる素敵な特典と移行のやり方についてもお話しし、明日からみなさんのプロジェクト構成をアップデートしてもらうことを目指します。