iOSDC Japan 2021 トーク一覧

採択 他イベントOK 2021/09/18 11:30〜 Track D レギュラートーク(40分)

App Store用スクリーンショットの自動生成をアラビア語対応してSwiftUIで実装してみた

ainame 生井智司 ainame

みなさんがApp StoreでiOSアプリを探す際には必ずスクリーンショットを見てUIの良し悪しやアプリの機能などのイメージを掴んでからアプリをダウンロードするのではないでしょうか。App StoreのスクリーンショットはiOSアプリを運営していく上で重要な要素です。アプリの対応言語が1言語の場合は、デザイナーが1から丁寧にデザインして仕上げてくれたものを利用することも多いかと思いますが、これが言語の数や対応画面サイズが増えていくと、その必要数が爆発的に増え、対応コストが跳ね上がることになり人手での定期的な更新は難しくなります。

既知の解決策としてfastlaneというツールのsnapshotとframeitを利用することで、ある程度決まった定番のデザインでこのスクリーンショットを自動生成することが出来るのですが、とある理由から私が業務で開発しているアプリ(20カ国・言語以上のApp Storeのローカライズ対応済み)では採用出来ませんでした。それはframeitではRTL(Right-To-Left)言語であるアラビア語などが対応していなかったことや言語毎のフォントの準備やサイズの調整が難しかっためです。

この発表ではApp Store向けのスクリーンショットを多言語化して運用していく上での課題となる点を触れ、snapshotとframeit相当の処理を自前のSwift製のCLI実装する際に得た知見や、SwiftUIを画像のレンダリングエンジンとして活用する利点などについて紹介したい思います。

他イベントOK LT(5分)

文系卒・開発未経験から2年で500万DLアプリのメインエンジニアになったので振り返ってみた

aviciida 飯田 諒 aviciida

理系科目が大の苦手で文系の大学に通い、
プログラミングスクールに通うもrailsが全く身に付かず卒業(挫折)し、
「エンジニアは自分には向いてない」と思っていた自分が、
株式会社mikanに入社しiOS開発をはじめてから2年が経ちました。
今は、500万DLを突破した英単語アプリmikanのiOSチームのリーダーとして日々開発しています。

このトークでは、
Classの概念もわからない、全くの未経験だった自分が(もちろんまだまだ未熟ではありますが)、iOS開発を学んでいった過程を振り返り、学んで良かったことや、必要なマインドセット・環境について話したいと思います!

  • スクールで挫折した時と、うまくいった今回との違い
  • 教えてもらって/やらせてもらって よかったこと
  • 爆速で成長していくために必要なこと
3
他イベントOK レギュラートーク(20分)

開発未経験者が2年で500万DLアプリのメインエンジニアになった話

aviciida 飯田 諒 aviciida

理系科目が大の苦手で文系の大学に通い、
プログラミングスクールに通うもrailsが全く身に付かず卒業(挫折)し、
「エンジニアは自分には向いてない」と思っていた自分が、
株式会社mikanに入社しiOS開発をはじめてから2年が経ちました。
今は、500万DLを突破した英単語アプリmikanのiOSチームのリーダーとして日々開発しています。

このトークでは、
Classの概念もわからない、全くの未経験だった自分が(もちろんまだまだ未熟ではありますが)、iOS開発を学んでいった過程を振り返りながら、
エンジニア未経験・初心者の方の勇気が出る/役に立つような話はもちろん、
「こういうことを任せてもらったのが良かった」のような、未経験・初心者の方々を教育する立場の人向けの話、
「こんなポテンシャルのある人は未経験・初心者でも採用できるかも」のような、採用する立場の人向けの話もできたら良いなと思っております!

  • そもそもなぜiOS開発を学び始めたのか
  • 大企業ほど教育体制が整っていない環境で、どのように開発を学んだか
  • 難しかったこと
  • 失敗したこと
  • スクールで挫折した時と、うまくいった今回との違い
  • 教えてもらって/やらせてもらって よかったこと
  • 爆速で成長していくために必要なこと
1
採択 他イベントOK 2021/09/17 17:30〜 Track C レギュラートーク(40分)

運用6年目・500万人が使うアプリのDBをSQLiteからFirestoreに移行した話

aviciida 飯田 諒 aviciida

「Firestoreの導入を検討しているけど、実際どうなんだろう...?」
「導入事例は、新規アプリとか個人アプリばかりで、大きめのアプリで話はあまりないな...」
と思っているみなさまのためのトークを用意しました。

