使用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还是我还在做错事。
谢谢
这是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来做同样的事情,它也会起作用。
解决方法:
fetchNote
呼叫所需的所有数据,即let resourceData = note?.resources[0].data.body
,你很好!您还可以使用guid
(使用fetchResource
作为参数)通过自己的note?.resources[0].guid
(不是它们的哈希)来提取单个资源。当然,您可能真的想使用hash-by-hash模式。在这种情况下...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发布正确的修复之前不要使用该方法。