iOS,如何知道照片是不是是用户截取的屏幕截图?如何删除照片中的照片?

Posted

技术标签:

【中文标题】iOS,如何知道照片是不是是用户截取的屏幕截图?如何删除照片中的照片?【英文标题】:iOS, How to know whether a photo is a screenshot taken by user? How to delete photos in Photos?iOS,如何知道照片是否是用户截取的屏幕截图?如何删除照片中的照片? 【发布时间】:2016-09-26 08:55:27 【问题描述】:

在AppStore(中国),一款名为腾讯手机管家的App发布了一系列与照片相关的功能,包括检测照片是否为用户截图、删除照片等。

我在这里截取了这个应用程序的截图来演示我的问题(我自己为你添加了英文文本,因为该应用程序只显示中文):

This app knows what photos are screenshots and what not

当你点击底部的删除按钮时,它会显示:

Asking permission from user to delete photos

据我所知,ios 中的 Photo API(AssetsLibrary、phphotoLibrary)并没有给出照片的绝对路径,而且 iOS SandBox 也不允许应用删除用户的资产,这使得删除用户的照片几乎不可能的。 iOS 设备中保存的所有照片都遵循相同的命名系统:“IMG_001.jpg”,这使得无法从其名称中检测照片是否为截图。

但显然,这个应用程序实现了这两个功能。有人对此有任何想法吗?

谢谢!

【问题讨论】:

【参考方案1】:

对于屏幕截图,它的 UTI 总是一个“public.png”并且与屏幕大小相同(确保您在屏幕边界宽度和高度上乘以 [UIScreen scale]),只需检查这 2 个元数据,您就可以轻松识别屏幕截图。

希望对你有帮助

【讨论】:

感谢您的回答。 UTI 指的是什么?顺便说一句,我从我的 mac 发送了几张图片(全部重新调整为 640*1136,在我的情况下为 iPod Touch 6)到我的 iPod,看看它们将如何分类。我通过捕获我的mac屏幕创建的那些被归类到截图相册中,但我从网络获得的那些则不是。 iOS相册和腾讯手机管家的结果是一样的。【参考方案2】:

您可以使用 PHAsset 的 mediaSubtypes 属性进行检查。

let types = phAsset.mediaSubtypes /// phAsset is a PHAsset
let isScreenshot = types.contains(.photoScreenshot) /// true if is screenshot

【讨论】:

以上是关于iOS,如何知道照片是不是是用户截取的屏幕截图?如何删除照片中的照片?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用iOS上的代码截取屏幕截图?

以编程方式截取 iOS 中另一个应用程序的整个可滚动区域的屏幕截图

在iOS上的应用程序中截取屏幕截图的方法是什么?

如何不从照片库 iOS 中获取屏幕截图

如何从 ionic/cordova/phonegap 中的布局截取屏幕截图?

Xcode 6 - iOS 模拟器 - 从命令行截取屏幕截图