Xcode 12 和 OSLog (os.log):包装 OSLogMessage 导致编译错误:参数必须是字符串插值

Kev*_*n R 5 string xcode string-interpolation swift oslog

在 Xcode 12 / iOS 14 中,OSLog 获得了对字符串插值的支持(是的!)。但是仍然无法附加钩子来轻松登录到其他渠道,例如 Crashlytics。

所以我想我会做一个简单的包装器并传递参数。然而,字符串插值似乎发生了一些神奇的事情。

提供的新 Logger 类,它接受一个OSLogMessage作为参数,可以按如下方式使用:

let someVar = "some var"
let logger = Logger(subsystem: "com.my.app", category: "UI")

logger.error("some message")
logger.error("some message with default var: \(someVar)")
logger.error("some message with private var: \(someVar, privacy: .private)")
logger.error("some message with private var: \(someVar, privacy: .private(mask: .hash))")
logger.error("some message with public var: \(someVar, privacy: .public)")
Run Code Online (Sandbox Code Playgroud)

包装新的 Logger 结构

所以让我们把它包装在一个结构中:

struct MyLogger {
    let logger = Logger(subsystem: "com.my.app", category: "UI")

    func error(_ message: OSLogMessage) {
        logger.error(message)
    }
}
Run Code Online (Sandbox Code Playgroud)

相同的签名,但不幸的是,编译器不允许这样做:

ERROR: Argument must be a string interpolation
Run Code Online (Sandbox Code Playgroud)

此外,尝试调用我的结构也会导致一个奇怪的特定编译器错误:

let logger = MyLogger()
let value = "value"
logger.error("Some log message \(value, privacy: .public)")
Run Code Online (Sandbox Code Playgroud)

产量:

String interpolation cannot be used in this context; if you are calling an os_log function, try a different overload
Run Code Online (Sandbox Code Playgroud)

直接调用os_log(_: OSLogMessage)而不是新结构给出了相同的结果。

有没有办法解决这个问题?我错过了什么吗?

Sha*_*afa 14

来自苹果论坛

\n
\n

日志记录 API 使用特殊的编译器功能在编译时评估隐私级别。正如诊断所述,您必须使用 \xe2\x80\x98OSLogPrivacy\xe2\x80\x99 的静态\n(即在编译时已知)方法或属性;它\n不能是\xe2\x80\x99 在运行时计算的变量。这意味着您可以在不使用编译器内部功能的情况下为这些 API 创建自己的包装器。

\n
\n


小智 6

我只是使用这样的方法来解决限制:

struct MyLogger {
    let logger = Logger(subsystem: "com.my.app", category: "UI")

    func error(_ message: String) {
        logger.error("\(message)")
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这将破坏日志条目 - 所有消息都将从那里被删除 https://developer.apple.com/documentation/os/oslogprivacy/3578096-private (3认同)