Slide 1

Slide 1 text

Leah Culver - Breaker
 AltConf 2019 Writing stable iOS applications

Slide 2

Slide 2 text

Me Developer for 13 years 3x startup founder

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

• Find and follow friends • Share on Twitter, Facebook,
 Instagram, and Snapchat • Send episodes to friends and chat • Like episodes ❤ • Comment on episodes • Find new episodes
 based on likes, listens, and comments Breaker

Slide 5

Slide 5 text

One of the top podcast apps for iOS (Android coming soon!)

Slide 6

Slide 6 text

Launched 2 years ago - all Swift!

Slide 7

Slide 7 text

Crashes!

Slide 8

Slide 8 text

Why do we care about crashes?

Slide 9

Slide 9 text

jarring experience feels wrong broken!

Slide 10

Slide 10 text

What’s the alternative? Doesn’t quite work.

Slide 11

Slide 11 text

Common crashes

Slide 12

Slide 12 text

Force unwrapping optionals

Slide 13

Slide 13 text

let url = URL(string: "https://www.breaker.audio")! Simple example

Slide 14

Slide 14 text

let url = URL(string: "")! Simple example

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

Why? • Code refactor • Copy/pasted code • User-entered values • Something weird happened!

Slide 17

Slide 17 text

If-let if let url = URL(string: "https://www.breaker.audio") { print(url.absoluteString) }

Slide 18

Slide 18 text

Guard guard let url = URL(string: "https://www.breaker.audio") else { return } // Everything is chill. print(url.absoluteString)

Slide 19

Slide 19 text

Nil-coalescing let url: URL? = URL(string: "https://www.breaker.audio") print(url?.absoluteString ?? "No URL found.")

Slide 20

Slide 20 text

Just don’t do it!

Slide 21

Slide 21 text

@IBOutlet weak var titleLabel: UILabel? titleLabel?.text = show.name We’re hardcore.

Slide 22

Slide 22 text

Array index out of bounds

Slide 23

Slide 23 text

Simple example

Slide 24

Slide 24 text

Easy fix!

Slide 25

Slide 25 text

Easy fix!

Slide 26

Slide 26 text

Safe!

Slide 27

Slide 27 text

Misconfigured IBOutlets

Slide 28

Slide 28 text

Eek.

Slide 29

Slide 29 text

@IBOutlet weak var showNameLabel: UILabel? Renaming

Slide 30

Slide 30 text

Refactor

Slide 31

Slide 31 text

Refactor

Slide 32

Slide 32 text

Try out views?

Slide 33

Slide 33 text

UI updated
 on a background thread

Slide 34

Slide 34 text

Example Push notifications

Slide 35

Slide 35 text

Example

Slide 36

Slide 36 text

Easy fix!

Slide 37

Slide 37 text

Tools

Slide 38

Slide 38 text

Crash logging

Slide 39

Slide 39 text

Stack trace

Slide 40

Slide 40 text

Line 479

Slide 41

Slide 41 text

Safe!

Slide 42

Slide 42 text

Exception logging Don’t crash - just log it for later!

Slide 43

Slide 43 text

Exception logging

Slide 44

Slide 44 text

Exception logging

Slide 45

Slide 45 text

Tools?

Slide 46

Slide 46 text

1. Look for common crashes 2. Crash and exception logging What?

Slide 47

Slide 47 text

Thanks! Download Breaker. We’re hiring! https://www.breaker.audio

Slide 48

Slide 48 text

Photo credits https://www.flickr.com/photos/marian_e_may/24355452028 https://www.flickr.com/photos/ayesham/23746683041 https://www.flickr.com/photos/dubwise_version/4718137117 https://www.flickr.com/photos/esperbot/41779302514 https://www.flickr.com/photos/stewdean/9782073011 https://www.flickr.com/photos/speedoflife/8345885557 https://www.flickr.com/photos/sanspeur/2420943099 https://www.flickr.com/photos/lash9420/7112309139 https://www.flickr.com/photos/avidlyabide/6545946991 https://www.flickr.com/photos/linvoyage/14463878257 https://www.flickr.com/photos/sk8geek/3438835775 https://www.flickr.com/photos/swisscan/2514879116 https://www.flickr.com/photos/w4yn3drb/7081697671