LoginSignup
4
2

More than 5 years have passed since last update.

【iOS9】【要注意】Photosフレームワークで保存したファイル名

Posted at

今まで開発したPhotosフレームワークを使ったアプリがiOS8とiOS9で違う挙動になってしまうことがありました。普段の使い方で問題ないと思いますが、念のため共有しときます。

まず、iOS9からPhotosフレームワークにPHAssetResourceCreationOptionsというクラスを追加されました。このクラスを使ってPHAssetを作成する時いくつの属性を指定することができます。その内の一つoriginalFilenameというプロパティは以下のように書いてあります。

Declaration

@property(nonatomic, copy) NSString *originalFilename

Discussion

You can use this property to track the original name of the file from which you import an asset resource even if you use the addResourceWithType:data:options: method to create a resource from data instead of from a file. After creating the asset, this information is available in the originalFilename property of the corresponding PHAssetResource object.

If you do not specify a value for this property and are using the addResourceWithType:fileURL:options: method to create a resource, Photos infers the filename from that method’s fileURL parameter. Otherwise, Photos automatically generates a filename.

ディスカッションに書いた通り、画像を(iOSの)写真アプリに保存する(PHAssetを新規作成)場合、iOS8とiOS9の動きが違います。
新しい画像を保存する時、
- iOS8の場合:Photosフレームワークが元の画像ファイル名を管理しない、写真アプリ内に保存できた画像は全てiOSが発行した名前になります。保存後の画像ファイル名の例:IMG_xxxx.JPG
- iOS9の場合:Photosフレームワークが指定された元ファイル名(指定してない場合は渡したファイル名)を保存しています。ただし、この時点写真アプリ内に保存できた画像のファイル名はiOS8と変わらない、つまり、写真アプリ内もIMG_xxxx.JPGの形式で保存してます。

ここまでは内部的に違いがありますが、外部への影響はほとんどありません。
この時写真アプリ内に保存している画像は
- iOS8:画像名=物理ファイル名=IMG_xxxx.JPG
- iOS9:画像名=originalFilename、物理ファイル名=IMG_xxxx.JPG

iPhoneをPCに繋いて写真アプリにPhotosフレームワーク経由で保存した画像ファイルをエクスポートする時、上記の結果によりエクスポートしてきたファイルの名前がiOS8とiOS9で違いが出ます。
その理由の一つ:iPhoneがPCと繋ぐ時カメラとして扱うため、エクスポートしたファイル名はすべてDCF規格に順守しなければいけません。
結果としては
- iOS8:エクスポートした画像のファイル名:IMG_xxxx.JPG
- iOS9:元ファイル名がDCF形式の場合は元ファイル名、そうじゃないファイル名の場合iOSが勝手にリネームしてランダムな名前でエクスポートしてしまいます。

例:
ネットからダウンロードしたsample.jpgをPhotosフレームワーク経由で写真アプリに保存した後、PCにエクスポートすると、iOS8ではIMG_1235.JPGでPCに保存、iOS9だとSRYDGZE1.JPGになってしまいます。

下記いずれの方法で上記問題を回避できます:
1.Photosフレームワークを使って保存する場合、PHAssetCreationRequestクラスのaddResourceWithType:fileURL:options:メソッドの代わりにaddResourceWithType:data:options:を使いましょう。この時、PHAssetResourceCreationOptionsのoriginFilenameを指定しない。
2.元のファイル名をDCF形式にしましょう。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2