19. Consent
ORKConsentDocument
โข public var sections: [ORKStepConsentSection]?
โข ORKStepConsentSectionโจ
public init(type: ORKConsentSectionType) โจ
tiene section types por defecto
21. Surveys
ORKNavigableOrderedTask
โข overrides `stepAfterStep`
- (ORKStep *)stepAfterStep:(ORKStep *)step withResult:(ORKTaskResult *)result
La usamos cuando queremos que nuestro proximo step, dependa del resultado del
step anterior, para esto de๏ฌnimos reglas ORKStepNavigationRule, como por ejemplo:
// if user answers 'No' take it to the end of the survey
let resultSelector = ORKResultSelector(resultIdentifier: "physical_activity_pain")โจ
let predicateNonEligibleSurvey = ORKResultPredicate.
predicateForBooleanQuestionResultWithResultSelector(resultSelector,expectedAnswer: false)
โจ
let predicateRule = ORKPredicateStepNavigationRule(resultPredicatesAndDestinationStepIdentifiers:
[(predicateNonEligibleSurvey,
summaryStep.identifier)])
โจ
physicalActivityTask.setNavigationRule(predicateRule, forTriggerStepIdentifier:"physical_activity_pain")
26. import UIKit
import ResearchKit
class WalkTillStationaryTaskStep: ORKActiveStep {
var maxStationaryDuration : NSTimeInterval!
static func stepViewControllerClass() -> AnyObject {
return WalkTillStationaryTaskStepViewController.self
}
override init(identifier: String) {
super.init(identifier: identifier)
self.shouldShowDefaultTimer = false
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.shouldShowDefaultTimer = false
}
// por defecto si no se define un stepDuration, la actividad comienza como finalizada
func startsFinished() -> Bool {
return false
}
}
Caso Particular
โข Terminar el step cuando el usuario deja de caminar por mas de un minuto
โข Subclass ORKActiveStep
โข Implementar stepViewControllerClass(), este mรฉtodo le dice al task view controller quรฉ Step view controller
instanciar cuando va a presentar este Step
27. โข Subclass ORKActiveStepViewController
import UIKit
import ResearchKit
import CoreMotion
class WalkTillStationaryTaskStepViewController: ORKActiveStepViewController {
โฆ
override func viewDidLoad() {
super.viewDidLoad()
self.customView = WalkTillStationaryContentView()
โฆ
override func start() {
super.start()
// Start Timers
self.startStationaryTimer()
self.startElapsedTimer()
// Start self recorders
// start tracking user activity
self.startUpdateActivity()
// start pedometer
self.startPedometer()
}
override func suspend() {
super.suspend()
motionActivitiyManager.stopActivityUpdates()
}
โฆ
private func stationaryTimerDidFire() {
// user has been stationary for more than one minute
self.suspend()
self.finish()
}
โฆ
28. โข Subclass ORKActiveStepCustomView โจ
provee la vista custom del view controllerโจ
public var customView: UIView?
โข Active step life cycleโจ
override start, suspend, resume, ๏ฌnish
โข Data collectionโจ
public var recorders: [AnyObject]? (read-only)
โจ
Los recorders se generan cuando comienza el step basรกndose en las `recorder
con๏ฌguration` para ese stepโจ
var recorderConfigurations = [ORKRecorderConfiguration]()
recorderConfigurations += [ORKPedometerRecorderConfiguration(identifier: "pedometer")]
โข Output directory โจ
taskViewController.outputDirectoryโจ
โข CoreMotion
29. var steps = [ORKStep]()
let countdownStep = ORKCountdownStep(identifier: "countdown_step")
countdownStep.stepDuration = 5.0
steps += [countdownStep]
var recorderConfigurations = [ORKRecorderConfiguration]()
recorderConfigurations += [ORKPedometerRecorderConfiguration(identifier: "pedometer")]
let walkingStep = WalkTillStationaryTaskStep(identifier: "walk_step")
walkingStep.title = NSLocalizedString("Continue walking as much as you can", comment: "")
walkingStep.text = NSLocalizedString("Hit the stop button to stop exercise", comment: "")
walkingStep.shouldContinueOnFinish = true
walkingStep.optional = false
steps += [walkingStep]
let task = ORKOrderedTask(identifier: โwalk_stationary_taskโ, steps: steps)
let taskViewController = ORKTaskViewController(task: activity.task, taskRunUUID: activity.taskUUID)
taskViewController.delegate = self
taskViewController.outputDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,
inDomains: .UserDomainMask).first!
self.presentViewController(taskViewController, animated: true, completion: nil)
Declaro el step para ser usado en una Task
31. if let results = taskResult.results as? [ORKStepResult] {
for stepResult: ORKStepResult in results {
for result: ORKResult in stepResult.results! {
if let questionResult = result as? ORKQuestionResult {
if let answer = questionResult.answer {
if questionResult.identifier == "ORKRegistrationFormItemEmail" {
// do something
}
}
}
if let questionResult = result as? ORKChoiceQuestionResult {
if questionResult.identifier == ActivitiesListRow.SurgicalHistoryIdentifier.rawValue {
// do something
}
Iterando por identi๏ฌer
Iterando por el tipo de result
32. HealthKit
import UIKit
import HealthKit
class DailyHealthManager {
static let sharedInstance = DailyHealthManager()
lazy var healthStore: HKHealthStore = HKHealthStore()
// MARK: Healthkit read and write values
let healthDataItemsToRead: Set<HKObjectType> = [
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)!,
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)!,
HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierFlightsClimbed)!
]
let healthDataItemsToWrite: Set<HKSampleType> = [
HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierStepCount)!
]
func getHealthAuthorization(completion: (success: Bool, error: NSError?) -> Void) {
// Get authorization to access the data
healthStore.requestAuthorizationToShareTypes(healthDataItemsToWrite, readTypes: healthDataItemsToRead) {
success, error in
completion(success:success, error:error)
}
}
โข Pedir autorizaciรณn para lecura y escritura de datos
33. private func queryDistance(predicate: NSPredicate?, _ sortDescriptor: NSSortDescriptor) {
let distance = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceWalkingRunning)!
let sumOption = HKStatisticsOptions.CumulativeSum
healthStore.executeQuery(
HKStatisticsQuery(quantityType: distance,
quantitySamplePredicate: predicate,
options: sumOption) { [unowned self] query, result, error in
if let sumQuantity = result?.sumQuantity() {
// do something
}
}
)
}
โข Queries