korhan bircan

Post on 15-Feb-2017

68 Views

Category:

Engineering

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Implementing a Feedback Tool Using Off-the-Shelf Backend ServicesKorhan Bircan, CocoaConf 2016

Auto Loan Tracker- Tool helps customers visualize the status of their loan.- Did you know tips:

- Late payments mean more interest- When you make a payment matters

Auto Loan Tracker

Auto Loan Tracker

Auto Loan Tracker- Shot in the dark

- Do customers read the tips?- Are they useful or confusing?

- How do you know your product actually helps people?- (Almost) No one fills out email surveys- Surveys are not real-time- Twitter really only covers edges of reactions

Feedback Tool

Behind the Scenes

Parse

CloudKit

CloudKit- Easy setup - Web dashboard, analytics - Public and private databases - Users need to enter iCloud credentials for the app

to save data - Push notifications when a record changes

Common Operations- Creating&Saving records:

let feedbackResponse = CKRecord(recordType: "FeedbackResponse") feedbackResponse.setValue(response, forKey: "question") publicDatabase.saveRecord(feedbackResponse) { record, error in // Handle error. }

- Querying&Updating records: let predicate = NSPredicate(format: "...") let query = CKQuery(recordType: "FeedbackResponse", predicate: predicate) publicDatabase.perform(query, inZoneWith: nil) { results, error in // Update and save record.. }

- Deleting records: // Query and find the record. publicDatabase.deleteRecordWithID(record.recordID, completionHandler: { recordID, error in // Handle error. })

Firebase- Standard 3rd party setup - Web dashboard (displays JSON), analytics, crash

reporting, advertising - Authenticate users with OAuth Services, Facebook,

Google, Git and Twitter, email/password, or even your own custom service

- Out-of-the-box disk persistence: FIRDatabase.database().persistenceEnabled = true

Firebase

Common Operations- Creating&Saving records:

let reference = FIRDatabase.database().reference() reference.childByAppendingPath("(user.uid)/response").setValue(response)

- Querying&Updating records: reference.queryOrderedByChild("response").observeEventType(.Value, withBlock: { snapshot in // snapshot.children has the response objects. }

- Getting Change Notifications: reference.observe(.value, with: { snapshot in // Do something with the updated data (snapshot.value). })

- Deleting records: objectReference.remove()

ComparisonParse CloudKit Firebase

Setup 🙂 😄 🙂

Dashboard 😄 🙂 😐

Storage size 😐 😄 😐

Security 🙂 😄 🙂

Ease of use 😄 🙂 😐

Data export 😄 😢 😄

Future proof 😢 😄 🤔

Real life testing 🙂 😄 🙂

Disk Persistence 🙁 🙁 😄

Cross-platform 😄 🙂 😄

What we learned- The feature motivates people to pay on time. - Customers want to request new features. - Feedback went from 1% to 14%. - We now know what works and weave them into

future products - Choose right tool for the specific job. - Decouple modules.

Thank you!

A better feedback experience = A better overall experience

top related