iOSでカメラと写真にアクセスする

iPhone 実機でカメラにアクセスする

iOS アプリを iPhone 実機に入れて、カメラにアクセスしようとすると、以下のエラーが発生した。

[access] This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.

iOS 10 以降、カメラにアクセスする場合、Info.plistNSCameraUsageDescription キーを追加する必要がある。フォトライブラリの場合、キーは NSPhotoLibraryUsageDescription です。

Info.plist を XML 形式で開いた場合、以下のコードを <dict> 内に追加する。

<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) needs camera access.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>$(PRODUCT_NAME) needs photo library access.</string>

Info.plist をプロパティリストとして開いた場合、以下のキーを追加する。

Key Value
Privacy - Camera Usage Description $(PRODUCT_NAME) needs camera access.
Privacy - Photo Library Usage Description $(PRODUCT_NAME) needs photo library access.

iOS シミュレータに画像を追加する

iOS シミュレータに画像をドラッグ&ドロップするだけです。

しかし Downloads フォルダ内の画像を使うと、次のエラーが発生した。

Failed to import ‘xxx’, error [PHPhotosErrorDomain] -1: The operation couldn’t be completed. (PHPhotosErrorDomain error -1.)

一旦 Documents フォルダ内の画像を使って、シミュレータにドラッグ&ドロップすれば、アクセス許可を求めるダイアログが出る。「OK」を押すと、画像が追加される。

alt

xcrun simctl コマンドで画像を追加することもできる。

  • 現在起動しているシミュレータに追加する
$ xcrun simctl addmedia booted x.png
  • 他のシミュレータに追加する場合は、booted をそのシミュレータの UUID に置き換える。

ちなみに、写真は ~/Library/Developer/CoreSimulator/Devices/<UUID>/data/Media/DCIM/100APPLE/ フォルダに格納されている。

次のコマンドで起動しているシミュレータの UUID を取得できる。

$ xcrun simctl list devices available | grep -i booted