00:00:00 ◼ ► Welcome to Under the Radar, a show about independent iOS app development. I'm Marc Warment.
00:00:09 ◼ ► >> So today we wanted to talk about having to remove features of the apps. And this is,
00:00:20 ◼ ► whether like you really have to remove something. It's kind of a blurry line of like, are you
00:00:30 ◼ ► remove it or are you removing it because you don't like the feature anymore or it's too
00:00:35 ◼ ► hard to support or something like that. And I've done a lot of both, honestly, more the
00:00:43 ◼ ► latter than the former, honestly. But I think what I'm facing this summer is I'm having
00:00:52 ◼ ► to remove the send to watch feature from Overcast. This is a feature that would use the iPhone
00:00:59 ◼ ► app to transcode the podcast file to a smaller size and then set in bacon smart speed and
00:01:06 ◼ ► then send it over Bluetooth to the watch and then the watch would have its own little copy
00:01:11 ◼ ► of the file and then it could play the file directly from the watch to a pair of Bluetooth
00:01:16 ◼ ► headphones if you were, you know, out running with the watch and didn't have your phone
00:01:21 ◼ ► with you. This is a feature that people had requested for ever since the first watch came
00:01:33 ◼ ► stand alone playback, you know, playback without your phone. And basically, and this feature
00:01:38 ◼ ► I, it took me a very, very long time to get this working. I worked a lot on it this past
00:01:42 ◼ ► winter. I've probably invested something like three or four months of development time into
00:01:46 ◼ ► just this feature. And the main problem I kept facing was the background audio playback
00:02:01 ◼ ► very low power device. And one thing that basically doesn't exist in watch OS is background
00:02:08 ◼ ► execution of apps. Like a few can do it, mainly like workout processing apps can do it. But
00:02:19 ◼ ► way audio apps on iOS are. You know, on iOS you have audio playback, VoIP, you have location
00:02:26 ◼ ► tracking like turn by turn directions. All these kinds of apps can stay in the background
00:02:31 ◼ ► indefinitely as long as the user is using them, they can keep staying in the background.
00:02:35 ◼ ► On watch OS, that list is much shorter. It's, and notably does not usually include audio
00:02:40 ◼ ► apps. And so there is, there are a few APIs you can use. The biggest one is the WK Audio
00:02:46 ◼ ► File Player API. But it's very, very rudimentary and honestly I've had a lot of problems and
00:02:53 ◼ ► shortcomings trying to use it, a lot of bugs, a lot of just missing features. Because the
00:02:58 ◼ ► way it works is it actually is out of process. You basically hand it a file URL and it plays
00:03:06 ◼ ► and then your app gets terminated in the background. And then, you know, at various times your
00:03:11 ◼ ► app could be woken back up again to be notified of stuff going on in the audio player. Maybe
00:03:15 ◼ ► if you're lucky or if the user interacts with you, you'll obviously wake up for that. But
00:03:24 ◼ ► to make a good audio playback experience, especially for things like podcasts that have
00:03:28 ◼ ► to be resumable, that have to save your position, stuff like that. And in, so for forever, for
00:03:35 ◼ ► months I was fighting these APIs. I was, I could not get a good experience out of watch
00:03:43 ◼ ► background audio playback. The problem was not sending the files over all of that. That
00:03:46 ◼ ► has its own problems of things like it's very, very slow, there's no way to detect the progress
00:03:51 ◼ ► of a transfer, which is very, very bad for the user experience. But even if you can get
00:03:57 ◼ ► past the transferring of the files or even if you could have the watch download the files
00:04:06 ◼ ► have the problem of background audio playback on watchOS. And so what happened was, this
00:04:12 ◼ ► past spring an app called WatchPlayer by Peter Knapp came out and it uncovered for me a new
00:04:18 ◼ ► method of basically if you said you were a workout processing app, you could use AV audio
00:04:26 ◼ ► player and use it directly and your app would stay running all the time without interfering
00:04:35 ◼ ► you want. It would stay in the background as audio was playing and allow you to do things
00:04:41 ◼ ► like save your position reliably and not have to deal with all the out of process bugs of
00:04:51 ◼ ► interaction with remote controls or the now playing screen, which is part of the problems
00:04:55 ◼ ► I have with the WK Audio File Player API. It has a lot of weird interactions there. Anyway,
00:05:01 ◼ ► so this was finally a way to fairly reliably play audio in the background on watchOS. So
00:05:07 ◼ ► I switched over to this method and I released this feature. And it turns out that this was
00:05:13 ◼ ► not intended to work this way by Apple. And so this feature no longer works this way in
00:05:21 ◼ ► watchOS 4. WatchOS 4, you can only, if you want background audio playback, you can only
00:05:26 ◼ ► use WK Audio File Player. All the, the method of saying you're a workout app to really play
00:05:44 ◼ ► out of process API. But that had a lot of problems and a lot of bugs and a lot of shortcomings.
00:05:51 ◼ ► And just weird behavior, like for instance it tries to hook into the remote control button
00:06:05 ◼ ► were to go to the now playing screen and hit the fast forward button. What that does for
00:06:10 ◼ ► WK Audio File Player is what you'd expect from music. It goes to the next track. Podcast
00:06:21 ◼ ► for podcast what you want is very, very different than that. And when you are controlling the
00:06:25 ◼ ► audio player and you have a proper remote control API like you do on iOS, you can interpret
00:06:30 ◼ ► that as whatever you want and you can do that. On watchOS, because this is all happening
00:06:42 ◼ ► right thing. So it just invalidates that file and seeks to the next one. If you are a podcast
00:06:54 ◼ ► File Q Player, whatever it's called. But you have no way to interpret that click as something
00:07:00 ◼ ► else or that fast forward command as something else. So it just ends the track you're listening
00:07:05 ◼ ► to and goes to maybe the next podcast or whatever else. And I tried so many crazy hacks with
00:07:10 ◼ ► this. So for instance, splitting up podcasts into like 10 second chunks and just giving
00:07:20 ◼ ► Yeah. Unsurprisingly, watchOS did not appreciate that approach for various resource limitations
00:07:27 ◼ ► I think. It probably didn't expect me to have a playlist with 400 entries of 10 second files.
00:07:38 ◼ ► WK Audio File Player to give an experience good enough for podcast listening. And basically
00:07:44 ◼ ► it just didn't happen. It didn't happen for the four months I was working on it last winter.
00:07:55 ◼ ► better than watchOS 4. It still has all of the same shortcomings and all these same bugs.
00:08:00 ◼ ► And yes, I have filed many radars and I have forwarded them to evangelists and things like
00:08:06 ◼ ► that. But the fact is, background audio playback I don't think is a very high priority on Apple
00:08:17 ◼ ► with things like iOS and getting the new phones out and all the new stuff for iPad and everything.
00:08:22 ◼ ► So while I have filed bugs and contented the appropriate people, I don't think these bugs
00:08:28 ◼ ► are going anywhere basically. The beta season is almost over and they haven't gone anywhere
00:08:32 ◼ ► so I wouldn't expect them to. So I'm faced with this decision of like, do I move to this
00:08:45 ◼ ► introduces all sorts of new problems and requires all sorts of crazy hacks like using a timer
00:08:56 ◼ ► A lot of bugs and a lot of weird workarounds that you have to do, polling things to see
00:09:00 ◼ ► if they're playing or if they're stalled because sometimes the is playing attribute is wrong.
00:09:11 ◼ ► are with this API. And so I can switch to that but it's going to be way, way worse than
00:09:17 ◼ ► it is now. And right now the feature is barely shippable as it is, like with the watchOS
00:09:22 ◼ ► 3 version that was barely shippable and I probably shouldn't have shipped it but I did.
00:09:34 ◼ ► this is complicated, like some people have said like well I can, I'll just leave my watch
00:09:43 ◼ ► I leave this feature in for everyone else, when they upgrade to watchOS 4 it stops working
00:09:46 ◼ ► even if I don't recompile the app for watchOS 4. And then second of all if I update my app
00:10:28 ◼ ► mad. And I've tried to warn them on Twitter ahead of time and say you know, hey just so
00:10:40 ◼ ► made and I'm also going to remove it like now rather than in a month and a half or whatever,
00:10:54 ◼ ► updates story to be a removal of a major feature. And I don't want all the one star ratings
00:11:00 ◼ ► that I'm definitely going to get by removing this feature to apply to my big iOS 11 update.
00:11:28 ◼ ► to make a lot of people angry. You're definitely going to get a lot of one star reviews. It's
00:11:44 ◼ ► people who love the rest of the app but they want this feature to work better so they say
00:12:04 ◼ ► biggest things that come to mind is at a certain point there's like the sunk cost fallacy
00:12:13 ◼ ► something that you should put more into it to save that effort that you put into it before.
00:12:28 ◼ ► feature? Or does this feature still make sense in and of itself? Like if I was coming at
00:12:46 ◼ ► especially as a one person developer, or even a small team, like you're the one thing that
00:12:52 ◼ ► you can't get more of is time and attention to work on your app and to make the part of
00:12:59 ◼ ► the app that 99.9% of your other users interact with better. And so the biggest things I'm
00:13:07 ◼ ► like, it is so hard to say, to just like accept the fact that this is going to be unfortunate
00:13:19 ◼ ► it could be indefinitely problematic for that very small group of people. But hopefully,
00:13:23 ◼ ► it's you know, for a month or something or for a couple of weeks when the you know, the
00:13:27 ◼ ► update comes out where this gets gets pulled. But the reality is trying to please that small
00:13:33 ◼ ► group of people indefinitely trying to sort of pile hacks on top of hacks of this crazy
00:13:44 ◼ ► some point just say, you know, we tried it, it didn't work. I'm very sorry, and move on
00:13:54 ◼ ► in a weird way, it's like the the reverse of the sunk cost fallacy is you start to think
00:14:03 ◼ ► it in what could I have done in the meantime, and you know, it's not that you want to just,
00:14:09 ◼ ► you know, only slightly try experimental interesting features. And if at the first sign of trouble
00:14:13 ◼ ► back out, because you know, a lot of the cool and interesting things that differentiate
00:14:27 ◼ ► workarounds and, you know, crazy hacks, like, I love that part of things. But I think at
00:14:31 ◼ ► a certain point, you have to decide, you know, is this does this continue to be worthwhile?
00:14:35 ◼ ► And it sounds like in your in your case, like, I absolutely agree that it's time for it
00:14:39 ◼ ► to go. And it's just going to be one of those things where they will, you can work on the
00:14:44 ◼ ► messaging around that you can try your best to kind of message that and maybe you'll end
00:14:48 ◼ ► up putting message maybe having messaging in the app to try and communicate that because
00:15:07 ◼ ► going on. But ultimately, it's like the being held hostage by a vocal minority is just going
00:15:17 ◼ ► is to just call it quits. I like that you're just you decided to do it early and the cycle
00:15:22 ◼ ► just get it done. And just put that to the side so you can focus on your next big updates
00:15:27 ◼ ► for iOS 11. Because, you know, once you've done it, the nice thing in many ways, at least,
00:15:35 ◼ ► like, I don't it's not like I work in a physical retail store, or something like that, where
00:15:41 ◼ ► if I do something that my customers don't like, they reach out to like, to me specifically,
00:15:46 ◼ ► in a like a physical way that I can't avoid. Like, if you make some make do something that
00:16:00 ◼ ► to make your app better for everyone else. Because almost certainly, like that is better
00:16:04 ◼ ► for the future of the app than trying to hold hold on to a feature. And like, in this case,
00:16:13 ◼ ► you have to make any change in an app is going to have this exact same experience. I think
00:16:19 ◼ ► like, if you change the font, or you change the color, or you change the layout, people
00:16:24 ◼ ► will be upset. Like there's just that is the that is the inevitable reality of any change.
00:16:29 ◼ ► But if that change is making the app better, then it's kind of essential to just develop
00:16:37 ◼ ► my indie career, with this feeling very personal about it. But at a certain point, I've had
00:16:42 ◼ ► to just develop a thick and thick enough skin to say, whatever, this is the I'm trying to
00:16:47 ◼ ► make the app as the best app that I can make it. And just go with that and hope and hope
00:16:52 ◼ ► that people accept that, you know, like, the majority, it's making it better for more people
00:16:57 ◼ ► is always almost certainly better than leaving it as it was for a small group of people.
00:17:04 ◼ ► This has been a lot of my rationale for for choosing to remove this feature now because
00:17:12 ◼ ► but I think what you what you just described and what I will now I guess coin the the the
00:17:18 ◼ ► lost opportunity cost tragedy. Like, I like I could have done so much more for the main
00:17:30 ◼ ► would have cost so much time, I probably wouldn't have started tackling it in the first place.
00:17:46 ◼ ► done relatively little to adapt the main app for iOS 11 because I keep getting stuck in
00:17:57 ◼ ► probably anybody. It's complicated and it's slow going. You know, like it's it's a very,
00:18:11 ◼ ► Bluetooth or Wi-Fi to the watch. And it also is very, you know, rudimentary performance
00:18:37 ◼ ► and more cumbersome. The cycles of developing and testing and debugging are all longer just
00:18:43 ◼ ► because it's this low power thing that's complex and tied to your phone. So watch development
00:19:03 ◼ ► to watch offline playback. And part of that, you know, the feature could be better. I'm
00:19:18 ◼ ► watch app for the amount of users it gets. You know, still by far like I have something
00:19:28 ◼ ► actives actually interact with it. Like they have it running in case they need it. Very
00:19:33 ◼ ► few people actually use it or interact with it more than just looking at it or glancing
00:19:44 ◼ ► my time allocation for the reality of the usage of the watch app and how expensive time
00:20:01 ◼ ► make real progress on the watch. It's difficult and it's expensive. So what I need to do now
00:20:14 ◼ ► it. Because that's what I'm focusing on for iOS 11. This is no secret. As we discussed,
00:20:28 ◼ ► I have a good amount of work still to do. All my table views in iOS 11 have weird animation
00:20:35 ◼ ► bugs and are broken because of the way that it changes table view sizing and everything.
00:20:38 ◼ ► I still haven't started dealing with that yet because I haven't had time. I keep losing
00:20:43 ◼ ► time to massive tar pits of watch development. So I just need to end the watch development
00:20:59 ◼ ► has to be a small scope. It has to be like this watch app will continue to work and I'm
00:21:09 ◼ ► the way is actually better without the offline feature because then I have back to a one
00:21:13 ◼ ► page interface and I don't have to link all these extra frameworks and everything so it
00:21:16 ◼ ► actually is way faster without the offline playback and it's easier to touch it without
00:21:29 ◼ ► better without this feature and it's more in line with the amount of time it has earned
00:21:41 ◼ ► are interacting with it every day, I want to make it really fast because 1% is not great
00:21:45 ◼ ► but it isn't like if I leave it without the offline playback, it isn't that big of a time
00:21:49 ◼ ► suck but that does not make it worth investing half of my development year into it when the
00:21:57 ◼ ► rest of the app needs attention to. Anyway, we are sponsored this week by Indeed Prime.
00:22:02 ◼ ► Indeed Prime helps tech talent such as yourself and other software developers and data scientists
00:22:07 ◼ ► simplify their job search and land their dream job. Indeed Prime candidates get immediate
00:22:13 ◼ ► exposure to the best tech companies with just one simple application to Indeed Prime. Companies
00:22:18 ◼ ► on Indeed Prime's exclusive platform message the candidates with salary information right
00:22:27 ◼ ► salary offer of $125,000 a year. Indeed Prime is 100% free for candidates, no strings attached,
00:22:34 ◼ ► 100% free for you. Sign up now at Indeed.com/Prime. Once again, Indeed.com/Prime. Thank you very
00:23:01 ◼ ► our apps because this is something that I've actually been struggling with a lot recently
00:23:17 ◼ ► And I think this loops back into this sort of this topic around removing features because
00:23:24 ◼ ► it is so easy to get stuck in these rabbit holes I find where you kind of you're working
00:23:36 ◼ ► the things that the traps that I am so easily fallen into are ones where you get like the
00:24:03 ◼ ► you had a lot of people requesting offline watch playback like from there you know this
00:24:08 ◼ ► was a highly requested feature since the watch came out great turns out point one percent
00:24:15 ◼ ► of people actually used it in practice right like and I think that is something that is
00:24:21 ◼ ► it's like the best way to remove a feature probably is to never had it in the first place
00:24:34 ◼ ► out of a city the situation you find yourself in now and I mean the reality is you're just
00:24:38 ◼ ► gonna have to sound you know it's like you just have to navigate it as best you can it's
00:24:52 ◼ ► effort to try and maximize the output from that because it is otherwise I end up spending
00:24:58 ◼ ► time on these apps around these features that you know I get the impression are well are
00:25:03 ◼ ► very desired but the reality is they're not in the common case they're these sort of these
00:25:08 ◼ ► edge case users or uses of the app or honestly even more problematic are the ones where they
00:25:15 ◼ ► change the core functionality to be slightly worse a custom or a special use case slightly
00:25:24 ◼ ► better like those are the situations where it's I think it's very important to when we're
00:25:30 ◼ ► going into these kinds of things it's like to take that step back and say like how many
00:25:44 ◼ ► what percentage of my apps of users in this case like have an Apple watch and like knowing
00:25:49 ◼ ► that number ahead of time you know like that is the absolute if every single person used
00:25:53 ◼ ► it well that would be this many people and like you can go down that road of being very
00:25:58 ◼ ► thoughtful about it ahead of time because otherwise you end up in you know in this situation
00:26:02 ◼ ► I've gotten myself in there many times myself where it's it's so easy to get sucked down
00:26:08 ◼ ► these these things that can become these like the like you think you said tar pits like that's
00:26:12 ◼ ► what it feels like sometimes very and almost certainly we're at our best when we're able
00:26:22 ◼ ► that core experience better and better and better and it's like the refining having the
00:26:28 ◼ ► it having the attention and the patience to refine the core experience over and over and
00:26:32 ◼ ► being okay with letting other opportunities go fall to the side because I think I don't
00:26:38 ◼ ► know if you ran into this but when I often run into with these kind of these side features
00:26:47 ◼ ► to be it's like I know this opportunity exists like there's here's this functionality here's
00:26:56 ◼ ► like it's a known thing it isn't this crazy novel invention that you've come up with it's
00:27:08 ◼ ► someone else is going to do it someone else is going to do it better and as a result like
00:27:14 ◼ ► they're going to have this runaway success that crushes you in your business like that's
00:27:25 ◼ ► it's possible like in the same way that it's possible to like win the lottery and in some
00:27:30 ◼ ► ways the odds are probably more similar it's like it's the there's a point oh one percent
00:27:35 ◼ ► chance of this that that that situation happening but the reality is the vast far more likely
00:27:58 ◼ ► can do but just would end up being this massive time suck is really hard but it's probably
00:28:05 ◼ ► an essential thing for us to do because otherwise we're just gonna you know like I don't know
00:28:09 ◼ ► what the next feature that you or I will are going to add to our apps that we're ultimately
00:28:16 ◼ ► our lumps when we remove it but almost certainly there's opportunities are going to keep presenting
00:28:35 ◼ ► that's fine I'm okay with the two touch what about the play button on the right side is
00:28:39 ◼ ► that is that good enough play button on the right side is perfect okay but it is an example
00:28:45 ◼ ► of like it's you that it's that core experience of you know of overcast like the optimizing
00:28:51 ◼ ► those are those then you know the behavior of playing a podcast is like a core experience
00:28:57 ◼ ► that should be perfect yeah and that's where you should be spending your time rather than
00:29:01 ◼ ► worrying about the side features that a few people use a few people love like there may
00:29:07 ◼ ► be super passionate and then like that's awesome but that's not most your users and that's
00:29:15 ◼ ► missing out on way bigger opportunities than missing out on this small small opportunity