Evernote IOS SDK fetchResourceByHashWith抛出异常

问题描述 投票:4回答:1

使用Evernote IOS SDK 3.0我想从note中检索特定资源

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,auth,获取笔记本等等......所以这不是auth令牌的问题)

很高兴知道这是一个sdk bug还是我还在做错事。

谢谢

evernote
1个回答
2
投票

这是SDK的“EDAM”Thrift客户端存根代码中的错误。首先是分析,然后是你的解决方法。

Evernote的底层API传输使用带有documented schema的Thrift协议。 SDK框架包含一层自动生成的存根代码,可以为每个请求和响应正确地编组输入和输出参数。您正在注释商店调用基础getResourceByHash API方法,defined per the docs接受string类型的contentHash类型。但事实证明客户端正在将哈希值作为纯二进制字段发送。该服务无法解析请求,因此您在客户端上看到一般错误。这可能反映了API定义的演变,但更有可能这在iOS SDK中一直被打破(getResourceByHash可能没有看到很多用法)。如果你深入研究SDK的more recent Python version,或者实际上也是Java/Android version,你可以看到这种方法的不同模式:它表示它将编写一个字符串类型字段,然后实际发出一个二进制字段。奇怪的是,这很有效。如果你破解iOS SDK来做同样的事情,它也会起作用。


解决方法:

  1. 最好的建议是报告错误,并在note商店中避免使用此方法。您可以通过不同的方式获取资源数据:首先,您实际上获得了响应fetchNote呼叫所需的所有数据,即let resourceData = note?.resources[0].data.body,你很好!您还可以使用guid(使用fetchResource作为参数)通过自己的note?.resources[0].guid(不是它们的哈希)来提取单个资源。当然,您可能真的想使用hash-by-hash模式。在这种情况下...
  2. 您可以破解正确的协议行为。在SDK文件中,您需要将其作为项目的一部分构建,找到名为ENTProtocol.m的ObjC文件。找到方法+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发布正确的修复之前不要使用该方法。

© www.soinside.com 2019 - 2024. All rights reserved.