2016-03-05 33 views
5

Realm Swift có cách nào đó để xóa an toàn và tạo một tệp Realm được mã hóa mới bằng một khóa mới (nhưng cùng tên tệp) không?Realm Swift iOS - xóa và khóa lại một cách an toàn Realm

trường hợp sử dụng của tôi: khi người dùng đăng ra khỏi ứng dụng của tôi, tôi xóa các tập tin .realm mã hóa, vì chìa khóa mã hóa cũng sẽ bị xóa:

static func deleteRealm() { 
    let configuration = Realm.Configuration()  
    let path = NSURL.fileURLWithPath(configuration.path!)  
        .URLByDeletingLastPathComponent? 
        .URLByAppendingPathComponent("encrypted.realm") 
        .path! 
    if NSFileManager.defaultManager().fileExistsAtPath(path) { 
     // Delete realm 
     try! NSFileManager.defaultManager().removeItemAtPath(path) 
    } 
    } 
} 

(Thật không may, gọi realm.deleteAll() sẽ không đủ, kể từ khi có một chìa khóa mới)

Nhưng khi một người dùng đăng nhập ngay sau khi đăng xuất và tôi cố gắng để tái intialize một Realm mã hóa DB với một chìa khóa mới, như thế này:

static func intializeRealm() -> Realm! { 
    let realmKey = generateSecureRealmKey() 
    var configuration = Realm.Configuration() 
    configuration.path = RealmDB.getRealmPath() 
    configuration.encryptionKey = NSData(bytes: realmKey, length: realmKey.count) 
    return try! Realm(configuration: configuration) 
    } 

tôi nhận được ngoại lệ này:

*** Terminating app due to uncaught exception 'RLMException', 
     reason: 'Realm at path '****/encrypted.realm' already opened 
     with different encryption key' 

Dường như cũ configuration cache vẫn đang được sử dụng (kể từ khi tên tập tin là như nhau) dù file lĩnh vực đã bị xóa.

sample encryption app for Realm Swift sử dụng autoreleasepool để giải quyết vấn đề này, nhưng điều đó dường như không khả thi cho ứng dụng lớn hơn. Hoặc là nó? Tôi có phải bao quanh tất cả các công dụng của lĩnh vực với autoreleasepool?

Trả lời

1

Trước khi bạn có thể xóa cơ sở dữ liệu Realm hiện tại hoặc tạo một khóa mới bằng khóa mã hóa mới ở cùng một đường dẫn, bạn sẽ cần phải đảm bảo rằng tất cả các trình truy cập Realm đều bị đóng. Nhưng khi bạn chỉ ra, điều đó có thể khó đạt được trong một ứng dụng lớn hơn. Cách dễ nhất xung quanh đó có lẽ là sử dụng đường dẫn tệp mới. Vì lý do đó, tôi khuyên bạn nên post-pone việc xóa cơ sở dữ liệu thực tế chính nó để khởi động ứng dụng tiếp theo. Bạn có thể đạt được điều đó bằng cách lưu trữ đường dẫn đến lĩnh vực hiện đang được sử dụng và xóa tất cả các tệp .realm khác và tất cả tệp phụ của chúng trong cùng một thư mục.

Các vấn đề liên quan