【问题标题】:Is there a way to get the list of my iOS app screenshots?有没有办法获取我的 iOS 应用截图列表?
【发布时间】:2016-02-26 10:15:33
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: ios objective-c swift uiimagepickercontroller screenshot


    【解决方案1】:

    除了这里定义的源类型之外,没有办法呈现标准 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
    

    但是由于错误(上面会因为谓词而崩溃),您可以获取所有专辑,然后过滤屏幕截图的专辑(适用于 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
    

    还请记住,无法从特定应用中截取屏幕截图。

    【讨论】:

    • 不比较集合的localizedTitle。查看收藏的assetCollectionSubtype,看看是不是SmartAlbumScreenshots
    • 顺便说一句 - 这会获取所有屏幕截图,而不仅仅是来自特定应用程序的屏幕截图。
    • @maddy 现在我知道了——SmartAlbumScreenshots 从 iOS9 开始可用
    • 谢谢,虽然这可能无法准确回答问题,但回答很有趣。
    【解决方案2】:

    我还考虑了一种不同的方式来访问从我的应用中截取的所有屏幕截图。想法是用 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
            }];
        }];
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 2015-08-12
      • 1970-01-01
      相关资源
      最近更新 更多