Не удается создать действие OSLog на Swift - PullRequest
0 голосов
/ 07 августа 2020

Я хочу использовать действия OSLog для структурирования моих журналов, но я столкнулся с проблемой отсутствия необходимых констант активности в Swift, таких как OS_ACTIVITY_CURRENT и OS_ACTIVITY_NONE, и у меня возникает ошибка при попытке создать действие:

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 фреймворк имеет описания констант активности без каких-либо определений (но определяет флаги активности OS_ACTIVITY_FLAG_DEFAULT, OS_ACTIVITY_FLAG_DETACHED, OS_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.
 */

Если мы посмотрите в Obj C заголовки <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 или где я могу найти константы?

1 Ответ

0 голосов
/ 07 августа 2020

После некоторого исследования я обнаружил, что OS_ACTIVITY_CURRENT и OS_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

...