无法在 Swift 上创建 OSLog activity

Can't create the OSLog activity on Swift

我想使用 OSLog 活动来构建我的日志,但我遇到了 Swift 上缺少 activity 常量的问题,例如 OS_ACTIVITY_CURRENTOS_ACTIVITY_NONE当我尝试创建 activity:

时出现错误
let activity = _os_activity_create(dso, strdup(name), 
OS_ACTIVITY_CURRENT, // Error: Static member 'OS_ACTIVITY_CURRENT' cannot be used on instance of type 'OSLogOutput'
OS_ACTIVITY_FLAG_DEFAULT)

os.activity 框架描述了 activity 没有任何定义的常量(但定义了 activity 标志 OS_ACTIVITY_FLAG_DEFAULTOS_ACTIVITY_FLAG_DETACHEDOS_ACTIVITY_FLAG_IF_NONE_PRESENT ):

/*!
 * @const OS_ACTIVITY_CURRENT
 *
 * @discussion
 * Create activity and links to the current activity if one is present.
 * If no activity is present it is treated as if it is detached.
 */

如果我们查看 ObjC headers <os/activity.h> 我们可以找到这些常量:

#define OS_ACTIVITY_NONE OS_OBJECT_GLOBAL_OBJECT(os_activity_t, _os_activity_none)
#define OS_ACTIVITY_CURRENT OS_OBJECT_GLOBAL_OBJECT(os_activity_t, _os_activity_current)

看来 OSLog 受限于 Swift 那么如何使用 OSLog 活动或在哪里可以找到常量?

经过一些研究,我发现 OS_ACTIVITY_CURRENTOS_ACTIVITY_NONE 可以使用 C-Interoperability 动态加载,因为它没有暴露给 Swift:

static let RTLD_DEFAULT = UnsafeMutableRawPointer(bitPattern: -2)
static let OS_ACTIVITY_NONE = unsafeBitCast(dlsym(RTLD_DEFAULT, "_os_activity_none"), to: os_activity_t.self)
static let OS_ACTIVITY_CURRENT = unsafeBitCast(dlsym(RTLD_DEFAULT, "_os_activity_current"), to: os_activity_t.self)

但为什么 os.log 框架提供了 API 而没有提供所需的常量,这看起来仍然很奇怪。

感谢https://nsscreencast.com/episodes/347-activity-tracing-in-swift