What I Learned at DevWorld 2019

/Dev/World is a three day conference in Melbourne covering everything Apple-related. It was my first time there and it was incredible. All of the talks were excellent and everyone was welcoming and friendly.

These are my notes, published here mostly so that I can tie all the things I learned directly back to the people who taught me. Blockquotes are paraphrased from the talks.

Random Cool Stuff

iOS 13

Publishers define an output type and a failure type. Subscribers define an input type and a failure type. Subscribers can be passed to Publishers, but only if the input/output types and failure types match.

You also have to be aware of ownership. Publishers will be cancelled in certain circumstances if their return type is not strongly held.

Useful information for a Combine noob wondering why his print statements weren’t printing!

  • @TheColourFool updated us about SFSymbols. They may not be right for everyone and, sadly, may never be right for those of us who have spent any amount of time manually snapping anchor points in Illustrator to a pixel grid.
  • @MattDelves did a deep dive on moving an app onto multiple platforms, including using CoreData with CloudKit which is something I’ve wanted to explore with Trail Wallet. It seemed a bit too good to be true, although later discussions with him at the pub did assuage my concerns somewhat. I’m hopeful this is the syncing solution I’ve been waiting for.

Understanding Our Users

  • Zac (@zacfitzwalter) got me thinking about the onboarding of Trail Wallet. It’s a balance between getting users set up vs getting in their way. Perhaps there are better ways to slowly introduce features, although we later decided that in this instance onboarding is mostly fine provided there’s a way to cancel it. He then proceeded to kick my ass at Smash Brothers (yep, this is a theme).
  • @nicktmro brought Maori to the TradeMe app and, relevant given the recent article by the Palantir CEO, got me thinking that apps are part of our culture. Contrary to Palantir’s CEO: who we support, who we work with (or don’t), and who we welcome to our apps are all political acts. Like it or not, saying "we’ll work with anyone who pays us" is a political position and we as developers do have a duty to think about how our apps contribute to and define our society.
  • Related to this, phrenology is making a comeback in part because of the huge amount of facial recognition data that can be collected now. This data is the hammer, and so all of society’s challenges now look like nails. There are now companies claiming to tell us if someone is a terrorist based on facial recognition data *eyeroll*. @attacus_au‘s talk left me feel a little paranoid but her delightful knitting was a soothing antidote. This really stuck with me, though:

We love the things that tell us more about ourselves and we will spend a lot of money and time on them even if there is no science behind them.

  • Between his talk and his patient explanation later at the pub, @dbabbage helped me realise that I could be doing accessibility better:

Combining multiple label values into a single label/button with correctly hinted info can make it so much quicker for people to navigate apps and find the information they’re looking for.

So, for example, in Trail Wallet I have two labels for the day’s total. The first has the words "Total for Day" then beneath that another one has the amount, "£45.63".

Combining this into the larger amount label (bigger targets are better), the accessibility value would be "Total for Day" and the hint would be "£45.63". The smaller label would then disable its accessibility features.

As a user navigates, they would hear "Total for Day" then, if that’s what they were looking for, they can pause to hear the amount. This stops them having to listen to lots of irrelevant information over dozens of labels and can browse more complex UIs more efficiently.

Game Dev

  • @TheVoxelAgents‘ talk about the development of The Gardens Between was fascinating. The attention to detail in that game is off the charts and it got me thinking about how I approach my own game development. Everything is worth examining in the context of the narrative, including technical things like camera position.
  • Attention to detail was also a theme in @Mitchmcewan‘s talk about the development of Endless Runner X. They spent a lot of time balancing making things discoverable while maintaining the challenge and sense of surprise—iteration is everything in game design. How they tested and gathered feedback was also of particular interest.

Related to this, I showed a couple of people my adventure game engine over the three days and it really was eye-opening. The assumptions I made about how people would interact with it were way off and I’ve already made a bunch of changes based on the few people I observed playing it.

It’s important to get the game into people’s hands early and often.

Useful Code Snippets

  • Still lots of issues with self-sizing table view cells, but this is a neat trick to get the UI to update correctly by @layoutSubviews:

The important part are the matched calls to begin/endUpdates().

func tableView( _ tableView : UITableView, didSelectRowAt indexPath: IndexPath ) {
    let cell = tableView.cellForRowAt( indexPath) as! MyCell
    // Make some changes that affect the layout. Doing this but nothing else will cause clipped content. 
    cell.label.fontSize = 100
    // We have to force the table view to recalculate the cell size and update the UI
  • @QuangDecember showed me it’s possible to delete an app during a UI Test:

It’s important to be aware of is that the app icon may appear twice (home screen and dock) and you have to target the correct one.

class Springboard {
    static let springboard = XCUIApplication(privateWithPath: nil, bundleID: "com.apple.springboard")

    class func deleteMyApp(testCase : XCTestCase) {
        // Force delete the app from the springboard
        let icon = springboard.otherElements["Home screen icons"].icons[""]
        if icon.exists {


            // waitForExistence is a custom method that sets and waits for an expectation
            springboard.alerts.buttons["Delete"].waitForExistence(timeout: 5)

Things to Look In To

I now have a long list of other technologies I’d like to explore:

  • @emoryzanef got me interested in dusting off my AR Adventure Game concept with his talk on Reality Composer. Later at the bar, @ProxyBlue not only showed us how easy it was, but had me building fully functional AR prototypes on his phone! He also dug up some DevWorld pins for my collection (including an anvil!) which was a totally amazing way to make someone feel welcome.
  • @Stephrsharp showed that rich notifications (available since iOS 10) have a lot of possibilities that are worth exploring. I’m thinking of a reminder notification from Trail Wallet that could then be opened up into an input view that would enable users to add expenses right from that notification. Sadly, neither of us were up to the task of defeating @Taiomi and @mitchmcewan at Mario Kart.
  • @kitasuke‘s showed us that SwiftSyntax is an insanely powerful parser for Swift code and offers the ability to enforce coding standards or even do automatic code generation!
  • @Jimmyti‘s exploration of NFC was super interesting. I would love to explore the potential of reading and writing to NFC items, especially in the context of AR and real world adventure games.

And Finally…

  • Public speaking is hard, so kudos to everyone there who gave a talk. I quickly learned that reading from notes I’d scribbled down the day before is a very bad idea. However, there’s no way I would have dared do a 3 minute lightning talk with near zero preparation if I hadn’t have felt as welcomed as I did:

/Dev/World is an amazing conference and I highly recommend it. Special thanks to the organisers, @ParisBA, @The_McJones, @TonyGray, @TheMartianLife, and especially @Desplesda, who patiently suffered through a nervous demo of my adventure game nonsense like a gentleman.