23

ドキュメントは言う:

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
}];
4

5 に答える 5

15

を に設定して呼び出すrequestImageDataForAsset:と、クリップがまだ iCloud からダウンロードされていない場合はが返されます。そうしないと、クリップが iCloud に保存されていても、実際のデータが返されます。networkAccessAllowedNOimageDatanil

PHImageManager *manager = [PHImageManager defaultManager];    
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.networkAccessAllowed = NO;
[manager
 requestImageDataForAsset:asset
 options:options
 resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
    if ([[info valueForKey:PHImageResultIsInCloudKey] boolValue]) {
    // Image is in iCloud
        if (imageData) {
            // Image is downloaded
        } else {
            // Image is not downloaded
        }
    }
 }];
于 2016-01-22T01:37:55.110 に答える
3

progressHandler を使用して、PHAsset が iCloud からのものかどうかを確認できます。

__block BOOL isPhotoInICloud = NO;
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.progressHandler = ^(double progress, NSError *error, BOOL *stop, NSDictionary *info){

    isPhotoInICloud = YES;
    // some code to update the download progress
});
options.networkAccessAllowed = YES;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.synchronous = NO;

[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
// use the options to get the high quality image for only once time.
});
于 2016-11-01T01:41:43.597 に答える