diff --git a/README.md b/README.md index 3ce4b5d..9df8fef 100644 --- a/README.md +++ b/README.md @@ -211,12 +211,12 @@ en el archivo creado, se colocará un código base, donde indique que partes ten import Foundation import ResearchKit -public var ConsentDocument: ORKConsentDocument{ +public var ConsentDocument: ORKConsentDocument { let consentDocument = ORKConsentDocument() consentDocument.title = "Introducción a ResearchKit" // O título de tu preferencia - // Tipos de secciones + // Tipos de secciones y sus contenidos let sectionTypes: [ORKConsentSectionType] = [ .overview, .dataGathering, @@ -228,40 +228,163 @@ public var ConsentDocument: ORKConsentDocument{ .withdrawing ] - // Contenido de las secciones let text = [ - "Sección 1: Bienvenido. Este estudio trata sobre...", - "Sección 2: Recopilación de datos. Este estudio recopilará datos...", - "Sección 3: Privacidad. Valoramos su privacidad...", - "Sección 4: Uso de datos. Los datos recopilados se utilizarán para...", - "Sección 5: Compromiso de tiempo. Este estudio le llevará aproximadamente...", - "Sección 6: Encuesta del estudio. Para este estudio, deberá completar una encuesta...", - "Sección 7: Tareas del estudio. Se le solicitará que realice estas tareas...", - "Sección 8: Retiro. Para retirarse del estudio..." + "Sección 1: Bienvenido. Este estudio trata sobre...", + "Sección 2: Recopilación de datos. Este estudio recopilará datos...", + "Sección 3: Privacidad. Valoramos su privacidad...", + "Sección 4: Uso de datos. Los datos recopilados se utilizarán para...", + "Sección 5: Compromiso de tiempo. Este estudio le llevará aproximadamente...", + "Sección 6: Encuesta del estudio. Para este estudio, deberá completar una encuesta...", + "Sección 7: Tareas del estudio. Se le solicitará que realice estas tareas...", + "Sección 8: Retiro. Para retirarse del estudio..." ] - // Agregar Secciones - for sectionType in sectionTypes { - let section = ORKConsentSection(type: sectionType) + // Crear secciones y añadirlas al documento de consentimiento + var sections: [ORKConsentSection] = [] + + for (index, sectionType) in sectionTypes.enumerated() { + let section = ORKConsentSection(type: sectionType) + let localizedText = NSLocalizedString(text[index], comment: "") + let localizedSummary = localizedText.components(separatedBy: ".")[0] + "." + + section.summary = localizedSummary + section.content = localizedText + sections.append(section) + } + + consentDocument.sections = sections - let localizedText = NSLocalizedString(text[sectionTypes.firstIndex(of: sectionType)!], comment: "") - let localizedSummary = localizedText.components(separatedBy: ".")[0] + "." + // Agregar la firma de consentimiento + let signature = ORKConsentSignature(forPersonWithTitle: "Participante", dateFormatString: nil, identifier: "ConsentDocumentParticipantSignature") + consentDocument.addSignature(signature) - section.summary = localizedSummary - section.content = localizedText + return consentDocument +} +``` - if consentDocument.sections == nil { - consentDocument.sections = [section] - } else { - consentDocument.sections!.append(section) - } - } +Para que el documento del consentimiento pueda ser activado, se requiere un tarea de consentimiento, por lo cual, se debe crear un archivo tipo Cocoa Touch Class, con la clase ORKOrderedTask, que lleve por nombre ConsentTask. Al que de igual manera se desarrollará un código base para que se vaya llenando de acuerdo a las necesidades, y como en el ConsentDocument se pusieron ya algunas secciones, se pondrán las misas para que haya una congruencia. - // Firmar Consentimiento - consentDocument.addSignature(ORKConsentSignature(forPersonWithTitle: "Participante", dateFormatString: nil, identifier: "ConsentDocumentParticipantSignature")) +``` +import UIKit +import ResearchKit - return consentDocument +public var ConsentTask: ORKOrderedTask { + + var steps = [ORKStep]() + + // Visualización de secciones + + let consentDocument = ConsentDocument + + // Sección 1: Bienvenido + let section1 = ORKInstructionStep(identifier: "consentSection1InstructionStep") + section1.title = "Bienvenido" + section1.iconImage = UIImage(systemName: "hand.wave") + section1.detailText = "Sección 1: Bienvenido. Este estudio trata sobre..." + steps += [section1] + + // Sección 2: Recopilación de datos + let section2 = ORKInstructionStep(identifier: "consentSection2InstructionStep") + section2.title = "Recopilación de datos" + section2.iconImage = UIImage(systemName: "doc.text") + section2.detailText = "Sección 2: Recopilación de datos. Este estudio recopilará datos..." + steps += [section2] + + // Sección 3: Privacidad + let section3 = ORKInstructionStep(identifier: "consentSection3InstructionStep") + section3.title = "Privacidad" + section3.iconImage = UIImage(systemName: "lock.shield") + section3.detailText = "Sección 3: Privacidad. Valoramos su privacidad..." + steps += [section3] + + // Sección 4: Uso de datos + let section4 = ORKInstructionStep(identifier: "consentSection4InstructionStep") + section4.title = "Uso de datos" + section4.iconImage = UIImage(systemName: "chart.bar") + section4.detailText = "Sección 4: Uso de datos. Los datos recopilados se utilizarán para..." + steps += [section4] + + // Sección 5: Compromiso de tiempo + let section5 = ORKInstructionStep(identifier: "consentSection5InstructionStep") + section5.title = "Compromiso de tiempo" + section5.iconImage = UIImage(systemName: "clock") + section5.detailText = "Sección 5: Compromiso de tiempo. Este estudio le llevará aproximadamente..." + steps += [section5] + + // Sección 6: Encuesta del estudio + let section6 = ORKInstructionStep(identifier: "consentSection6InstructionStep") + section6.title = "Encuesta del estudio" + section6.iconImage = UIImage(systemName: "list.bullet.rectangle") + section6.detailText = "Sección 6: Encuesta del estudio. Para este estudio, deberá completar una encuesta..." + steps += [section6] + + // Sección 7: Tareas del estudio + let section7 = ORKInstructionStep(identifier: "consentSection7InstructionStep") + section7.title = "Tareas del estudio" + section7.iconImage = UIImage(systemName: "pencil.and.outline") + section7.detailText = "Sección 7: Tareas del estudio. Se le solicitará que realice estas tareas..." + steps += [section7] + + // Sección 8: Retiro + let section8 = ORKInstructionStep(identifier: "consentSection8InstructionStep") + section8.title = "Retiro" + section8.iconImage = UIImage(systemName: "arrow.backward.circle") + section8.detailText = "Sección 8: Retiro. Para retirarse del estudio..." + steps += [section8] + + // Revisar y firmar + let signature = consentDocument.signatures!.first! + let reviewConsentStep = ORKConsentReviewStep(identifier: "ConsentReviewStep", signature: signature, in: consentDocument) + reviewConsentStep.text = "Revise el formulario de consentimiento." + reviewConsentStep.reasonForConsent = "Consentimiento para unirse al estudio" + steps += [reviewConsentStep] + + // Passcode/TouchID Protection + let passcodeStep = ORKPasscodeStep(identifier: "Passcode") + passcodeStep.iconImage = UIImage(systemName: "lock.circle") + passcodeStep.text = "Ahora creará un código de acceso para identificarse en la aplicación y proteger la información ingresada." + steps += [passcodeStep] + + // Completion + let completionStep = ORKCompletionStep(identifier: "CompletionStep") + completionStep.iconImage = UIImage(systemName: "checkmark.seal") + completionStep.title = "Bienvenido a bordo" + completionStep.text = "Gracias por unirse a este estudio." + steps += [completionStep] + + return ORKOrderedTask(identifier: "ConsentTask", steps: steps) } ``` +Para que al presionar el botón se acceda al consentimiento, es necesario crear la acción en el ConsentViewController, en el segue que se arrastró desde el botón, por lo cuál el código quedaría de la isguiente manera: + +``` + @IBAction func joinButtonTapped(_ sender: UIButton) { + let taskViewController = ORKTaskViewController(task: ConsentTask, taskRun: nil) + taskViewController.delegate = self + taskViewController.modalPresentationStyle = .fullScreen + present(taskViewController, animated: true, completion: nil) + } +``` + +también se necesita crear un metodo el cual se asegura de que la vista de la tarea se cierre automáticamente cuando el usuario termine o abandone la tarea, independientemente del motivo (reason) y se coloca debado de la acción del botón. + +``` + func taskViewController(_ taskViewController: ORKTaskViewController, didFinishWith reason: ORKTaskFinishReason, error: Error?) { + dismiss(animated: true, completion: nil) //Dismisses the view controller when we finish our consent task + + } +``` + +Al finalizar, se puede correr la aplicación y observar las diferentes secciones que ya se programaron: + + +![](imagenes/cel1.png) +![](imagenes/cel2.png) +![](imagenes/cel3.png) +![](imagenes/cel4.png) +![](imagenes/cel5.png) +![](imagenes/cel6.png) + +Debido a que los desarroladores de Apple, utilizan el idioma para hacer sus aplicaciones y el soporte, algunas de las secciones en la aplicación, podrían estar en idioma inglés. diff --git a/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate b/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate index 0d0001c..e61f0e6 100644 Binary files a/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate and b/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/RK-Journals/RK-Journals/Base.lproj/Main.storyboard b/RK-Journals/RK-Journals/Base.lproj/Main.storyboard index 2d4a3da..56e5a98 100644 --- a/RK-Journals/RK-Journals/Base.lproj/Main.storyboard +++ b/RK-Journals/RK-Journals/Base.lproj/Main.storyboard @@ -45,7 +45,7 @@ - + diff --git a/RK-Journals/RK-Journals/ConsentTask.swift b/RK-Journals/RK-Journals/ConsentTask.swift new file mode 100644 index 0000000..958b5dc --- /dev/null +++ b/RK-Journals/RK-Journals/ConsentTask.swift @@ -0,0 +1,99 @@ +// +// ConsentTask.swift +// RK-Journals +// +// Created by Juan David Lopez Regalado on 12/11/24. +// + +import UIKit +import ResearchKit + +public var ConsentTask: ORKOrderedTask { + + var steps = [ORKStep]() + + // Visualización de secciones + + let consentDocument = ConsentDocument + + // Sección 1: Bienvenido + let section1 = ORKInstructionStep(identifier: "consentSection1InstructionStep") + section1.title = "Bienvenido" + section1.iconImage = UIImage(systemName: "hand.wave") + section1.detailText = "Sección 1: Bienvenido. Este estudio trata sobre..." + steps += [section1] + + // Sección 2: Recopilación de datos + let section2 = ORKInstructionStep(identifier: "consentSection2InstructionStep") + section2.title = "Recopilación de datos" + section2.iconImage = UIImage(systemName: "doc.text") + section2.detailText = "Sección 2: Recopilación de datos. Este estudio recopilará datos..." + steps += [section2] + + // Sección 3: Privacidad + let section3 = ORKInstructionStep(identifier: "consentSection3InstructionStep") + section3.title = "Privacidad" + section3.iconImage = UIImage(systemName: "lock.shield") + section3.detailText = "Sección 3: Privacidad. Valoramos su privacidad..." + steps += [section3] + + // Sección 4: Uso de datos + let section4 = ORKInstructionStep(identifier: "consentSection4InstructionStep") + section4.title = "Uso de datos" + section4.iconImage = UIImage(systemName: "chart.bar") + section4.detailText = "Sección 4: Uso de datos. Los datos recopilados se utilizarán para..." + steps += [section4] + + // Sección 5: Compromiso de tiempo + let section5 = ORKInstructionStep(identifier: "consentSection5InstructionStep") + section5.title = "Compromiso de tiempo" + section5.iconImage = UIImage(systemName: "clock") + section5.detailText = "Sección 5: Compromiso de tiempo. Este estudio le llevará aproximadamente..." + steps += [section5] + + // Sección 6: Encuesta del estudio + let section6 = ORKInstructionStep(identifier: "consentSection6InstructionStep") + section6.title = "Encuesta del estudio" + section6.iconImage = UIImage(systemName: "list.bullet.rectangle") + section6.detailText = "Sección 6: Encuesta del estudio. Para este estudio, deberá completar una encuesta..." + steps += [section6] + + // Sección 7: Tareas del estudio + let section7 = ORKInstructionStep(identifier: "consentSection7InstructionStep") + section7.title = "Tareas del estudio" + section7.iconImage = UIImage(systemName: "pencil.and.outline") + section7.detailText = "Sección 7: Tareas del estudio. Se le solicitará que realice estas tareas..." + steps += [section7] + + // Sección 8: Retiro + let section8 = ORKInstructionStep(identifier: "consentSection8InstructionStep") + section8.title = "Retiro" + section8.iconImage = UIImage(systemName: "arrow.backward.circle") + section8.detailText = "Sección 8: Retiro. Para retirarse del estudio..." + steps += [section8] + + + // Revisar y firmar + let signature = consentDocument.signatures!.first! + let reviewConsentStep = ORKConsentReviewStep(identifier: "ConsentReviewStep", signature: signature, in: consentDocument) + reviewConsentStep.title = "Revision" + reviewConsentStep.text = "Revise el formulario de consentimiento." + reviewConsentStep.reasonForConsent = "Consentimiento para unirse al estudio" + steps += [reviewConsentStep] + + // Passcode/TouchID Protection + let passcodeStep = ORKPasscodeStep(identifier: "Passcode") + passcodeStep.iconImage = UIImage(systemName: "lock.circle") + passcodeStep.text = "Ahora creará un código de acceso para identificarse en la aplicación y proteger la información ingresada." + steps += [passcodeStep] + + // Completion + let completionStep = ORKCompletionStep(identifier: "CompletionStep") + completionStep.iconImage = UIImage(systemName: "checkmark.seal") + completionStep.title = "Bienvenido a bordo" + completionStep.text = "Gracias por unirse a este estudio." + steps += [completionStep] + + return ORKOrderedTask(identifier: "ConsentTask", steps: steps) +} + diff --git a/RK-Journals/RK-Journals/ConsentViewController.swift b/RK-Journals/RK-Journals/ConsentViewController.swift index 167e28e..2c06943 100644 --- a/RK-Journals/RK-Journals/ConsentViewController.swift +++ b/RK-Journals/RK-Journals/ConsentViewController.swift @@ -6,17 +6,28 @@ // import UIKit +import ResearchKitUI -class ConsentViewController: UIViewController { - +class ConsentViewController: UIViewController, ORKTaskViewControllerDelegate { + override func viewDidLoad() { super.viewDidLoad() - + // Do any additional setup after loading the view. } @IBAction func joinButtonTapped(_ sender: UIButton) { + let taskViewController = ORKTaskViewController(task: ConsentTask, taskRun: nil) + taskViewController.delegate = self + taskViewController.modalPresentationStyle = .fullScreen + present(taskViewController, animated: true, completion: nil) } + func taskViewController(_ taskViewController: ORKTaskViewController, didFinishWith reason: ORKTaskFinishReason, error: Error?) { + dismiss(animated: true, completion: nil) //Dismisses the view controller when we finish our consent task + + } } + + diff --git a/imagenes/cel1.png b/imagenes/cel1.png new file mode 100644 index 0000000..e83ce5e Binary files /dev/null and b/imagenes/cel1.png differ diff --git a/imagenes/cel2.png b/imagenes/cel2.png new file mode 100644 index 0000000..2574037 Binary files /dev/null and b/imagenes/cel2.png differ diff --git a/imagenes/cel3.png b/imagenes/cel3.png new file mode 100644 index 0000000..c93027d Binary files /dev/null and b/imagenes/cel3.png differ diff --git a/imagenes/cel4.png b/imagenes/cel4.png new file mode 100644 index 0000000..76c476c Binary files /dev/null and b/imagenes/cel4.png differ diff --git a/imagenes/cel5.png b/imagenes/cel5.png new file mode 100644 index 0000000..f96532b Binary files /dev/null and b/imagenes/cel5.png differ diff --git a/imagenes/cel6.png b/imagenes/cel6.png new file mode 100644 index 0000000..6b14d59 Binary files /dev/null and b/imagenes/cel6.png differ