株式会社mikanでは、2020年夏ごろから9カ月以上の時間を費やし、
英単語アプリmikanのiOS版のクライアント側で使用しているDBを、SQLiteからFirestoreに移行しました。
(現在Androidも移行中です)

このトークでは、9カ月を超えるプロジェクトを振り返り、

そもそもなぜDBの移行が必要だったのか、どんなことに失敗して、どんなことはうまくいって、
同じようなこと企む方々が少しでも僕たちよりもうまくできるようにするためには何を意識すればいいか、という話、
そして、そもそも何故SQLiteを使っていたの?なぜFirestoreを選んだの?実際に使ってみてどう?みたいな部分も赤裸々に話していこうと思います!

  • なぜSQLiteからFirestoreへ移行したのか
    • SQLiteが採用された歴史的経緯
    • SQLiteのツラミ
    • Firestoreを採用した理由
  • 移行によって変わること
    • スタンドアローン型DB→ネットワーク型DB
    • RDB→KVS
  • どのように移行を進めたのか
    • ダブルライト
    • マイグレーション
    • クライアントロジックの移行
  • うまく行ったこと
  • 難しかったこと
  • 実際Firestore使ってみてどう!?
  • プロジェクトをやってみての学び・同じことを考えている人へのアドバイス
他イベントOK レギュラートーク(20分)

CI/CDを使ってTestFlightで開発中のアプリをバンバン配布しよう

saten_work saten saten_work

Apple Developer Enterprise Programの審査も通り辛くなった昨今、Apple Developer ProgramのAdhocのみだとiPhone登録数最大100台の制限がありTestFlightを利用したりすることも増えたのではないでしょうか。
しかし、TestFlightで配布するために、アップロード済みのビルドバージョンを意識して修正したり、ローカルのXcodeでアーカイブしたり、テストの詳細を入力してどのテストのアプリかわかるようにしたり手間でないでしょうか。
今回は、ビルドバージョンの修正・TestFlightでの配信・テストの詳細の入力をCI/CDで自動的にすることで、開発中のiOSアプリもバンバンTestFlightで配信し、QAや企画、Webエンジニア、デザイナーなどへの簡単なiOSアプリ提供を実現する方法を紹介します。

8
採択 他イベントOK 2021/09/18 13:30〜 Track E レギュラートーク(20分)

StoreKit のこれまでとこれから

uzzu uzzu uzzu

StoreKit はアプリ内課金を実現するためのフレームワークです。StoreKit の API は取り扱いが難しく、難しいが故に 3rd party のライブラリを介して利用したり、いざアプリに組み込んだ際には考慮漏れや原因の特定が困難な不具合に苛まれる事があったかと思います。

そんな中、 WWDC21 にて Apple より StoreKit 2 の発表がありました。 API は刷新され、非常に取り扱いやすくなりました。本セッションでは、これまでの StoreKit の API の取り扱いの難しさを振り返りながら、 StoreKit 2 でどのように変わるのかを解説します。

採択 他イベントOK 2021/09/19 16:45〜 Track A LT(5分)

Using Eigen from Swift (via C)

taketo1024 さのたけと taketo1024

Eigen は高速な行列計算を行うための C++ ライブラリで、ヘッダのみで構成される純粋なテンプレートライブラリです。

現時点では Swift は C++ と直接連携できないので、Swift から Eigen を使うには C または Obj-C でブリッジする必要がありますが、 Linux でも使えるようにするには Obj-C は選択肢から外れます。

また Eigen はテンプレートライブラリなので、「Swift 側の Wrapper 型も係数に関して generic にしたい」(× EigenIntMatrix, EigenDoubleMatrix, … / ○ EigenMatrix<Int>, EigenMatrix<Double>, …)という欲求も生まれます。

この LT では、両立が難しそうな二つの課題:

  • Eigen を Swift から C を経由して使うこと
  • Wrapper の行列型を generic に実装すること

の解決法を紹介し、私が数学の研究のために行っているホモロジー群の計算を高速化した事例を紹介したいと思います。

他イベントOK レギュラートーク(40分)

こんな時代だからこそCoreDataを見直そう

coffeegyunyu 日向強 coffeegyunyu

WWDC 21ではSwiftUIの更なるサポートやCloudKitの連携など、Core Dataに関する多数のセッション動画が掲載されました。
これはもうCoreDataを始める機運に他なりません。

