如何使用 objective c/Swift 在原生 iOS 中禁用屏幕截图?

How to disable the screenshot in native iOS using objective c/Swift?

你好 SO 用户,因为我在 swift 开始了我的职业生涯并且我当前的项目在 objective c 我需要将我的 swift 代码转换为 objective c 。

我要求在 iOS 设备中禁用截图。由于 Apple 不对此提供支持,我尝试的另一个解决方法是 - 在使用 UIApplicationUserDidTakeScreenshotNotification 截取屏幕截图时收到通知,并从照片库中获取最后一张照片并将其删除,如下面的代码 swift.

    func deleteAppScreenShot() {
    NSLog("i am here")
    let fetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors?[0] = Foundation.NSSortDescriptor(key: "creationDate", ascending: true)
    let fetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions)
    guard let lastAsset = fetchResult.lastObject else { return }
    PHPhotoLibrary.shared().performChanges {
        PHAssetChangeRequest.deleteAssets([lastAsset] as NSFastEnumeration)
    } completionHandler: { (success, errorMessage) in
        if !success, let errorMessage = errorMessage {
            print(errorMessage.localizedDescription)
        }
    }
}

然而,上述方法并不是理想的解决方案,因为它总是会要求用户允许删除最后一张照片

谁能告诉我如何在 iOS 中禁用屏幕截图?

一个) 首先iOS不允许你禁用截图所以你必须清楚地向客户或任何业务人员传达这不是一个可行的事情因为它是 OS 相关的。

B) 接下来,为您提供的解决方案不是一个合适的解决方案,因为它只检测截取屏幕截图的时间,然后用户必须在他的许可下手动删除屏幕截图。它不能自动完成(未经用户许可),因为 APPLE PHOTOS API 严格的用户隐私政策不允许您这样做。所以这个解决方案是最后一个实施,如果任何情况下客户坚持或无论如何想要实​​施它,但根据我的经验,它不是 100% 的解决方案,不能实施

我能理解从 Swift 转换回 Objective c 的麻烦。因为我有相同的经验,所以我可以分享 Objective C 代码的快照,你们可以 assemble 一起获得想要的结果。代码是:

获取最后一个对象:

PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions];
PHAsset *lastAsset = [fetchResult lastObject];

删除或者:

PHFetchResult *asset = [PHAsset fetchAssetsWithALAssetURLs:@“Your asset url” options:nil];
[asset enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
     NSLog(@"%@",[obj class]);
     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
         BOOL req = [obj canPerformEditOperation:PHAssetEditOperationDelete];
         if (req) {
             NSLog(@"true");
             [PHAssetChangeRequest deleteAssets:@[obj]];
         }
     } completionHandler:^(BOOL success, NSError *error) {
         NSLog(@"Finished Delete asset. %@", (success ? @"Success." : error));
         if (success) {
            NSLog(@“delete successfully”);  
        }
    }];
    }];

关注 link2,无论如何都可以在评论中给我回信。