Slide 1

Slide 1 text

B U I L D M O B I L E A P P S FA S T E R W I T H A W S A P I G AT E WAY H T T P S : / / A L E X TA M O Y K I N . C O M

Slide 2

Slide 2 text

A L E X TA M O Y K I N F O R M E R LY: A W E S O M E N E S S T V / D R E A M W O R K S , V I C T O R I O U S , Z E S T F I N A N C E C T O @ S H U T T L E F I N A N C E C O - O R G A N I Z E R : C O C O A H E A D S L A L O V E

Slide 3

Slide 3 text

A G E N D A • W H Y • W H AT 
 • H O W

Slide 4

Slide 4 text

W H Y L E T ’ S S TA R T W I T H

Slide 5

Slide 5 text

A P P S A R E A P I P O W E R E D

Slide 6

Slide 6 text

T Y P I C A L N E T W O R K A R C H I T E C T U R E Request Model From JSON View Controller Back End iOS

Slide 7

Slide 7 text

S I M P L I F I E D N E T W O R K A R C H I T E C T U R E View Controller Back End iOS Generated API Gateway Package

Slide 8

Slide 8 text

W H AT

Slide 9

Slide 9 text

A W S A P I G AT E WAY S E R V I C E S E R V I C E S E R V I C E S E R V I C E API Gateway

Slide 10

Slide 10 text

H O W I T L O O K S

Slide 11

Slide 11 text

G E N E R AT E S D K

Slide 12

Slide 12 text

H O W

Slide 13

Slide 13 text

B A C K E N D A P I P R O T O C O L protocol BackEndAPIType { func createUser( name: String, completion: @escaping ((NetworkResult) -> Void)) ... }

Slide 14

Slide 14 text

N E T W O R K R E S U LT enum BackEndAPIError: Error { case missingData case mockConfiguration case other(error: Error) } enum NetworkResult { case success(ModelResult) case failure(BackEndAPIError) }

Slide 15

Slide 15 text

A P I E R R O R enum BackEndAPIError: Error { case missingData case mockConfiguration case other(error: Error) }

Slide 16

Slide 16 text

L I V E B A C K E N D I N I T I A L I Z E R class LiveBackEndAPI: BackEndAPIType { let client: MyBackEndAPIClient init(apiKey: String? = nil, baseURL: URL? = nil, client: MyBackEndAPIClient = MyBackEndAPIClient.default()) { self.client = client if let apiKey = apiKey { self.client.apiKey = apiKey } if let baseURL = baseURL { let endpoint = AWSEndpoint(region: client.configuration.regionType, service: .APIGateway, url: baseURL) self.client.configuration.baseURL = baseURL self.client.configuration.endpoint = endpoint } }

Slide 17

Slide 17 text

L I V E B A C K E N D I M P L E M E N TAT I O N func createUser(name: String, completion: @escaping ((NetworkResult) -> Void)) { client.userPost(name: name).continueWith { task in self.processExpectingData(task: task, completion: completion) return nil } } private private func processExpectingData(task: AWSTask, completion: ((NetworkResult) -> Void)) { if let error = task.error { completion(.failure(.other(error: error))) } else if let result = task.result { completion(.success(result)) } else { completion(.failure(.missingData)) } }

Slide 18

Slide 18 text

M O C K B A C K E N D class MockBackEndAPI: BackEndAPIType { func createUser(name: String, completion: @escaping ((NetworkResult) -> Void)) { completeWithMockUser(name: name, completion: completion) } private func completeWithMockUser(name: String, completion: ((NetworkResult) -> Void)) { guard let user = User() else { assertionFailure("Failed to create a mock version of a model. Make sure the mock models are used correctly.") completion(.failure(.mockConfiguration)) return } user.name = name completion(.success(user)) } }

Slide 19

Slide 19 text

D E FA U LT A P I struct BackEndAPI { static let APIKey = "super_secure_key" static let baseURL = URL(string: "https:// api.example.com") static var defaultAPI: BackEndAPIType { if ProcessInfo.isRunningTests { return MockBackEndAPI() } else { let liveBackEnd = LiveBackEndAPI(apiKey: APIKey, baseURL: baseURL) return liveBackEnd } } }

Slide 20

Slide 20 text

A N D T H AT ’ S I T

Slide 21

Slide 21 text

S H O U L D Y O U U S E I T ? I T D E P E N D S

Slide 22

Slide 22 text

E X I S T I N G P R O J E C T S

Slide 23

Slide 23 text

N E W P R O J E C T S

Slide 24

Slide 24 text

W H AT W E C O V E R E D • W H Y • W H AT 
 • H O W

Slide 25

Slide 25 text

F O C U S O N W H AT M AT T E R S M O S T

Slide 26

Slide 26 text

G R A C I A S H T T P S : / / A L E X TA M O Y K I N . C O M @ F S P R O R U