本セッションでは、iOSにビルドインされているCoreDataならではの数々のメリットを挙げていって、ローカルデータベースとiOS間の開発を楽にするための説明を行います。

  • 画像データなどを、モデル上はDataで保存して、中身はファイルで保存するAllows External Storage
  • SwiftUIとの連携
  • Diffable Data SourceをサポートしてUITableView/UICollectionViewの実装を楽にする
  • mergePolicyを使って、スレッド間のデータベース変更に対応する

などなど、他のフレームワークとは異なる、iOSのために用意された機能を説明して、CoreDataに対する皆さんの誤解を解くためのセッションになります。

5
他イベントOK レギュラートーク(20分)

さまざまなプラットフォームでのSign in with Appleのセキュリティ

coffeegyunyu 日向強 coffeegyunyu

WWDC19で発表されたSign in with Apple。
レビューのガイドラインにも要件によっては実装必須と追記され、実装した人も多いのではないでしょうか?

iOS 13ではAuthenticationServicesフレームワークのASAuthorizationAppleIDProviderで簡単に実装できるSign in with Appleですが、iOS 12にはASAuthorizationAppleIDProviderがありません。
また当然AppleプラットフォームではないAndroidなどにもSDKのサポートはありません。

このセッションでは、iOS 12以下や他プラットフォームなど、SDKのサポートがない環境でどのようにSign in with Appleを実装するか、またセキュリティに気をつけるためにはどのような実装をすればよいかを考察していきたいと思います。

  • さまざまなプラットフォーム対応
    • iOS 12
    • Android
    • Web
  • stateの実装
  • nonceの実装
2
他イベントOK レギュラートーク(20分)

自動プッシュ通知エコシステムをAWSと連携させて1からつくる

西川 哲矢

アプリ溢れる昨今、プッシュ通知はユーザーにコンテンツを届けるために重要な機能です。魅力的なプッシュ通知のためには、ユーザーに最適化させた内容であることは重要で、サーバー上のデータと連携したプッシュ通知が望まれます。

ですが、サーバー上のコンテンツやユーザーのデータは膨大で完全人力の実現は困難。エンジニアの自分は自動化したくなります。

そこで私たちは、AWSを起点にした、イベント駆動型アーキテクチャの自動プッシュ通知システムを構築しました。本トークでは、設計面での技術選定のポイント、テスト戦略、そしてグロースに必要な追跡/分析/異常検知のシステムについての工夫についてお話しします。

2
採択 他イベントOK 2021/09/17 19:50〜 Track A レギュラートーク(20分)

SwiftUI で実プロダクトを音速リリースした話

AkkeyLab AkkeyLab AkkeyLab

寄付体験を身近にすることを目指して開発されたアプリ「dim.」

・SwiftUI 95%以上
・エンジニア1人
・開発期間2ヶ月
・リリース前に大きな仕様変更を2回行う
実はこんな条件下で生まれたアプリです。

皆さんご存知の通り、SwiftUI はまだ実用レベルに達していないと言っても過言ではありません。が、実体験を元に「実用レベルに達していない」と口にしているエンジニアはどれほどいるでしょうか。
SwiftUI が未熟だという周りの声を鵜呑みにして逃げているだけではないですか? SwiftUI を採用しない理由を明確に説明できることは非常に重要です。なぜなら、 SwiftUI が適している要件にも敏感に反応できるようになるからです。
このトークでは主に以下に関して実例と共に SwiftUI の現状をご紹介いたします。

・SwiftUI 採用の理由
→キーワード:チーム開発, デザイナー
・2回もの大型仕様変更への高速対応を可能にした SwiftUI レイアウトテクニック
→キーワード:Modifier, XcodePreviews
・粘ったけど、UIKit に浮気せざるを得なかった TextField
→キーワード:最小限に抑えた UIKit 利用術
・油断禁物! SwiftUI 未対応ライブラリ達
→キーワード:Firebase, 計測ツール

このトークにより、SwiftUI をチームで採用するための説得材料を手にすることができます。また、 SwiftUI による開発方針を「チーム」という広い視野で考える“きっかけ”になるでしょう。

他イベントOK LT(5分)

今更人には聞けないSwiftのSyntax sugar

417_72ki 417.72KI 417_72ki

同じ処理をより分かりやすい記法で書いたコードのことをSyntax sugar(糖衣構文)と呼びます。
例: if let と Optional chaining

Swiftも年々更新されていく中で様々なSyntax sugarが生まれ、より読みやすいコードが書きやすくなっています。

