00:00:00 ◼ ► Welcome to Under the Radar, a show about independent iOS app development. I'm Marco Arment.
00:00:05 ◼ ► And I'm David Smith. Under the Radar is never longer than 30 minutes, so let's get started.
00:00:47 ◼ ► I would say this summer we got a pretty substantial turnaround on that. I think that there was
00:00:52 ◼ ► a clear, like my overall theme for like, if I had to give a theme for WatchOS this year,
00:01:12 ◼ ► look a gift horse in the mouth. And just like, we're also on the functional level, though.
00:01:16 ◼ ► We've got so many more capabilities. We can do all of these different things that we've been clamoring for,
00:01:21 ◼ ► we're going to do weird, crazy hacks to work around for. And just in general, it seemed like
00:01:26 ◼ ► the goal for this year was to raise the bar in terms of capability for the Apple Watch,
00:01:31 ◼ ► which is something that I really appreciate. I think it's something that I've been hoping would happen, and I think is
00:01:36 ◼ ► fun now as someone who's been doing this for a long time, to be able to kind of get rid of,
00:01:41 ◼ ► delete out of my app all of these weird hacks and all this hard work that I had to do initially,
00:02:01 ◼ ► Yeah, me too. My thrill is more specific. It's more specific to some of the new APIs they added that
00:02:11 ◼ ► General Watch Kit, I mean, I really have had a rocky relationship with the Watch Kit in the past.
00:03:06 ◼ ► all the code on the phone and just doing this remote interface thing, was incredibly slow and unreliable
00:03:31 ◼ ► It's almost shocking how little you can do. If you look at the documentation for things like WK interface
00:04:01 ◼ ► run, debug, build, or whatever that's called, the cycle of running on device or running on
00:04:06 ◼ ► simulator to make some changes, test some stuff, deploy it, see how it runs, see how it works
00:04:41 ◼ ► change something and hit build and run, it's almost fast enough to see it on there. It's almost reliable
00:05:16 ◼ ► I'm really insulting this, and to some degree I am because Watch OS and Watch Kit still are nowhere near where they need to be,
00:05:21 ◼ ► but I give them a pass for a while because it was an early platform, it was very constrained hardware, etc.
00:05:56 ◼ ► It's those two things, there's a bunch of other stuff too, the MPNowPlayingInfoCenter, MPRemoteCommandCenter,
00:06:06 ◼ ► people not use my app at all or making them actually delete my app so the NowPlayingWidget would show more often,
00:06:11 ◼ ► were the lack of a volume control and the lack of stand-alone playback. So I now have those
00:06:41 ◼ ► Yeah, I think that's so much of it. It's just like these things are now, it's still, it's probably fair to say,
00:06:51 ◼ ► Which in some ways I like, there's a part of me that enjoys that, that it's a difficult challenge,
00:07:36 ◼ ► kind of demonstrated that in a lot of ways, that they're not doing clearly, they're not
00:07:56 ◼ ► that commitment is encouraging, that if you're going to go through how difficult and how challenging watchOS
00:08:01 ◼ ► development can be, both at the technical level as well as just the experiential level,
00:08:11 ◼ ► And they gave me my big wish. So if you remember one of the earlier episodes this year,
00:08:16 ◼ ► one of my big wishes for this 30 years at WWDC was that they were going to drop support for the first generation
00:08:26 ◼ ► dropped support for that first generation Apple Watch, which I think will make so many things
00:08:36 ◼ ► watch type, it seems like a no-brainer that they made this choice. So that first generation watch
00:08:56 ◼ ► obviously there's the added variable now of their old watches are being made obsolete, but
00:09:36 ◼ ► which are the three generations of processor, the Series 3 chip is now the most popular processor,
00:09:56 ◼ ► really embrace the future and be a bit more aggressive, because performance-wise, the watches are just
00:10:01 ◼ ► that much more capable. And that I think also has allowed Apple to do things with the OS, to give
00:10:11 ◼ ► support for the earliest, most rudimentary version of the hardware at the same time they
00:10:16 ◼ ► made watchOS more capable. I mean, part of that is, they just had one more year to make
00:10:26 ◼ ► because it was a new platform. So part of that is software maturity. But also part of that is like, that
00:10:31 ◼ ► Series 1 watch had significant constraints on the hardware. I mean, they all still do, but that one
00:10:36 ◼ ► was like excessive constraints on the hardware. It was very, very slow. It had very little memory.
00:10:46 ◼ ► very long, or to keep the display on for very long, or to keep apps open for very long. So like, it
00:10:56 ◼ ► And now, the market of technology has made these awesome new watches that are still very
00:11:11 ◼ ► And that's, I have a feeling in large part to do with their ability to finally drop that
00:11:18 ◼ ► Yeah, and so it's great. So I mean, we should probably dive into some of the changes that we can do now. And I guess the big
00:11:33 ◼ ► real background audio. It wasn't this weird thing where like I could do background audio in Workouts++ because
00:11:48 ◼ ► This year at W2C, it's like, this was sort of this like slightly slightly like, uh-uh, bad
00:11:53 ◼ ► news, like shaky finger, like don't do that. You don't need to be a workout app in order to do audio now.
00:11:58 ◼ ► So yeah, it was basically like now if you want to play audio, you can just be an audio app and not have to
00:12:23 ◼ ► internally for people who would be like, look, this is dumb. Why do we allow this for workout apps,
00:12:33 ◼ ► workout apps are allowed to actually stay running in the background continuously. Their process stays
00:12:38 ◼ ► active so that they can keep running instructions. The way audio has been done on iOS has always been that way too.
00:12:43 ◼ ► As soon as background audio was introduced, and I think it was iOS 3, whenever that was, 3 or 4.
00:12:53 ◼ ► you know, your app just stays running in the background. You know, your process stays awake. You can keep executing
00:13:03 ◼ ► either you could be a workout app and use the AV Foundation stuff, which is what you did, or
00:13:18 ◼ ► obtuse and limited and seemed to be designed by somebody who never actually tried to do anything
00:13:28 ◼ ► where you basically couldn't ship something with that. Like, it was almost unshippable for
00:13:43 ◼ ► honestly, that was clearly not possible for them to do because they would have done it by now.
00:13:58 ◼ ► the ability for our app to keep running in the background and execute code while audio is playing, which allows
00:14:03 ◼ ► lots of critical and helpful functionality, for something like a podcast player where you want to do things like
00:14:23 ◼ ► massive shortcomings and bugs that I ran into when I tried it and made that big blog post.
00:14:53 ◼ ► It was a mess. And there was stuff like that. There was things like, there was no volume control for things
00:14:58 ◼ ► that were connected to the watch. So, like, your AirPods connected to your watch have a volume,
00:15:03 ◼ ► they have a concept of volume, but the app had no control over that and no way to embed a volume widget.
00:15:08 ◼ ► Like the crown one in the now playing view, there was no way to do that in a third party app.
00:15:18 ◼ ► leave the app or try to use Siri on your AirPods to adjust your volume. That's horrible.
00:15:33 ◼ ► buttons or if you're using the AirPods you can do the double tap thing or you can do the Siri commands.
00:15:43 ◼ ► and to play or pause the content or to skip forward or to skip back or anything like that. There was just no capability for that at all.
00:15:53 ◼ ► an AV audio session to prompt the user which audio route they want to send it to, which Bluetooth
00:15:58 ◼ ► headphones if they don't have any it will tell them that and it will actually tell you the app, it will tell you that as well.
00:16:03 ◼ ► So you can like, you know, not update the UI to be in a playing state if it can't actually play.
00:16:23 ◼ ► So I'm really pleasantly surprised that they felt it justified to spend the time on this
00:16:58 ◼ ► where the simulator just decides, you know what, I'm not connected anymore to the phone or the times when the watch
00:17:03 ◼ ► decides, you know what, I'm no longer a run target in Xcode, just I'm not paired anymore.
00:17:18 ◼ ► experience I want. There's stuff that I would like to do differently with, like if I actually had UI kit
00:17:23 ◼ ► but, you know, for the most part I can build the experience and functionality I want and that makes
00:17:43 ◼ ► as best I understand, watchOS is basically just iOS, it was just a stripped down version of it
00:17:48 ◼ ► that runs in a different kind of, with some different rules around it, but like the basic
00:18:28 ◼ ► of the bugs and weird issues and strange edge cases have I'm sure been worked out with that, versus
00:18:38 ◼ ► Audio Player, which was really strange and had some of the most comedic bugs I've ever dealt with
00:18:48 ◼ ► computer out the window every time I write a tool. Well, I think my favorite bug with WK Audio File Player was
00:19:08 ◼ ► resource to play and then your app could be terminated and it would keep playing, so your app was never
00:19:13 ◼ ► actually running in the background, it was just being killed, and then when you'd wake up you could like try to find
00:19:18 ◼ ► that session and it worked sometimes. Yes, but most of the time you couldn't reconnect to it, so if you
00:19:28 ◼ ► again you got triple playback, or quadruple playback, and they would all start and stop
00:19:33 ◼ ► every time you hit play/pause in the Now Playing app, and the only way as far as I could tell to get rid of that was
00:19:48 ◼ ► Watch and Voice, this is how bad it, man, I'm going to be so, I'm going to like celebrate the
00:19:58 ◼ ► victory, like, rest in peace. I don't know why anyone would use it now, but. No, I mean
00:20:03 ◼ ► to be fair, you couldn't use it before because it was so bucky and horrible, but you know, it's
00:20:08 ◼ ► anybody who somehow managed to use it, I imagine they're going to be looking at losing that
00:20:13 ◼ ► shortly. Yeah, no, but the fact that the Apple is instead using, it's just saying old and battle tested
00:20:18 ◼ ► and tried and true, and like, I can use the same code that I use in iOS, like, it's just going to make that
00:20:28 ◼ ► sort of, it seems like it's clearly an emphasis, like even from a marketing perspective, you know, Apple
00:20:43 ◼ ► one of the big customer facing features is audio on the watch, that they are talking about it to
00:20:58 ◼ ► all of that together makes me think that, you know, this is good now and should be getting better and better.
00:21:05 ◼ ► We are brought to you this week by Instabug. More than 20,000 mobile apps including Lyft,
00:21:15 ◼ ► is a lightweight SDK that provides mobile apps with comprehensive bug and crash reporting.
00:21:20 ◼ ► With just one line of code to integrate, Instabug helps you receive detailed bug reports with minimal
00:21:25 ◼ ► effort. So here's a pretty cool feature, for instance, users can submit feedback by simply shaking their phones if you don't use a shake gesture for anything else.
00:21:36 ◼ ► Users can even attach a voice note or a screen recording too, and this is all done right from your app
00:21:41 ◼ ► with zero interruption to their experience. The Instabug dashboard will then show you a comprehensive
00:21:46 ◼ ► report that includes all their device details, reproduction steps, network logs, and all the
00:21:56 ◼ ► reply to your users from your Instabug dashboard so you can let them know that their issue has been fixed or maybe ask for more feedback if you need it.
00:22:02 ◼ ► And Instabug can also now forward reports to Jira, Slack, Trello, GitHub, Zendesk, or whatever else you might use.
00:22:09 ◼ ► So check it out today, the Instabug SDK takes just one minute to integrate into your app. Visit Instabug.com/Radar
00:22:16 ◼ ► to create your free account now with no credit card required. If you're a developer, you can sign up for a free forever plan,
00:22:22 ◼ ► and everyone else can use promo code RADAR2018 to get 20% off all plans for three months.
00:22:37 ◼ ► So it isn't just audio people who are happy though. Workout people like myself are also super happy with WatchOS 5
00:22:43 ◼ ► because Apple is now exposing, I'm not entirely sure if they are exposing what they've been using previously
00:22:50 ◼ ► or if they have now added a new API that they are also using, but the workout system of recording workouts and running workouts on the watch
00:22:58 ◼ ► is completely overhauled from top to bottom and is exactly the same API that is used by the system workout app now.
00:23:06 ◼ ► Anytime I hear from Apple that the first-party app is using under the hood the same APIs that I'm using,
00:23:15 ◼ ► it makes me way more confident about them, both in terms of their maintenance, their in-general...
00:23:26 ◼ ► I'm not going to complain about what we don't have. I'm going to just accept what we do have and delight in it.
00:23:36 ◼ ► Before there was just probably a couple thousand lines of code without exaggeration of Workouts++ that I can just throw away now.
00:23:50 ◼ ► It was this crazy game you were playing where you have this huge fire hose of data coming in from HealthKit.
00:23:57 ◼ ► You're taking all these sample data, you have to process it, manage it, and then you just turn around and hand it back to HealthKit
00:24:18 ◼ ► It keeps track of how far have I gone in this workout, things that you would normally want to know.
00:24:36 ◼ ► People take very seriously, and I take very seriously, the fact that you don't want to lose data when you're doing a workout.
00:24:53 ◼ ► In my experience, my app is killed by the system for reasons unrelated to my application more often than anything else.
00:25:04 ◼ ► That's not exactly it. I love when I get the system report that's a crash log, and it says,
00:25:09 ◼ ► "Your app was killed because the CPU was overused for longer than seven seconds," or whatever it was.
00:25:15 ◼ ► And it includes my app's usage. It's like, "Here, your app used 4% of the CPU during this period."
00:25:27 ◼ ► But nevertheless, if your app crashes or is killed, it will relaunch it and give you the opportunity to reconnect to the workout session.
00:25:38 ◼ ► Because unless they're actively looking at the watch for that brief moment when the app is killed and then relaunched,
00:25:49 ◼ ► All the data from between when you crash and when you reconnect is still being collected.
00:25:54 ◼ ► And if your app can't be relaunched for some reason, or it relaunches and crashes again,
00:26:04 ◼ ► One of these things is, yes, this is clearly now an API that is designed to give people reliable, quality third-party workout experiences
00:26:17 ◼ ► But if I'm honest, there were even situations where if I was doing a workout that I for some reason really wanted to make sure was captured,
00:26:27 ◼ ► Even as the amount of work I put into making my app reliable, I couldn't guarantee that it was reliable,
00:26:36 ◼ ► And it's fantastic that now that goes away, and I can be just as reliable as the first-party app,
00:26:48 ◼ ► Well, between workout restoration and background audio, I believe we can really truly say, "Finally."
00:26:56 ◼ ► Finally. All right, so I think that wraps up our talk about watchOS, and in general, what our summer plans are.
00:27:05 ◼ ► And I think it's also the opportune time for us to discuss something briefly, that we are going to be going on a break for the show.
00:27:38 ◼ ► it is something that I also wanted to mention, that I have found in general that inertia is a dangerous thing,
00:27:44 ◼ ► and can be something that is hard to start something, and then sometimes it's easy to just keep going.
00:27:52 ◼ ► And at a certain point, you may not be being thoughtful about what it is that you're doing.
00:27:56 ◼ ► I'm sure at this point, I probably put less thought into each episode of Under the Radar now than I did at the beginning.
00:28:07 ◼ ► And I think taking a break is a tremendous tool in general, like applying to work or any kind of project or creative thing that you're working on,
00:28:17 ◼ ► And I think when you come back to something after a time away, you have a better perspective about what makes it good,
00:28:23 ◼ ► what are changes you could make, and what are things that you can do to make it better.
00:28:35 ◼ ► So we will look forward to seeing you after that break, but in the meantime, you're going to have to find something else to fill 30 minutes with a week.