gpt4 book ai didi

ios - 在保持向后兼容性的同时采用 os_log API

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:23:05 26 4
gpt4 key购买 nike

我正在尝试以一种为尚未采用最新版本操作系统(iOS 或 macOS)的库用户保持向后兼容性的方式向库添加对新日志记录和事件跟踪 API 的支持.我正在为每个级别的日志记录定义自定义日志记录宏,然后对于较旧的操作系统,回退到 NSLog。我已经开始工作了,但有一个问题。

新 API 要求您将任何非常量、非标量值显式标记为 public(如果您希望它们显示在日志输出中)。这是调用我的宏的样子:

UZKLogInfo("Reading file %{public}@ from archive", fileName);

使用包含 os_log(例如 iOS 10.0 或更高版本)的 SDK 可以很好地编译,但是当我使用较早版本进行编译时,我的宏会回落到 NSLog,我收到编译器警告:

Using 'public' format specifier annotation outside of os_log()/os_trace()

打印的日志行如下所示:

Reading file <decode: missing data> from archive

这是我的宏定义的简化版本(仅包括 info 定义并简化了条件:

#if UNIFIED_LOGGING_SUPPORTED
@import os.log;

#define UZKLogInfo(format, ...) os_log_info(OS_LOG_DEFAULT, format, ##__VA_ARGS__);
#else // Fall back to regular NSLog
#define UZKLogInfo(format, ...) NSLog(@format, ##__VA_ARGS__);
#endif

有什么方法可以从 format 中去除后备案例中的“{public}”文本(某种字符串替换?)?或者是否有另一种方法可以支持新旧 API 而不会放弃我一直在日志中显示的信息级别?我需要使用宏(根据 last year's WWDC session on the topic ,否则我会丢失调用站点元数据。

最佳答案

我选择在宏中进行 NSString 替换,并将编译器警告抑制为其中的一部分,因此可以对每一行进行替换,而不是对整个文件或项目进行全局替换.它看起来像这样:

#if UNIFIED_LOGGING_SUPPORTED
@import os.log;

#define UZKLogInfo(format, ...) os_log_info(OS_LOG_DEFAULT, format, ##__VA_ARGS__);

#else // Fall back to regular NSLog

#define _removeLogFormatTokens(format) [@format stringByReplacingOccurrencesOfString:@"{public}" withString:@""]
#define _stringify(a) #a
#define _nsLogWithoutWarnings(format, ...) \
_Pragma( _stringify( clang diagnostic push ) ) \
_Pragma( _stringify( clang diagnostic ignored "-Wformat-nonliteral" ) ) \
_Pragma( _stringify( clang diagnostic ignored "-Wformat-security" ) ) \
NSLog(_removeLogFormatTokens(format), ##__VA_ARGS__); \
_Pragma( _stringify( clang diagnostic pop ) )

#define UZKLogInfo(format, ...) _nsLogWithoutWarnings(format, ##__VA_ARGS__);
#endif

它的名字是这样的:

UZKLogInfo("Message: %@", anObjectToLog);

关于ios - 在保持向后兼容性的同时采用 os_log API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45022233/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com