ここでは、そんなSyntax sugarを頻出度・役立ち度の観点から時間の許す限り紹介します。

4
他イベントOK レギュラートーク(20分)

アプリのアクセシビリティを向上させるには何をしたらいい?網羅的なチェックと実践方法を紹介

RyoAbe RyoAbe RyoAbe

アプリのアクセシビリティを向上させるためには何をすればいいでしょうか?
VoiceOver、Dynamic Type、コントラスト比の確保...どこから手を付けたらいいか、どのように修正を入れたらいいか難しいですよね。
本セッションでは「モバイル版アクセシビリティチェックリスト」という50項目以上にもなる網羅的にアクセシビリティチェックが可能なシートについてご紹介します。これはfreeeアクセシビリティー・ガイドラインをベースに作成したシートで、「チェック内容、優先度、修正方法、ガイドライン等」がリスト化されており、順にチェックすることで修正が必要な箇所の洗い出しと、チェック項目ごとの具体的な修正方法が分かります。

実際にチェックしたアプリのチェック結果も交えながら、チェックリストの利用方法はもちろん、今から始められるアプリのアクセシビリティ向上のテクニックもご紹介いたします。

4
採択 他イベントOK 2021/09/18 11:30〜 Track B レギュラートーク(40分)

日本語でもいい感じに改行したい!!

trickart4121 trickart trickart4121

iOSアプリ実装中、「単語の途中で改
行されてしまう…」といった経験はありませんか?
そういったとき、英語の文章であればlineBreakModeに.byWordWrappingを指定してあげれば単語中の改行は起きなくなりますが、日本語の場合は効果がありません。

このセッションでは日本語の文章でも単語中の改行をさせない方法を解説します。

  • NSLineBreakModeについて
  • 日本語の扱い
  • 制御文字について
  • どう単語を検出するか?
  • MeCabによる形態素解析
  • MeCab for Swift Package
採択 他イベントOK 2021/09/18 14:50〜 Track A レギュラートーク(40分)

Combine を使ったコードのテストを Scheduler で操る方法とその仕組み

kalupas0930 アイカワ kalupas0930

WWDC は async/await で盛り上がっていて Combine ロスなので、Combine について発表したいと思います。

Combine は複数のイベントを扱うのが楽だったり、debounce operator などを利用した時間を制御するような処理も容易に記述できるので、有用なシーンはまだまだあると個人的には思っています。
しかし、Combine を使って時間の制御などを行い始めるとテストが難しくなっていきます...

このトークでは、そんな Combine を使ったコードのテスト方法と仕組みについて以下のような内容で発表したいと思っています。

・ViewModel 内で Combine を利用するコードの基本的なテスト方法
・combine-schedulers というライブラリによって Combine の時間を操りテストを劇的に改善する方法(より正確なテスト・テストの実行時間の削減が可能)
・combine-schedulers の仕組み

発表で紹介させて頂く combine-schedulers は、最近話題になっている The Composable Architecture(TCA) や isowords の作者である Point-Free さんが作っているライブラリで、TCA との相性も良かったりします。

しかし、このライブラリは TCA には依存しておらず、TCA を利用していないコードでも十分に効果を発揮できるものになっています(本トークも TCA に依存しない形式にします)。

さらに、このライブラリには他にも様々な機能があります。
特に UIKit や SwiftUI のアニメーションを操る機能もあるのですが、時間に余裕があれば紹介させて頂きたいと思っています!

他イベントOK レギュラートーク(40分)

tvOSで犠牲者を出さないためのAVPlayerViewController

coffeegyunyu 日向強 coffeegyunyu

iOSで動画を再生させるためには何をお使いでしょうか?
動画再生手段の一つであるAVPlayerViewControllerは、動画表示と動画用のコントロールパネルがビルドインされている、大変便利なクラスです。
そしてAVPlayerViewControllerはtvOSでも利用でき、さらにiOSに輪をかけて様々な機能が搭載されています。

その、搭載されている機能についてはまだまだ知見が少ないものが現実です。
そんなAVPlayerViewControllerの機能について、tvOS独自の機能を交えながらハマった罠などを挙げつつ解説していきます。

  • customOverlayViewController
  • contentOverlayView
  • externalMetadata
  • 動画にスキップできないCM部分を挟む

動画サービスの群雄割拠の時代、iOSおよびtvOSでの動画の扱い方を説明しつつ、少しでもtvOSアプリ開発者増加を目論むセッションです。

