简体   繁体   中英

Cannot find file in app extension's shared container

I want to write log file at my extension, and read it at my app. For this purpose, I'm using shared groups (so both the app and the extension would be able to read from the same file)

I wrote the following code:

Extension:

let fileManager = NSFileManager.defaultManager()
let containerUrl = fileManager.containerURLForSecurityApplicationGroupIdentifier("group.MyCompany.MyProj")

let extensionLogDirectory = containerUrl?.path?.stringByAppendingString("AppExtensionLogs")
let logFileManager = DDLogFileManagerDefault(logsDirectory: extensionLogDirectory)
PacketTunnelProvider.fileLogger = DDFileLogger(logFileManager: logFileManager)

PacketTunnelProvider.fileLogger!.rollingFrequency = 60*60*12
PacketTunnelProvider.fileLogger!.logFileManager.maximumNumberOfLogFiles = 1
DDLog.addLogger(PacketTunnelProvider.fileLogger)

App (just to read the log file):

let fileManager = NSFileManager.defaultManager()
        let containerUrl = fileManager.containerURLForSecurityApplicationGroupIdentifier("group.MyCompany.MyProj")
        if let extensionLogDirectory = containerUrl?.path?.stringByAppendingString("AppExtensionLogs") {
            do {
                let directoryContents = try fileManager.contentsOfDirectoryAtPath(extensionLogDirectory)//always fails
                for file in directoryContents {
                    let path = extensionLogDirectory.stringByAppendingString(file)
                    do {
                        let fileContents = try NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding)
                        NSLog("file: \(fileContents)")
                    }
                    catch {/* error handling here */

                    }
                }
            }
            catch {/* error handling here */
                 NSLog("nope!")
            }

But, something now right - it's seems like contentsOfDirectoryAtPath always fails with "no such file" error What's wrong in this code?

The problem is unrelated to app extensions or CocoaLumberjack.

stringByAppendingString just concatenates strings, so that the path separator "/" is missing in the generated directory name.

There was a dedicated method stringByAppendingPathComponent , which however has been deprecated in Objective-C and is no longer available in Swift. You should operate on the URL by using URLByAppendingPathComponent instead:

let extensionLogDirectory = containerUrl?.URLByAppendingPathComponent("AppExtensionLogs").path

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM