ドキュメントは言う:
PHImageResultIsInCloudKey: 写真アセット データがローカル デバイスに保存されているか、iCloud からダウンロードする必要があるかを示すブール値。(NSNumber) YES の場合、アセット データは iCloud からダウンロードする必要があるため、画像は提供されませんでした。データをダウンロードするには、別の要求を送信し、networkAccessAllowed オプションに YES を指定します。
ただし、アセットが iCloud フォト ライブラリに保存されている場合は、アセットがデバイスに完全にダウンロードされている場合でも、このキーは常に YES です (アプリでダウンロードし、写真アプリでも開いています)。
画像が利用できない場合は、ユーザーがダウンロードできるようにしたいと思います (ただし、自動的にダウンロードしないでください。少なくとも、Wifi がない場合は除きます)。
では、画像をダウンロードする必要があるかどうかを確認するにはどうすればよいでしょうか?
さらに興味深いの
requestImageForAsset:targetSize:contentMode:options:resultHandler:
は、ダウンロードする必要があるイメージに対して結果ブロック が呼び出されると、requestedImage == nil で最後の呼び出しが行われ、サイズが小さく劣化したバージョンが配信された後です。
この場合、劣化は NO です。画像がなくても、写真アプリの小さなサムネイルしかローカルで利用できないため、iCloud から画像をダウンロードする必要があります。
異なる iOS 8 バージョン (8.1.x、8.2 ベータ、8.3 ベータ) の iPhone と iPad でこれをテストしましたが、動作は常に同じです。
写真アプリで画像を開くと、結果ハンドラーの最後の呼び出しでフルサイズの画像が表示されますが、PHImageResultIsInCloudKey は依然として YES のままです。
画像をリクエストするコードは次のとおりです。
PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
options.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
options.networkAccessAllowed = NO;
[self.imageManager requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage *requestedImage, NSDictionary *info) {
// Checking for requestedImage and the info keys here
// When a full sized image was loaded, the result of PHImageResultIsInCloudKey is still YES
// When a full sized image couldn't be loaded cause it's in the cloud, isDegraded is NO and PHImageResultIsInCloudKey is YES (as always) and requestedImage is nil
}];