有没有办法获取我的iOS应用程序截图列表?

时间:2016-02-26 10:15:33

标签: ios objective-c swift uiimagepickercontroller screenshot

在我的iOS应用中,有没有办法访问从我的应用中截取的所有屏幕截图?

如果不可能,有没有办法只用截屏专辑(来自所有应用程序)打开图像选择器控制器(UIImagePickerController)?

谢谢。

2 个答案:

答案 0 :(得分:5)

没有办法提供标准的UIImagePickerController,其源类型不是此处定义的

  

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIImagePickerController_Class/#//apple_ref/c/tdef/UIImagePickerControllerSourceType

然而,有一种方法可以获取截图的专辑并将其呈现在自己的UI中。根据文档,你可以做这样的事情:

let options = PHFetchOptions()
options.predicate = NSPredicate(format: "localizedTitle = Screenshots")
let collections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .Any, options: options)
let sceenShots = collections.firstObject as? PHAssetCollection

但是由于bug(上面会因为谓词而崩溃)你可以获取所有专辑,然后过滤截图的专辑(适用于iOS8 +)

let collections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .Any, options: nil)
var screenshots: PHAssetCollection?
collections.enumerateObjectsUsingBlock {
    (collection, _, _) -> Void in
    if collection.localizedTitle == "Screenshots" {
        screenshots = collection as? PHAssetCollection
    }
}

或者如果你的目标是iOS9 +,你可以这样做:

let collections = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumScreenshots, options: nil)
let screenshots = collections.lastObject as? PHAssetCollection

另请注意,无法从特定应用中获取屏幕截图。

答案 1 :(得分:1)

我还考虑了一种不同的方式来访问从我的应用中获取的所有屏幕截图。我们的想法是使用UIApplicationUserDidTakeScreenshotNotification拦截屏幕截图,然后检索并保存文件URL(或复制文件):

[[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(screenshotDetected) name:UIApplicationUserDidTakeScreenshotNotification object:nil];
- (void)screenshotDetected {

    PHFetchResult<PHAssetCollection *> *albums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumScreenshots options:nil];
    [albums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull album, NSUInteger idx, BOOL * _Nonnull stop) {

        PHFetchOptions *options = [[PHFetchOptions alloc] init];
        options.wantsIncrementalChangeDetails = YES;
        options.predicate = [NSPredicate predicateWithFormat:@"mediaType == %d",PHAssetMediaTypeImage];

        PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:album options:options];
        [assets enumerateObjectsUsingBlock:^(PHAsset * _Nonnull asset, NSUInteger idx, BOOL * _Nonnull stop) {
            // do things
        }];
    }];
}

问题是在执行代码时,最后一个触发通知的屏幕截图尚未可用。