在应用程序扩展的共享容器中找不到文件
Cannot find file in app extension's shared container
我想在我的扩展中写入日志文件,并在我的应用程序中读取它。
为此,我使用了共享组(因此应用程序和扩展程序都可以从同一个文件中读取)
我写了下面的代码:
分机:
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)
应用程序(只是为了读取日志文件):
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!")
}
但是,现在有些事情是正确的 - 似乎 contentsOfDirectoryAtPath 总是失败并出现 "no such file" 错误
这段代码有什么问题?
该问题与应用程序扩展或 CocoaLumberjack 无关。
stringByAppendingString
只是连接字符串,所以路径
生成的目录名称中缺少分隔符“/”。
有一个专门的方法stringByAppendingPathComponent
,但是
已在 Objective-C 中弃用,在 Swift 中不再可用。
您应该使用 URLByAppendingPathComponent
对 URL 进行操作
相反:
let extensionLogDirectory = containerUrl?.URLByAppendingPathComponent("AppExtensionLogs").path
我想在我的扩展中写入日志文件,并在我的应用程序中读取它。 为此,我使用了共享组(因此应用程序和扩展程序都可以从同一个文件中读取)
我写了下面的代码:
分机:
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)
应用程序(只是为了读取日志文件):
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!")
}
但是,现在有些事情是正确的 - 似乎 contentsOfDirectoryAtPath 总是失败并出现 "no such file" 错误 这段代码有什么问题?
该问题与应用程序扩展或 CocoaLumberjack 无关。
stringByAppendingString
只是连接字符串,所以路径
生成的目录名称中缺少分隔符“/”。
有一个专门的方法stringByAppendingPathComponent
,但是
已在 Objective-C 中弃用,在 Swift 中不再可用。
您应该使用 URLByAppendingPathComponent
对 URL 进行操作
相反:
let extensionLogDirectory = containerUrl?.URLByAppendingPathComponent("AppExtensionLogs").path