Building ResearchKit apps on Kinvey
ResearchKit is Apple's iOS framework for medical research apps. From Apple's ResearchKit page -
ResearchKit is an open source framework introduced by Apple that allows researchers and developers to create powerful apps for medical research. Easily create visual consent flows, real-time dynamic active tasks, and surveys using a variety of customizable modules that you can build upon and share with the community.
ResearchKit provides developers a broad range of UI and model classes that make it easy to build workflows specific to medical research apps. ResearchKit leaves the responsibility of persistence and synchronization of data to the developer. This is where Kinvey comes in.
Kinvey provides a HIPAA compliant backend platform for healthcare apps, as well as SDKs that interface with the backend and add client side capabilities such as caching, user management, data synchronization etc. We integrated our iOS SDK with ResearchKit, so that developers have a toolkit to quickly spin up research apps that are backed by a compliant backend. The outcome of our integration is KinveyResearchKit, a SDK wrapper to ResearchKit that augments ResearchKit classes with Kinvey functionality.
Getting Started
Kinvey's ResearchKit integration is available in our open source github repository. The repo contains the "KinveyResearchKit" wrapper SDK and a sample called "ORKCatalog".
The Getting Started section of the README describes how to set up the codebase and test it out.
How it works
The KinveyResearchKit SDK contains classes that wrap ResearchKit and augment it with Kinvey functionality. The KinveyResearchKit SDK has two main components -
Model wrappers (subclasses of Result
)
These classes add property mapping and transformations, as described in our Data Store guide, to the ResearchKit model classes. These wrapper classes enable you to use all of ResearchKit's Result
subclasses with the full range of Kinvey Data Store functionality, including caching and sync. The code below shows a data store created to save TaskResult
objects to the backend. You can find this code in the ResultViewController
class in ORKCatalog
-
lazy var resultStore = DataStore<TaskResult>.collection(.network)
...
resultStore.save(taskResult) { savedResult, error in
...
}
Login flow
The KinveyResearchKit SDK extends the classes that implement the login workflow in ResearchKit. These subclasses add logic to manage users in the Kinvey backend. All the key user operations such as signup, login, logout, email verification etc are integrated with Kinvey's user store. The LoginStepViewController
class adds Kinvey login capabilities to the ResearchKit ORKLoginStepViewController
class, as shown in the snippet below.
open class LoginStepViewController: ORKWaitStepViewController {
open override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
User.login(username: email, password: password) {
switch $0 {
case .success(let user):
print(user)
self.goForward()
case .failure(let error):
print(error)
}
}
}
}
Using KinveyResearchKit in your own project
To illustrate how you can start using KinveyResearchKit in your own app projects, we modified Apple's ORKCatalog sample and made it a Kinvey-backed app. We made the following changes -
- Added framework dependencies to Kinvey and KinveyResearchKit.
- Added code in the AppDelegate to initialize Kinvey and login a user (as described in our Getting Started guide).
- Created a
DataStore
to saveORKResult
objects to Kinvey. For everyORKResult
, setting theResultViewController.result
property also saves the result to Kinvey (refer to the Data Store guide for details on how to save data to Kinvey)
What's next
We love to hear from developers about what they're building and where they'd like us to improve. Our ResearchKit integration is open source, and we welcome your contributions and feedback. Feel free to get in touch with us through github or Kinvey support.
Here are some things we have on our roadmap -
- Providing a wrapper SDK for CareKit.
- Adding support for ResearchStack on Android.