Использование Objective C для чтения сообщений журнала, отправленных на консоль устройства - PullRequest
31 голосов
/ 27 мая 2011

Как мое приложение iOS может читать сообщения из журнала консоли устройства.Я хочу программно прочитать эти записи журнала (например, чтение файла?), Выбрать некоторые и отправить их по электронной почте для поддержки.

Мне известно об одном приложении для iPhone, которое позволяет просматривать журнал.Это имя Консоль.Однако я не могу понять, какие классы или API он использовал.Один человек предположил, что это было сделано с использованием функций ASL, но я не знаю, что это такое или где они документированы.

Мне также известно о нескольких альтернативах использованию NSLog, таких как NSLogger и CocoaLumberJack, но мыне готовы реализовать это в настоящее время.

Большое спасибо за любую помощь!

Ответы [ 4 ]

28 голосов
/ 27 мая 2011

Эта запись в блогах Cocoanetics содержит пример кода для доступа к системному журналу на iOS с использованием API ASL (Apple System Logger) ( man-страница ):

aslmsg q, m;
int i;
const char *key, *val;

q = asl_new(ASL_TYPE_QUERY);

aslresponse r = asl_search(NULL, q);
while (NULL != (m = aslresponse_next(r)))
{
    NSMutableDictionary *tmpDict = [NSMutableDictionary dictionary];

    for (i = 0; (NULL != (key = asl_key(m, i))); i++)
    {
        NSString *keyString = [NSString stringWithUTF8String:(char *)key];

        val = asl_get(m, key);

        NSString *string = [NSString stringWithUTF8String:val];
        [tmpDict setObject:string forKey:keyString];
    }

    NSLog(@"%@", tmpDict);
}
aslresponse_free(r);

Обратите внимание, что вам нужно опросить ASL, чтобы прочитать последние сообщения. Приведенный выше код также не будет работать при запуске на симуляторе iPhone, но он отлично работает на реальном устройстве.

Если вы не хотите бороться с C ASL API, взгляните на эту оболочку Objective C под названием ASLogger .

7 голосов
/ 21 сентября 2013

Начиная с IOS 7, этот метод больше не будет работать.Apple закрыла доступ к ASL по соображениям безопасности.

3 голосов
/ 31 июля 2015

Вот реализация Swift, если кто-то ее ищет:

static func systemLogs() -> [[String: String]] {
    let q = asl_new(UInt32(ASL_TYPE_QUERY))
    var logs = [[String: String]]()
    let r = asl_search(nil, q)
    var m = asl_next(r)
    while m != nil {
        var logDict = [String: String]()
        var i: UInt32 = 0
        while true {
            if let key = String.fromCString(asl_key(m, i)) {
                let val = String.fromCString(asl_get(m, key))
                logDict[key] = val
                i++
            } else {
                break
            }
        }
        m = asl_next(r)
        logs.append(logDict)
    }
    asl_release(r)
    return logs
}
0 голосов
/ 11 ноября 2016

Более старый способ, которым люди предлагали отлично работать до iOS 9, но это не будет работать с iOS 10 / XCode8.

В iOS10 / XCode8 появился новый способ ведения журнала, Унифицированная регистрация и отслеживание активности.

https://developer.apple.com/reference/os/1891852-logging#1682426 https://developer.apple.com/videos/play/wwdc2016/721/

Используйте это для входа:

https://github.com/SRGSSR/srglogger-ios

...