今まで開発した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形式にしましょう。