Требование согласия, прежде чем продолжить опрос в ResearchKit - PullRequest
0 голосов
/ 30 января 2020

Я сейчас создаю программу, которая хочет использовать ResearchKit. Прежде чем перейти к вопросам опроса, мне нужно будет получить согласие. Я использую учебник Рэя Вендерлиха (https://www.raywenderlich.com/1820-researchkit-tutorial-with-swift-getting-started) и мне нужно настроить этот код. Я уже пытался go включить часть моей программы для съемки, и я могу получить к ней доступ даже без разрешения.

import ResearchKit

public var ConsentTask: ORKOrderedTask {

    var ctr = 0

    let Document = ORKConsentDocument()
    Document.title = "Consent"

    //section types
    let sectionTypes: [ORKConsentSectionType] = [
        .overview,
        .dataGathering,
        .privacy
    ]

    let consentSections: [ORKConsentSection] = sectionTypes.map { contentSectionType in
        let consentSection = ORKConsentSection(type: contentSectionType)

        if ctr < sectionTypes.count {

            if ctr == 0 { 
                consentSection.summary = "Summary"
                consentSection.content = "Content"
            }

            else if ctr == 1 { //Data Gathering
                consentSection.summary = "Summary"
                consentSection.content = "Content"
            }

            else if ctr == 2 { //Privacy
                consentSection.summary = "Summary"
                consentSection.content = "Content"
            }

            ctr = ctr + 1
        }
        return consentSection
    }

    Document.sections = consentSections
    Document.addSignature(ORKConsentSignature(forPersonWithTitle: nil, dateFormatString: nil, identifier: "UserSignature"))

    var steps = [ORKStep]()

    let visualConsentStep = ORKVisualConsentStep(identifier: "VisualConsent", document: Document)
    steps += [visualConsentStep]

    let signature = Document.signatures!.first! as ORKConsentSignature
    let reviewConsentStep = ORKConsentReviewStep(identifier: "Review", signature: signature, in: Document)
    reviewConsentStep.text = "Review the consent"
    reviewConsentStep.reasonForConsent = "I agree"

    steps += [reviewConsentStep]

    //Completion
    let completionStep = ORKCompletionStep(identifier: "CompletionStep")
    completionStep.title = "Welcome"
    completionStep.text = "Thank you for helping!"
    steps += [completionStep]

    return ORKOrderedTask(identifier: "ConsentTask", steps: steps)
}

И в моем контроллере просмотра у меня есть

    @IBAction func consentTask(_ sender: Any) {

    if consentDone == false {
        let taskViewController = ORKTaskViewController(task: ConsentTask, taskRun: nil)
        taskViewController.delegate = self
        present(taskViewController, animated: true, completion: nil)
    }
    else if consentDone == true {
        //would they like to leave the study

    }
}

С моими усилиями поставить здесь флаг согласия.

    func taskViewController(_ taskViewController: ORKTaskViewController, didFinishWith reason: ORKTaskViewControllerFinishReason, error: Error?) {

    taskViewController.dismiss(animated: true, completion: {() in self.consentDone = true})
    print(consentDone)

}

Однако происходит следующее: если пользователь нажимает кнопку отмены в правом верхнем углу или делает в самом конце согласия, это будет запускаться всегда. Есть ли способ убедиться, что блок кода выполняется только после того, как все закончено? В идеале, после этого я хотел бы сделать этот флаг, чтобы пользователь уже закончил согласие. Я буду перенаправлять пользователя на другую страницу каждый раз после этого, пока пользователь не покинет исследование.

1 Ответ

0 голосов
/ 30 января 2020

После некоторых проб и ошибок я нашел ответ здесь: https://github.com/ResearchKit/ResearchKit/issues/919

Зная, что подпись пользователя означает, что пользователь закончил форму, мы можем сделать

  if result.identifier == "UserSignature"{
      print(result)
      let consentDoneAnswerResult = result as! ORKConsentSignatureResult
      let consentDone = consentDoneAnswerResult.consented
      print(consentDone)
  }

И это дает согласиеDone как истинное, когда форма заполнена, а не отменена.

...