ios - 在用户无法访问的地方快速保存图片

标签 ios swift ios8 nsdocumentdirectory

我有一个允许用户拍照并立即保存的应用程序,但是它们目前存储在应用程序文档目录中,可以通过 iFunBox 等程序访问该目录。这是我保存图像的方法。

        var imageName = "SomeGeneratedImageName.jpeg"
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
        let documentsDirectory = paths.objectAtIndex(0) as NSString
        let path = documentsDirectory.stringByAppendingPathComponent(imageName)
        var data = UIImageJPEGRepresentation(image, 1)
        data.writeToFile(path, atomically: true)

我应该把图片保存在哪里,这样用户即使通过 iFunBox 等程序也无法访问它们?

更新 - 使用的答案

基于 zaph's回答 我在保存之前和阅读时使用 RNEncrytor 对图片进行了加密。这是我的保存功能:

        var imageName = "someImageName.jpeg"
        let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
        let documentsDirectory = paths.objectAtIndex(0) as NSString
        let path = documentsDirectory.stringByAppendingPathComponent(imageName)
        var data = UIImageJPEGRepresentation(image, 1) //change 1 for compression
        let encryptedData = RNEncryptor.faireseEncryptData(data, password: "password", error: nil)
        encryptedData.writeToFile(path, atomically: true)

    var imageName = "thatSameImageName.jpeg"
    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
    let documentsDirectory = paths.objectAtIndex(0) as NSString
    let path = documentsDirectory.stringByAppendingPathComponent(imageName)
    var decryptedImg = RNDecryptor.faireseDecryptData(NSData(contentsOfFile: path), password: "theSamePass", error: nil)
    if(decryptedImg != nil) {
        //alert
    var image: UIImage? = UIImage(data: decryptedImg)
}

同时为了让它快速工作,AES256 出现了一些问题,所以我向 RNEncryptor.hRNEncryptor.m 添加了一些类RNDecryptor.hRNDecryptor.m

//To RNEncrpytor.h
+ (NSData *)faireseEncryptData:(NSData *)data password:(NSString *)password error:(NSError **)error;

.

//To RNEncryptor.m
+ (NSData *)faireseEncryptData:(NSData *)data password:(NSString *)password error:(NSError **)error {
return [RNEncryptor encryptData:data withSettings:kRNCryptorAES256Settings password:password error:error]; }

.

//To RNDecryptor.h
+ (NSData *)faireseDecryptData:(NSData *)data password:(NSString *)password error:(NSError **)error;

.

//TO RNDecryptor.m
+ (NSData *)faireseDecryptData:(NSData *)data password:(NSString *)password error:(NSError **)error {
return [RNDecryptor decryptData:data withSettings:kRNCryptorAES256Settings password:password error:error]; }

最佳答案

使用 writeToFile:options:error: 保存 NSDataWritingOptionsNSDataWritingFileProtectionComplete 或根据需要显式加密和解密,将密码保存在钥匙串(keychain)中,请参阅 RNCryptor 以获得良好的加密例程。

通常将大数据项保存在数据库中并不是一个好的解决方案。

关于ios - 在用户无法访问的地方快速保存图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29477304/

相关文章:

ios - 应用程序在 iOS 中将帐户 A 移动到 B 后可能丢失钥匙串(keychain)访问问题

swift - 类型为 'representedObject' 的属性 'AnyObject?' 无法覆盖类型为 'Any?' 的属性

ios - 使用谓词获取总是返回 nil

ios8 - Coreplot 1.5.x arm64 - 架构 arm64 的 undefined symbol :

ios - 选择器 View Swift

ios - 我如何知道我是否已连接到雪佛兰汽车上的 carplay

ios - 带单位的数字与 VoiceOver

swift - saveWithBlock 方法中的 MagicalRecord 未找到具有 MR_FindFirstByAttribute 的现有实体 - Swift

ios - MFMessageComposeViewController 栏透明

ios - 如何询问 UIUserNotificationSettings 类型