印象笔记:我如何获得笔记的上传进度?

问题描述:

我的应用程序记录音频,然后创建一个ENNote,并将生成的音频文件作为资源(以及当前的日期和时间作为标题),并将此音符上传到Evernote。上传完成后,用户已收到通知。现在我也想显示上传进度。所以我使用这个功能:印象笔记:我如何获得笔记的上传进度?

ENSession.shared.upload(note, policy: .create, to: nil, orReplace: nil, progress: progressHandler, completion: completionHandler) 

一切正常,除了的progressHandler永远不会被调用。 我搜索Evernote的SDK,并发现这种代码在几个地方:

#if EN_PROGRESS_HANDLERS_ENABLED 
    if (context.progress) { 
     context.noteStore.uploadProgressHandler = context.progress; 
    } 
#endif 

这似乎有什么用它做。但是我必须说我对这个#if ...#endif语法不熟悉。我搜索了示例项目,并且找不到实际设置了EN_PROGRESS_HANDLERS_ENABLED值的地方。

我认为progressHandler只有在进程需要足够长的时间才会被调用,所以我记录了几分钟(4 MB)并上传了该记录。上传花费了更长的时间,但progressHandler仍然没有被调用。

我在互联网上搜索了很长时间,但没有运气。 为什么进程处理程序从不调用?我如何获得ENNote的上传进度?

这里是我的代码的相关部分:

private func sendToEvernote() { 
    let progressHandler: ENSessionProgressHandler = { progress in 
     self.progressView.progress = Float(progress) 
     self.progressView.alpha = 1 
     print("Progress:", progress) // Never gets printed 
    } 

    let completionHandler: ENSessionUploadNoteCompletionHandler = { (noteRef, error) in 
     if let error = error { print(error.localizedDescription) } 
     self.noteRef = noteRef 
     self.progressView.alpha = 0 
     self.showBanner(text: "Upload complete. Tap here to open in Evernote.") 
    } 

    do { 
     let note = ENNote() 
     let title = titleFromCurrentDate() 
     let filename = title + ".m4a" 

     note.title = title 

     let data = try Data(contentsOf: audioURL) 
     guard let resource = ENResource(data: data, mimeType: "audio/mp4a-latm", filename: filename) 
      else { 
       alert(title: "Export failed", message: "Audio file could not be attached to note.") 
       return 
     } 

     note.add(resource) 

     ENSession.shared.upload(note, policy: .create, to: nil, orReplace: nil, progress: progressHandler, completion: completionHandler) 
    } catch { 
     alert(title: "Export failed", message: "Audio file could not be converted to Data type.") 
    } 
} 

的答案是简单而悲伤:

“进度块弃用 - 变化可惜部分都意味着进步块在最新的SDK不再支持

https://github.com/evernote/evernote-cloud-sdk-ios/blob/master/3.0_Release_Notes.md

(编辑:据我了解,这意味着它目前是不可能获得上传进度。)


继Josh Caswell的回答之后,我添加了一个预处理器宏,该宏设置EN_PROGRESS_HANDLERS_ENABLED = 1。 (尽管我使用的是CocoaPods,但事实证明它的工作方式。)这样做给了我决定性的线索。控制台打印出来:“进度块已被弃用”。这句话的互联网搜索引导我进入上面引用的发布注释页面。我想我应该养成阅读发行说明的习惯。

(顺便说一句,在progressHandler现在接到电话,但只有一次,用1.0的进步,对于较长时间的录制时也是如此。)


没有乔什 - 卡斯威尔的回答,我不会没有发现。尽管如此,我仍然认为自己应该写出自己的答案,因为对于有这个问题的人来说,乔希的答案并不是问题的答案,尽管这是重要的一步。


编辑:现在我发现GitHub上已经有相应的issue了。

+1

对,很高兴你发布了更完整的解决方案。 –

嗯,这是一个预处理语句。这意味着如果在编译SDK时将符号EN_PROGRESS_HANDLERS_ENABLED定义为非零值,则内部代码将被包含(并执行)。

如果您的项目自己构建SDK,则可以将EN_PROGRESS_HANDLERS_ENABLED=1添加到包含SDK的目标的“预处理器宏”构建设置。 (如果您使用Cocoapods,you'll need to use a post-install hook。)如果SDK是预编译的,那么您运气不好。


注意,我不熟悉,在所有与Evernote的SDK,所以我不知道其他的后果可能是启用此设置的东西。

+0

听起来很有趣,我会尝试并回来。 - 顺便说一下,我看到你编辑了“快速”标签。 SDK是Objective-C,但我的代码是Swift,所以我认为我应该添加两个标签。 (这是讨论这个问题的正确的地方吗?) –

+0

哦,谢谢你:) –

+0

不客气。您使用Swift SDK的事实是无关紧要的。当然,你不一定知道,所以我明白你为什么包含标签。这两种方式都不是什么大不了的,但是把标签关掉会更准确些。 –