如果在Iphone中使用我的应用程序时截屏,请观察并删除(截屏)

时间:2019-06-24 07:31:29

标签: c# xamarin.ios visual-studio-2019

我正在尝试观察在iPhone上使用我的应用程序时是否拍摄了屏幕截图。如果在使用我的应用程序时拍摄了屏幕截图,我希望删除该屏幕截图。

我还了解到,在删除过程中,用户需要授予删除权限。

我成功使用了Observer方法来检查在使用我的应用程序时是否拍摄了屏幕截图。

我被困在需要访问该屏幕截图并删除它的位置,当然这要经过用户许可。

```public override void OnActivated(UIApplication application)
    {
        try
        {
            // Start observing screenshot notification
            if (_screenshotNotification == null)
            {
                _screenshotNotification = NSNotificationCenter.DefaultCenter.AddObserver(UIApplication.UserDidTakeScreenshotNotification,
                            (NSNotification n) => {

Console.WriteLine("UserTookScreenshot");                                    

var photosOptions = new PHFetchOptions();                                   

photosOptions.SortDescriptors = new NSSortDescriptor[] { new 

NSSortDescriptor("creationDate", false) };                                  

photosOptions.FetchLimit = 1;                                                                       

var photo = PHAsset.FetchAssets(photosOptions);                                 

Console.WriteLine(photo);                                   

var filePath = photo.Path;                                  

System.IO.File.Delete(filePath);                                    

n.Dispose();
                                       }
                     );
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            Console.WriteLine(ex.StackTrace);
        }
    }```

我知道上面的代码不适用于删除使用我的应用程序时获取的当前屏幕截图。它给出了我想要实现的总体思路。

如何立即(经用户许可)从Iphone删除使用我的APP时拍摄的屏幕截图?我也想知道是否有可能。

3 个答案:

答案 0 :(得分:0)

是的,显然,您必须适当地管理图像的权限。为此,首先必须添加一个观察者以检测屏幕快照,如图here

所示。
  

首先:在AppDelegate上声明一个NSObject变量。在下面的示例中,我添加了_screenshotNotification。

     

第二:在AppDelegate的OnActivated(应用程序进入活动状态)上,添加代码以开始观察UIApplication.UserDidTakeScreenshotNotification,然后在发布通知后执行一些操作。

     

第三:在AppDelegate的OnResignActivation(应用程序变为非活动状态)上,添加代码以删除观察者。

然后,您必须实际找到文件并删除,因此您在尝试执行的页面中,只需使用语句添加Foundation&Photos,然后尝试执行此操作。 (我从here转换了Swift,但尚未对其进行测试)

var fetchOptions = new PHFetchOptions();
fetchOptions.SortDescriptors[0] = new Foundation.NSSortDescriptor("creationDate", true);
var fetchResult = PHAsset.FetchAssets(PHAssetMediaType.Image, fetchOptions);
if (fetchResult != null)
{
             var lastAsset = (fetchResult.LastObject as PHAsset);
             var arrayToDelete = new PHAsset[1] { lastAsset };
             PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { PHAssetChangeRequest.DeleteAssets(arrayToDelete); },
                                                              async (bool success, NSError errorMessage) => { }); //Handle Completion Here Appropriately 
}

答案 1 :(得分:0)

我认为不可能。

在iOS 11中,当您截屏时,快照会在屏幕的左下角最小化。从这里save or delete屏幕截图由用户决定。(如下图所示)

您可以阅读本文的更多信息:how-take-screenshot-iphone-or-ipad-ios-11

screenshot

这是一个问题,您怎么知道用户是否保存了屏幕截图?

如果用户保存了,则可以从photoLibrary中删除screenShot。

虽然用户不保存屏幕截图,但您删除的不是屏幕截图。

答案 2 :(得分:0)

试试这个:

func didTakeScreenshot() {
    self.perform(#selector(deleteAppScreenShot), with: nil, afterDelay: 1, inModes: [])
}

@objc func deleteAppScreenShot() {
    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)
        }
    }
}