'Xcode 13 Warning - [NSKeyedUnarchiver validateAllowedClass:forKey:]

I am using File Storage system for saving some data models confirming to Codable Protocol.

My Save function is as below:

func save<T: Encodable>(value: T, for key: String, on path: URL) throws {
        let url = path.appendingPathComponent(key, isDirectory: false)
        do {
            try ANFileManager.createDirectoryAtPath(path: url.deletingLastPathComponent())
            let archiver = NSKeyedArchiver(requiringSecureCoding: true)
            archiver.outputFormat = .binary
            try archiver.encodeEncodable(value, forKey: NSKeyedArchiveRootObjectKey)
            archiver.finishEncoding()
            // then you can use encoded data
            try archiver.encodedData.write(to: url)
            
        } catch {
            throw StorageError.cantWrite(error)
        }
    }

My fetch function is as below:

 func fetchValue<T: Decodable>(for key: String, from path: URL) throws -> T {
        let url = path.appendingPathComponent(key)
        
        let data = try Data(contentsOf: url)
        let unarchiver = try NSKeyedUnarchiver(forReadingFrom: data)
        unarchiver.decodingFailurePolicy = .setErrorAndReturn
        guard let decoded = unarchiver.decodeDecodable(T.self, forKey:
            NSKeyedArchiveRootObjectKey) else {
                throw StorageError.notFound
        }
        
        unarchiver.finishDecoding()
        
        if let error = unarchiver.error {
            throw StorageError.cantRead(error)
        }
        else {
            return decoded
        }
        
    }

Save and fetch are working fine but at runtime seeing some below warning in xcode console.

    *** -[NSKeyedUnarchiver validateAllowedClass:forKey:] allowed unarchiving safe plist type ''NSString' (0x7fff863014d0) [/Applications/Xcode_13.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/Foundation.framework]' for key 'NS.keys', even though it was not explicitly included in the client allowed classes set: '{(
    "'NSDictionary' (0x7fff862db9a0) [/Applications/Xcode_13.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreFoundation.framework]",
    "'NSDate' (0x7fff862db798) [/Applications/Xcode_13.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/System/Library/Frameworks/CoreFoundation.framework]"
)}'. This will be disallowed in the future.

What should be done to suppress the warning ?



Solution 1:[1]

The problem is the failure to require secure coding on the unarchiver:

https://developer.apple.com/documentation/foundation/nskeyedunarchiver/1410824-requiressecurecoding

But more broadly it is very odd to pass through a keyed archiver when Codable is already saveable directly.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1