能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

写真アルバム利用アプリトラブルシューティング(iCloud写真) - iOS App

序) 投稿は人のためならず(自分のためになる)

プレゼンテーションとして公開したPhotoKit/Photos.framework についてまとめた資料について2015年に公開している。

Photos vs Assets Library - いまさら始めるPhotos.framework

Photos.framework を扱う際の資料として他のiOSアプリ開発者にも参照されている。iOSアプリ開発者の役に立っている点は嬉しいし、WebでPhotos.frameworkについて調べたところ結果自分の資料に行き着くなど自らも助く内容となっている。

【iOS】画像選択系UIを作る上で必要な知識 - Cybozu Inside Out | サイボウズエンジニアのブログ

この投稿はPhotos.frameworkについての補足となる。まず2021年の写真アルバムの状況について簡単に説明し、iCloud写真(iCloud iCloudPhotos)が混在した写真アルバムで発生する問題についてと対処方法について記述する。

1) 写真アルバムへアクセスする際の追記事項

2015年から6年経過した2021年では写真アルバムへのアクセスする際の追記事項が大きく2る増えている。

1つはiOS14から選択した写真機能が用意された。利用者が設定画面で全ての写真を許可しない限り写真を追加する手順が1つ増える仕様となっている。写真選択の挙動はiOS13以前を対象としたアプリでも強制される。

もう1つはクラウドサービス普及により利用者がiCloud写真を普通に利用していることが多い。むしろクラウド機能が無効/有効を切り替えることも意識もしていないのが大半となっている。クラウドサービスを意識しなくなるようになったのは利用者としては利便性が高くなるがアプリ開発者としてはアプリでの確認と対応が必要となる。

2) アプリでiCloud写真(iCloud photo)

iOSアプリから写真アルバムから写真を取得するさいにはPHImageManagerを使用する。PHImageManagerから画像を取得する際には、

  • 画像オブジェクトで取得
  • データ型(Data)での取得

が用意されている。画像オブジェクトの場合はプログラム上でそのまま使用可能であるがオンメモリで画像が展開される(実際に消費されるメモリはOS側管理下なのでOSバージョンごとに増減があるのに注意)、データ型はJpegやHEIFなどデータ形式の形で取得できる。一般にデータ型で取得した方がメモリの使用量は抑えられる。またストレージにそのまま保存し永続化することも可能となる。

画像取得方法の違いはあるがPHImageManagerで画像を取得する際にiCloud写真に対応するには取得時にネットワーク経由での取得を有効にする必要がある。クラウドサービスが前提になっている2021年でもデフォルトは無効(false)なので注意して欲しい。

let options = PHImageRequestOptions()
options.isSynchronous = false
options.isNetworkAccessAllowed = true

isNetworkAccessAllowed をtrueにするだけで良いが頻繁なアップデート方針を取っていないアプリではiCloud写真について対応していない場合があるので確認をしておくことに越したことはない。

  1. iCloud写真未対応時の挙動 2はソースコードレベルで確認からの修正できればこしたことがないが不幸にも利用者のフィードバックからiClooud写真に対応していないことを把握することもある。iCloud写真を有効にした場合の挙動はいくつか特徴がある。
  2. 取得できる画像オブジェクトがサムネイルサイズにとどまる
  3. 取得する画像品質を高くしても画像がサムネイルサイズにとどまる
  4. データ型での画像取得に失敗する

iOS14時点でのiCloud写真の特徴としてサムネイルサイズ画像は同期されるがクラウド上にアップロードされた画像データはiPhone/iPadに自動的にはダウンロードされるわけではない。何かしらのアプリがネットワークからダウンロード要求しない限り即時同期されないので注意が必要である。

3-1) 再現方法

※同期などの不整合がおきるので日常使いiPhoneなどで以下の再現方法を試す場合は注意が必要

利用者が遭遇している状況をiOSアプリ開発者側で再現するには、

設定 - 写真 - iCloud写真

を確認。有効になっている場合は一度無効化(Off)し、その後有効化する。

その後他のiOS/iPad端末、Windows10のiCloud写真から写真を追加し同期を待ったのち、Xcodeなど開発ツール上でアプリを実行し、PHImageRequestOptionsのisNetworkAccessAllowedをfalseもしくは未指定の状態が利用者が遭遇している状況となる。

4) まとめ

iOS14ではプライバシー重視の傾向が強まった点で写真アルバムが語られるがクラウドサービスの日常遣いも進んでいる。業務/コンシューマー用途での写真利用もクラウドサービス経由での取得することが前提で使われることがあるのでアプリ開発者側での修正の必要有無については検討した方が良いだろう。