Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

Sansan iOSアプリにおけるiOS14対応

みなさん、こんにちは。プロダクト開発部iOSエンジニアの荒川です。 本記事はSansan Advent Calendar 21日目の記事です。

adventar.org

11月24日リリースにて、Sansan iOSアプリのiOS14対応が完了しました🎉

今回はSansanアプリで実施した対応をご紹介します!

canOpenURLの挙動変更による修正

デフォルトブラウザがSafari以外の場合に、UIApplication.sharedApplication().canOpenURL()falseを返却するようになった影響でアプリからブラウザに遷移できないユーザがいることが分かりました。こちらはiOS14にアップデートしたユーザがすぐに影響を受けることもあり、iOS14がリリースされた直後に修正対応を入れました。

SansanアプリではcanOpenURLに渡るURLスキームが多くもないことから、LSApplicationQueriesSchemesへアプリで対応しているスキームを追加することで対応を行いました。

https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl

CarthageのWorkaround対応

Xcode12でCarthageで導入したライブラリをアップデートしようとすると、以下のエラーが発生してビルドが通らないという現象が発生しました。

the same architectures (arm64) and can't be in the same fat output file

arm64向けアーキテクチャを同じファットバイナリに含むことができないというエラーで、Xcode12からApple Siliconへの対応が新しく追加されたために発生するようになりました。

この問題は、CarthageのIssueにもあげられており、公式からWorkaround用のスクリプトが用意されています。

github.com

ドキュメントに記載のあるスクリプトをcarthage updateの代わりに実行することで、Sansan iOSアプリではビルドできる状態となりました。

ロングタップで一気に前の画面に戻る機能を無効化

iOS14より「戻る」ボタンを長押しすることで一気に前の画面に戻ることができるようになりました。

f:id:ad-sho-loko:20201215102251p:plain

将来的にはロングタップでの体験を整えたいとは思っていますが、一時的に機能をオフとする対応を行いました。 対応自体はApple Forumsを参考とし、UIBarButtonItemを継承したクラスを作成し、既存の箇所で置き換えることにしました。

developer.apple.com

写真のアルバムのパーミッション追加にともなう修正

アルバムのパーミッション取得に新しく「選択した写真を選択」する機能が追加され、選択した写真のみをアプリに渡す権限制御ができるようになりました。

その影響でUIImagePickerViewControllerにて一部の挙動が変更されており、phAssetreferenceURLなど利用している箇所が動作しなくなっていました。

そのためiOS14より利用できるPHPikcerViewControllerに代替する作業を実施しました。 PHPickerViewControllerはiOS14から導入されたPhoto Libraryアクセス専用のクラスです。

developer.apple.com

iOS13以下ではImagePickerViewController、iOS14以降はPHPickerViewControllerを利用するように修正しました。

UIDatePickerの挙動修正における対応

iOS14ではUIDatePickerの挙動が一新され、カレンダー表示が出来るようになりました。

f:id:ad-sho-loko:20201210224321p:plain

SansanアプリではActionDatePicker というライブラリでラップして使用しており、UIDatePickerの挙動が変わったことにより、表示崩れが発生していました。しかし、最新版のライブラリ側がすでに対応済みだったため、該当バージョンにアップデートを行うだけで無事に表示されました。

将来的にはカレンダー表示するなど工夫の余地が大いにありそうです😆

クリップボード通知の制御

iOS14ではアプリ内でテキストをコピーをしたときに通知が飛ぶようになりました。ユーザが明示的にコピーの作業をした場合は通知が飛んでも問題ないのですが、Firebase Dynamic Links の裏側の仕組みでアプリ起動時にクリップボード通知が表示されるという事象が発生していました。

アプリを起動するたびにクリップボード通知が飛ぶため、ユーザに不審に思われる可能性があるので無効化する対応を行いました。

無効化する方法としてFirebaseSDKのIssueにも記載がある通り、Info.plistFirebaseDeepLinkPasteboardRetrievalEnabledfalseに設定しました。

github.com

いくつかの機能が利用できなくなるのですが、Sansanでは特に利用していなかったため、問題になりませんでした。

ローカルネットワークの権限追加対応

スキャナで名刺を取り込む機能がSansanアプリにはあり、Wi-Fiを利用してスキャナとの通信を行います。 このローカルネットワークを利用する通信においてパーミッションが表示されるようになりました。

WWDCを参考にして、新規でInfo.plistに文言を設定することにしました。

developer.apple.com

また開発環境ではUIデバッグツールのRevealを利用しているのですが、起動時にパーミッションが表示されるようになっていました。 公式サイトを参考にNSBonjourServices_reveal._tcpを設定しました。

Supporting iOS 14 Permission Changes – Reveal Support

以上でSansanのiOSアプリのiOS14対応は完了しました🎉

(後日談)iOS14対応で実機デバッグが遅くなった?

iOS14 / Xcode12に対応して以降、実機デバッグ時にアタッチが非常に遅くなる現象が発生していました。

iOS14対応が原因だと思い調査をしていたのですが、Xcode12.3のリリースノートに以下の記載がありました。

Fixed an issue that could cause Xcode to get interrupted when copying symbols from iOS devices, and never finish preparing iOS devices for debugging. The failure mainly occurred on Xcode installations used to debug multiple iOS devices which are running the same version of iOS. This bug impacted the performance of launching executables on iOS devices and attaching the debugger to them. (68221778) (FB8611135)

つまりXcodeの問題だったということで、iOS14アプリ対応が原因ではなかったようで一安心でした🍵

まとめ

SansanアプリのiOS14対応は以上です! iOS13ほどの大規模修正ではありませんでしたが、対応する箇所もそこそこに多かったので大変なプロジェクトでした(毎年恒例ではありますね)。

ぜひ皆さんのアプリへの対応の参考にしていただければと思います!


buildersbox.corp-sansan.com buildersbox.corp-sansan.com

© Sansan, Inc.