Evernote IOS SDK fetchResourceByHashWith создает исключение - PullRequest
0 голосов
/ 13 февраля 2019

Работа с Evernote IOS SDK 3.0 Я бы хотел получить определенный ресурс из заметки, используя

fetchResourceByHashWith

Вот как я его использую.Просто для этого примера, чтобы быть на 100% уверенным в правильности хэша, я сначала загружаю заметку с одного ресурса, используя fetchNote, а затем запрашиваю этот ресурс, используя его уникальный хэш, используя fetchResourceByHashWith (хэш выглядит правильно, когда я его печатаю)

ENSession.shared.primaryNoteStore()?.fetchNote(withGuid: guid, includingContent: true, resourceOptions: ENResourceFetchOption.includeData, completion: { note, error in
            if error != nil {
                print(error)
                seal.reject(error!)
            } else {
                let hash = note?.resources[0].data.bodyHash
                ENSession.shared.primaryNoteStore()?.fetchResourceByHashWith(guid: guid, contentHash: hash, options: ENResourceFetchOption.includeData, completion: { res, error in
                    if error != nil {
                        print(error)
                        seal.reject(error!)
                    } else {
                        print("works")
                        seal.fulfill(res!)
                    }})
            }
        })

Сбой вызова fetchResourceByHashWith при

Optional(Error Domain=ENErrorDomain Code=0 "Unknown error" UserInfo={EDAMErrorCode=0, NSLocalizedDescription=Unknown error})

Эквивалентная настройка работает на Android SDK.Все остальное до сих пор работает в IOS SDK (chunkSync, авторизация, получение записных книжек и т. Д., Поэтому это не проблема с токенами аутентификации)

было бы замечательно знать, если это ошибка SDK, или я все еще делаючто-то не так.

Спасибо

1 Ответ

0 голосов
/ 15 февраля 2019

Это ошибка в коде заглушки Thrift-клиента SDK "EDAM".Сначала анализ, а затем обходные пути.

Базовый API-интерфейс Evernote использует протокол Thrift с документированной схемой .Каркас SDK включает слой автоматически сгенерированного кода-заглушки, который должен правильно распределять входные и выходные параметры для каждого запроса и ответа.Вы вызываете базовый метод getResourceByHash API в хранилище заметок, который определен для документов , чтобы принять тип string для аргумента contentHash.Но оказывается, что клиент отправляет хэш-значение в виде чисто двоичного поля.Службе не удается проанализировать запрос, поэтому вы видите общую ошибку на клиенте.Это может отражать эволюцию в определении API, но, скорее всего, это всегда нарушалось в iOS SDK (getResourceByHash, вероятно, не видит большого использования).Если вы покопаетесь в более поздней версии Python SDK или даже в Java / Android версии , вы увидите другой шаблон для этого метода: он говорит он собирается написать поле строкового типа, а затем испускает двоичное.Странно, это работает.И если вы взломаете iOS SDK, чтобы сделать то же самое, он тоже будет работать.


Обходные пути:

  1. Лучший совет - сообщить об ошибкеи просто избегайте этого метода в хранилище заметок .Вы можете получать данные о ресурсах разными способами: во-первых, вы действительно получили все данные, которые вам нужны, в ответ на ваш звонок fetchNote, то есть let resourceData = note?.resources[0].data.body, и все хорошо!Вы также можете извлекать отдельные ресурсы, используя их собственные guid (не их хэш), используя fetchResource (используйте note?.resources[0].guid в качестве параметра).Конечно, вы действительно можете использовать шаблон доступа по хешу.В этом случае ...

  2. Вы можете взломать правильное поведение протокола .В файлах SDK, которые вам нужно будет собрать как часть вашего проекта, найдите файл ObjC с именем ENTProtocol.m.Найдите метод +sendMessage:toProtocol:withArguments.

У него есть одна строка, подобная этой:

[outProtocol writeFieldBeginWithName:field.name type:field.type fieldID:field.index];

Замените эту строку на:

[outProtocol writeFieldBeginWithName:field.name type:(field.type == TType_BINARY ? TType_STRING : field.type) fieldID:field.index];

Перестройте проект, и вы должны найти, чтоВаш фрагмент кода работает как положено. Однако это большой взлом , и хотя я не думаю, что это повлияет на другие методы хранилища заметок, возможно, что другие внутренние хранилища пользователей или другие вызовы внезапно начнут вести себя забавно.Также вам придется поддерживать взлом через обновления.Возможно, лучше сообщить об ошибке и не использовать метод, пока Evernote не опубликует правильное исправление.

...