読者です 読者をやめる 読者になる 読者になる

「SwiftでResearchKit チュートリアル」をやってみた

ResearchKit Swift
  • 2015年10月8日追記:ConsentTask.swiftを修正しました。

まだまだ私のまわりでは利用者の少ないResearchKitですが、ちょっと使ってみたい実験フィールドがあり、昨日から勉強をしています。私にとっては公式ドキュメントよりも以下のチュートリアルが役に立ちました。

www.raywenderlich.com

consent, survey, active task

ResearchKitは医学研究のためのライブラリで、調査(アンケート)の質問のための様々な部品が用意されています。また、大きく分けると以下の3種類の質問があります。

  • consent
  • survey
  • active task

consentは調査対象者に同意を取る画面を生成する機能で、調査の趣旨や個人情報の取り扱いについて表示する機能や、クレジットカード決済のように本人に署名してもらう機能が用意されています。

surveyは調査の質問を生成する機能で、自由記述や選択式の質問だけでなく、尺度を聞くような質問もサポートされています。

active taskは調査対象者に特定の行動をしてもらい、その評価結果を取得する機能です。例えば、タブレット端末の画面をタップする反応性などを評価する機能が用意されています。

インストール

まずXcodeでSingle View Applicationを作成します。次に、GitHubからファイルを取得します。

$ git clone -b stable https://github.com/ResearchKit/ResearchKit.git

取得したファイルの中のResearchKit.xcodeprojをプロジェクトにドラッグします。

f:id:kaorumori:20150627010647p:plain

Embedded BinariesにResearchKit.frameworkを追加します。

f:id:kaorumori:20150627010811p:plain

f:id:kaorumori:20150627010838p:plain

同意画面の作成

同意画面を作成していきます。ConsentDocument.swiftというファイルを作成して、以下のように記述します。

import Foundation
import ResearchKit

public var ConsentDocument: ORKConsentDocument {
    
    let consentDocument = ORKConsentDocument()
    consentDocument.title = "Example Consent"
    
    //TODO: consent sections
    let consentSectionTypes: [ORKConsentSectionType] = [
        .Overview,
        .DataGathering,
        .Privacy,
        .DataUse,
        .TimeCommitment,
        .StudySurvey,
        .StudyTasks,
        .Withdrawing
    ]
    
    var consentSections: [ORKConsentSection] = consentSectionTypes.map { contentSectionType in
        let consentSection = ORKConsentSection(type: contentSectionType)
        consentSection.summary = "If you wish to complete this study..."
        consentSection.content = "In this study you will be asked five (wait, no, three!) questions. You will also have your voice recorded for ten seconds."
        return consentSection
    }
    
    consentDocument.sections = consentSections
    
    //TODO: signature
    consentDocument.addSignature(ORKConsentSignature(forPersonWithTitle: nil, dateFormatString: nil, identifier: "ConsentDocumentParticipantSignature"))
    
    return consentDocument
}

次にConsentTask.swiftというファイルを作成します。

import Foundation
import ResearchKit

public var ConsentTask: ORKOrderedTask {
    
    var steps = [ORKStep]()
    
    //TODO: Add VisualConsentStep
    var consentDocument = ConsentDocument
    let visualConsentStep = ORKVisualConsentStep(identifier: "VisualConsentStep", document: consentDocument)
    steps += [visualConsentStep]
    
    //TODO: Add ConsentReviewStep
    // let signature = consentDocument.signatures!.first as! ORKConsentSignature
    let signature = consentDocument.signatures!.first as ORKConsentSignature!
    
    let reviewConsentStep = ORKConsentReviewStep(identifier: "ConsentReviewStep", signature: signature, inDocument: consentDocument)
    
    reviewConsentStep.text = "Review Consent!"
    reviewConsentStep.reasonForConsent = "Consent to join study"
    
    steps += [reviewConsentStep]
    
    return ORKOrderedTask(identifier: "ConsentTask", steps: steps)
}

ViewController.swiftを以下のように編集します。

import UIKit
import ResearchKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func consentTapped(sender : AnyObject) {
        let taskViewController = ORKTaskViewController(task: ConsentTask, taskRunUUID: nil)
        taskViewController.delegate = self
        presentViewController(taskViewController, animated: true, completion: nil)
    }
}

extension ViewController : ORKTaskViewControllerDelegate {
    func taskViewController(taskViewController: ORKTaskViewController, didFinishWithReason reason: ORKTaskViewControllerFinishReason, error: NSError?) {
        //Handle results with taskViewController.result
        taskViewController.dismissViewControllerAnimated(true, completion: nil)
    }
}

あとはボタンを作成して、そのボタンのタップにViewControllerのconsentTappedを関連付けます。これで同意画面が動作するようになりました。surveyとactive taskも基本的なやり方は同様でした。

来月の実験(イベント)に向けて、ResearchKitを利用したアプリの開発を進めていく予定です。