Evernote:如何获取笔记的上传进度?

时间:2017-10-04 12:13:36

标签: ios objective-c evernote

我的应用程序记录音频,然后创建一个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.")
    }
}

2 个答案:

答案 0 :(得分: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并不熟悉,所以我不知道启用此设置会产生什么其他后果。

答案 1 :(得分:1)

答案简单而悲伤:

进度块的弃用 - 不幸的是,部分更改意味着最新的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,即使录制的时间更长。)

如果没有Josh Caswell的回答,我就不会发现。我仍然认为我应该写下自己的答案,因为对于有这个问题的人来说,Josh的答案不是问题的答案,尽管这是一个重要的一步。

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