4
採択 他イベントOK 2021/09/18 14:50〜 Track C レギュラートーク(40分)

Mediapipeを使ったARアプリ開発事例〜カメラをかざして家の中で売れるものを探そう

Chica Matsueda

近年、高性能なサーバーではなくスマートフォンなどのモバイル機器上で機械学習モデルの推論を走らせる、EdgeAIと呼ばれる技術の開発が進んでおり、 TensorFlowLite/MLKit/CoreML/MediaPipe をはじめ様々なモバイル端末向けの推論ライブラリが開発されています。

メルカリでは、動画などストリーミングメディアの推論に特化した MediaPipe というGoogle製のOSSの活用して、カメラをかざすだけで家の中にあるアイテムがいくらで売れるのか知ることができる、「かざして売れるかチェック」という機能を提供しています。

このトークでは、この機能が開発されるまでに遭遇した困難とその解決方法を、大きく3つのトピックに分けてお話していきます。

  • BazelでBuildされるMediapipeをiOS Frameworkとして提供する方法
  • 推論の計算負荷を減らし、電池消費を抑える工夫
  • モデルサイズを小さくしてダウンロードサイズを抑える工夫
他イベントOK レギュラートーク(20分)

GitHubリポジトリを分割してらくらく新機能開発をFlutterでやってみる!

D_R_1009 Koji Wakamiya D_R_1009

既存のアプリをメンテナンスしつつ、新機能開発するのに苦心していませんか?
数ヶ月マージされず、コンフリクト解消がだんだんと辛くなる新機能ブランチ。数十から数百ファイルに影響が出てしまい、レビューするのも一苦労。フィードバックを貰うために配布したアプリも、緊急バグフィックスのために配信したアプリに流されて見つからない……。

Portoというアプリで追加した「新書籍ビューアー」はそんな問題を解決するため、GitHubリポジトリを分割し、社内向けUIライブラリとして新機能を開発する方法に取り組みました。
するとエンジニアチームもディレクターチームも満足、さらに社内で新たにFlutterに挑戦する機会を作る効果まで得ることができました。

このトークでは(Flutterをベースとしますが)新機能開発のつらみを整理しつつ、どのような方針を立て、そして対応したかを紹介します。

他イベントOK レギュラートーク(20分)

【TCA】書きやすくて分かりやすい!Reducerのテストの基本

k191k アマゾネスいけばた k191k

皆さん、テスト書いてますでしょうか?
私は、「テストって何をすればいいかわらない」「なんだかめんどくさい」等の理由でテストを書く事から逃げていたのですが、TCAのReducerのテストを書いてみたところ、とても書きやすくて分かりやすいと感じたので、そのことについてお話しようと思います。

このトークでは、TCAのReducerのテストの基本的な実装方法や検証内容についての内容を知ることができます。

具体的な内容は以下です

  • TCAとReducerの簡単な説明
  • テストしたいことの説明
  • テストの書き方
  • テストがエラーになったとき
  • テストを書いてみた感想

ぜひ、TCAに興味がある方や、これからテストを書いていきたいと言う方に聞いていただき、何か参考になればと思っています。

4
他イベントOK レギュラートーク(20分)

SwiftUIで広告生活

coffeegyunyu 日向強 coffeegyunyu

iOS 13より実装されたSwiftUI。
すでにアプリのサポートもiOS 12を切ったのでUIKitから移行したいと思う方も多いんじゃないでしょうか。

そんな中ネックになるのがUIKitでの実装前提となっている広告周り。
巷にはSwiftUIで広告を実装する例などもちらほら見かけますが、広告は単なるバナー表示や動画広告表示だけでなく、
ユーザーに不要な広告をミュートにさせたり、なぜこの広告が表示されるかを説明する画面を新たに表示したり、
広告の機能は多岐にわたります。
そんな広告の機能を正しくSwiftUIで実装するにはどうしたらいいか、をAdMobを例にして説明するセッションになります。

  • 各種広告の種別ごとの実装
    • バナー
    • 動画広告
    • ネイティブ広告
  • SwiftUIでUIViewControllerを使う
    • UIApplication.shared.windows.first.rootViewControllerは使ってはいけない
  • Appendix
    • AdMobでATT対応
    • AdMobでGDPR対応
    • AdMobでCCNA対応

是非ともSwiftUIで広告を実装してガッチリ稼ぎましょう。
※広告収益を保証するセッションではございません

4