Under the Radar

98: The Accidental Episode


00:00:00   - Welcome to Under the Radar,

00:00:01   a show on independent iOS app development.

00:00:03   I'm Mark O'Arment.

00:00:04   - And I'm David Smith.

00:00:05   Under the Radar is never longer than 30 minutes,

00:00:07   so let's get started.

00:00:08   - So we wanted to record a regular episode this week,

00:00:10   and in our preamble,

00:00:11   where we just kind of casually talk with each other

00:00:13   before we record,

00:00:14   we ended up having a better discussion

00:00:16   than whatever we were gonna talk about.

00:00:17   So we're gonna use that as the episode this week.

00:00:21   Just some context here.

00:00:23   I've been thinking about trying various ways

00:00:26   to bring back, watch offline audio playback

00:00:29   for Overcast,

00:00:30   you can play background audio if you're a workout app.

00:00:34   So one option I'm considering is just making Overcast

00:00:37   a workout app on the watch,

00:00:38   where it would have to start its own workouts,

00:00:41   manage them in the Overcast interface,

00:00:43   and then you could play stuff in the background offline

00:00:46   as long as a workout is running in the Overcast app.

00:00:49   And that has all sorts of problems and everything,

00:00:52   but it would work.

00:00:54   You are the audio and watch expert.

00:00:58   I don't know nearly as much about the watchOS APIs as you do,

00:01:02   so I've been bouncing questions off of you,

00:01:04   like can I do this, can I do this,

00:01:05   what are the downsides of this?

00:01:07   You also know a lot about HealthKit

00:01:08   and dealing with HealthKit,

00:01:09   which I have no experience with.

00:01:10   So I've been asking you questions like,

00:01:13   what are the downsides of being a workout app

00:01:15   and having to save data to HealthKit

00:01:16   and work with HealthKit

00:01:17   and have all the permissions for that?

00:01:20   And you've been experimenting with a project

00:01:23   to have a workout audio player on the watch, right?

00:01:27   - Yeah, and so I've been playing

00:01:29   since the LTE watch was announced,

00:01:31   I was like, well, maybe I need to try this.

00:01:32   And because, as we get into the discussion over here,

00:01:37   a lot of things become more possible on the watch

00:01:39   if you are a workout app.

00:01:41   I was like, well, I have a workout app,

00:01:42   I have Workouts++, and the point of Workouts++

00:01:45   is to be this sort of super user,

00:01:48   like lots of customization kind of power app,

00:01:52   and so maybe adding podcast playback to that

00:01:55   wouldn't be crazy.

00:01:56   And so I've been experimenting with it

00:01:57   and kind of building this out.

00:01:59   And it's in the working prototype stage at this point,

00:02:02   and it's kind of interesting to see,

00:02:04   is this a viable thing, does it make sense,

00:02:06   and do we wanna take it on?

00:02:08   But yeah, hopefully you enjoy the discussion.

00:02:10   I personally, I think I like these kinds of discussions

00:02:13   because Marco and I, we do this a lot,

00:02:16   it's probably fair to say,

00:02:17   where it's useful to think through something out loud,

00:02:21   where you're dealing with all these problems sequentially,

00:02:25   and you're able to benefit from each other's experience

00:02:27   and just kind of see how these things evolve,

00:02:29   and you often end up in a place that's so different

00:02:31   than where you may have thought you would

00:02:33   when you were starting.

00:02:34   - All right, so with that,

00:02:35   here's our discussion we were having

00:02:36   about these crazy things.

00:02:38   Enjoy the episode, and right before we start,

00:02:40   we are brought to you this week by Linode,

00:02:42   fast, powerful web hosting options

00:02:44   you can set up in just seconds,

00:02:46   and plans start at just $5 a month for a Linux server

00:02:49   with one gig of RAM in the Linode cloud.

00:02:52   Linode offers industry-leading performance

00:02:54   with native SSD storage, these are enterprise-grade SSDs,

00:02:57   and access to a 40 gigabit network

00:02:59   and Intel Xeon E5 processors.

00:03:00   These are the fastest processors available

00:03:02   in the cloud market.

00:03:03   They have nine data centers all over the world,

00:03:06   an API that lets you easily automate tasks if you want

00:03:08   with super simple scaling,

00:03:10   and hourly or monthly billing options.

00:03:12   They have fantastic pricing.

00:03:14   Again, all this starts at just $5 a month for one gig of RAM,

00:03:17   about twice the amount of RAM

00:03:18   that you will get in other hosts like this.

00:03:21   I think it's the best deal in my posting.

00:03:22   I use it, David uses it, we love Linode, it's wonderful.

00:03:26   As a listener of this show,

00:03:27   if you sign up at linode.com/radar,

00:03:30   you will support us and get $20 towards any Linode plan.

00:03:33   And with a seven-day money-back guarantee,

00:03:35   there is nothing to lose.

00:03:36   So go to linode.com/radar to learn more,

00:03:40   sign up and take advantage of that $20 credit,

00:03:42   or use promo code radar2017 at checkout.

00:03:45   Thank you so much to Linode for supporting this show.

00:03:48   (upbeat music)

00:03:50   - I've made a lot of progress in

00:03:53   Workouts++ Podcast Player.

00:03:54   - That's good.

00:03:55   - It's just so slow to download, and that it works.

00:03:59   It makes me feel like I'm downloading these files

00:04:02   on a dial-up modem.

00:04:05   And so that makes me, I'm very curious to see

00:04:07   what an 80% faster Wi-Fi chip in the new watch will be.

00:04:12   - And I forget, so last time when you were talking

00:04:16   about this and telling me all the wonderful things

00:04:18   you were finding, the conclusion, I believe,

00:04:20   you came to was it's pretty much impossible to do it right

00:04:23   without an active workout running.

00:04:25   So if you're just using audio file player in the background,

00:04:28   and you're not doing a workout, what are the main,

00:04:31   is the main problem still that it doesn't wake your app up

00:04:33   when somebody hits the end and stuff like that?

00:04:36   - I think it's along those lines.

00:04:39   A, you'll have weird issues, for example,

00:04:41   around interaction with the now playing control,

00:04:45   for example, and things, because in order to interact

00:04:48   correctly with the now playing control,

00:04:49   you have to be running because you need to be constantly

00:04:51   monitoring the status of the cue player.

00:04:55   'Cause when they hit forward, it's obviously,

00:04:58   you're not actually, it's not skipping the file forward,

00:05:00   it's doing a next track, and so you need to intercept that

00:05:03   and overwrite it.

00:05:05   There's a lot of things like that,

00:05:07   that if you're not doing a workout,

00:05:09   you won't have the ability to do that interception.

00:05:13   Like it'll background you because as far as it's concerned,

00:05:17   you've said play this file and it'll just merrily play it

00:05:20   to the end, or they hit next and then it'll just stop.

00:05:24   - I wish they would just wake you up in the background

00:05:27   whenever an event like that happen,

00:05:29   either somebody reaches the end or somebody advances

00:05:31   to the next thing in the cue.

00:05:32   - Sure, I mean, they should,

00:05:34   and on the now playing side, there's a ton of stuff

00:05:36   that you really should do there.

00:05:39   Rather than just doing whatever to the file,

00:05:42   it should probably, in the same way that on iOS it does,

00:05:45   you get an app delegate callback that says,

00:05:49   this button was pressed, and then leave it up to me

00:05:52   to do whatever I want to do with that.

00:05:55   - They probably don't do that because if they're gonna

00:05:57   suspend you, you probably can't be resumed fast enough

00:05:59   to be responsive.

00:06:00   - Fundamentally, the architecture is intended to be

00:06:03   that if you are running, it's this fire and forget

00:06:06   kind of a thing, that you say like, play this file,

00:06:09   and then you can kill the app and it would be fine.

00:06:13   Whereas in order to really do it properly,

00:06:16   you need to always be running, which in the current form

00:06:19   means you either need to be a turn-by-turn navigation app

00:06:22   or you need to be a workout app.

00:06:24   And also there's a bunch of other just like things

00:06:26   that seem like if you're keeping track of how far

00:06:30   they've gotten for like bookmarking reasons and things,

00:06:33   being a workout app is also something that seems

00:06:36   somewhat important to be able to, in the same way,

00:06:39   like I mean, functionally, the way I've built it now,

00:06:41   it just once a second, I have a timer going,

00:06:44   and I'm just keeping track of how far they got.

00:06:47   And then also seeing has the queue changed,

00:06:50   and if it has, just restarting it 30 seconds ahead,

00:06:55   essentially, is most of what I do.

00:06:57   The back button still doesn't work, but as far as I can tell,

00:07:01   I can't fix that because with a queue,

00:07:05   like the queue is strictly forward moving,

00:07:08   it doesn't go backwards.

00:07:09   'Cause like at first, what I did is I set the queue up

00:07:12   as play 30 seconds of silence, play the podcast,

00:07:16   play 30 seconds of silence in the hope that if you hit back,

00:07:20   it would go back to the first 30 seconds of silence.

00:07:24   I can detect that you've jumped backward

00:07:26   and then readjust, play that accordingly.

00:07:30   But that didn't work because hitting back

00:07:31   just does nothing, just stops.

00:07:34   So as I can tell, there's nothing to be done there.

00:07:38   When you're playing the file,

00:07:39   the back button is meaningless.

00:07:43   There's no, all it does is stop playback, so I don't know.

00:07:46   That seems like that's just a bug

00:07:48   or a limitation of how it's implemented.

00:07:51   - Yes.

00:07:51   - But forward works, and play/pause works.

00:07:55   - Now you're making me do this, 'cause I figure

00:07:57   I pretty much have the file transfer side of it solved.

00:08:00   I have my transcoding engine, it makes it lower bit rate,

00:08:03   it makes it in smart speed.

00:08:04   If I do it again, what I'm gonna do basically

00:08:06   is just have it automatically sync stuff over overnight.

00:08:10   Is there a background app refresh for the main extension?

00:08:14   Could I wake up periodically throughout the night

00:08:17   and queue up a URL task or something?

00:08:21   Is that a thing I can do?

00:08:22   - You could ask to send the file to the watch,

00:08:27   but you would have no visibility as to when or if

00:08:31   that is actually going to happen.

00:08:33   - Right. (laughs)

00:08:34   - And there's no way for the user to prioritize

00:08:39   or activate that.

00:08:42   So you could, in your app, overnight say,

00:08:44   "Hey, here's this file.

00:08:46   "When it's convenient, please transfer it to the watch."

00:08:49   And that would work, but you don't know when.

00:08:52   And that's the part of it, when I was thinking through

00:08:55   on my side of things, I was like,

00:08:57   I ended up, I'm just going to do it that it downloads

00:09:01   using NSURL connection or NSURL session,

00:09:05   because that way at least I can show the user

00:09:07   what's going on by giving them that sense of feedback.

00:09:11   At least it's not frustrating for like,

00:09:13   well, where's my file?

00:09:14   - Yeah.

00:09:15   - And it's like, I see where you're going.

00:09:17   I think it works in so far as like,

00:09:19   if you can do it when they're not paying attention

00:09:21   and it works well enough, then that may be good enough.

00:09:24   And you'd think that overnight,

00:09:27   if your watch is plugged in and your phone is plugged in,

00:09:31   that it would be, use that as a good opportunity

00:09:34   to move things across,

00:09:36   unless it needs for them to be unlocked.

00:09:39   - Yeah, like I wonder, is the session even active

00:09:42   if they're both locked sitting on a table?

00:09:43   - Yeah, 'cause that's a weird question,

00:09:45   'cause I don't know if it would say that,

00:09:46   hey, this is a great opportunity to do it.

00:09:48   Or it would say, the watch is off the wrist,

00:09:51   I'm not going to do anything.

00:09:53   Is the watch connected in the same way?

00:09:57   Is it in a, I'm asleep state because I'm not connected

00:10:00   to a wrist anymore, I don't know.

00:10:02   Yeah, so it's a bit of a mess.

00:10:05   - I think first I will try the file transfer thing.

00:10:08   I'll just set it up and just,

00:10:10   without having any playback UI,

00:10:12   just to see is it able to stay on top of things,

00:10:15   like it automatically transferred overnight.

00:10:16   My idea is just automatically sync over your whole queue

00:10:19   and then once you finish that,

00:10:22   basically try to sync over 24 hours of audio.

00:10:24   So finish the queue and then start just pulling

00:10:28   new podcasts that have come in that aren't yet there.

00:10:31   Just try to sync as much as possible.

00:10:34   If the workout hack is a way to simulate

00:10:37   a decent or semi-decent podcast audio player,

00:10:40   I'm willing to go through all that hassle

00:10:42   if it can be an overall good experience

00:10:45   for the people who choose to go all in on it.

00:10:46   So if you're willing to do a workout

00:10:49   while you're playing things on your watch,

00:10:51   which I think most people are probably

00:10:52   going to be doing one anyway during those times,

00:10:54   I'm willing to have this work again

00:10:56   if everything else can be good.

00:10:58   If the transfer experience can be good,

00:10:59   if the playback can be passable,

00:11:02   I'm willing to have this work.

00:11:03   - The awkward thing is just so hard to know.

00:11:06   The reason you ended up pulling it

00:11:07   is because it worked but it didn't work well.

00:11:12   And I suspect you will still have that same experience

00:11:15   of it'll work but it won't work well.

00:11:19   And then you get into,

00:11:20   for the same reason that you pulled it last time,

00:11:23   is it better to just wait and hope that 4.1 or something

00:11:28   will make it better and ship it when it really works

00:11:33   rather than it's kind of a bundle of hacks

00:11:36   in a lot of ways.

00:11:38   - Yeah, the way I'm thinking about that now is,

00:11:40   first of all, things have changed now.

00:11:42   With the release of the LTE watch,

00:11:44   demand is now gonna be way higher.

00:11:46   So that changes the calculus a little bit

00:11:48   because now all of a sudden there's way more people

00:11:50   who are going to be wanting standalone playback.

00:11:53   Also, if I make it a workout app,

00:11:56   that also solves the other purpose

00:11:58   of just being convenient when you're working out.

00:12:01   That's gonna be the app that's gonna pop up first

00:12:03   when your watch screen wakes up,

00:12:05   that you're gonna be able to see everything

00:12:06   on just one screen instead of having to page

00:12:09   between two things in the watch app

00:12:10   or swap between two apps with the rapid swapping features.

00:12:14   It can be better in these ways beyond what it was before,

00:12:18   if that makes sense.

00:12:19   - Oh, sure.

00:12:21   Then if you're a workout app,

00:12:22   then it's just you need to do all the health stuff.

00:12:26   - Yeah, but so what are the requirements?

00:12:28   I already have a privacy policy.

00:12:30   What else do I need?

00:12:32   - I think the biggest things is,

00:12:34   the easy ones, you have to add a disclaimer

00:12:36   to your app store description

00:12:37   saying that you integrate with health.

00:12:38   - That's all right, I already have a big pile

00:12:40   of those for subscriptions.

00:12:41   - Yeah, it's like you need to do that

00:12:43   and then it's just, you'll need to,

00:12:44   at some point you'll need to throw up the health prompt.

00:12:50   Requesting access on the phone to their health data.

00:12:54   Like a very common thing that'll happen is,

00:12:56   they will either, they'll not turn them all on

00:13:00   and then be like, "Why isn't my data there?"

00:13:02   Or the permissions won't sync correctly

00:13:04   and so you have to tell them to go to the health app,

00:13:07   go to sources, click your app, turn them all off,

00:13:09   turn them all on, and then usually that resets it.

00:13:12   (laughing)

00:13:13   Like these are just the things,

00:13:16   like from a support perspective,

00:13:17   that come up with the health frameworks

00:13:19   because there is such a,

00:13:21   like all of the permissions and privacy stuff

00:13:24   that you then have to navigate just is a bit more tricky.

00:13:28   I don't think there's that,

00:13:29   you'll have to deal with people getting annoyed

00:13:30   if you're, for whatever reason,

00:13:32   you don't save the data correctly,

00:13:33   but I mean that's just, like people,

00:13:35   people see, they're very precious about their workouts.

00:13:38   - Of course.

00:13:39   - So like if the app crashes during a workout,

00:13:41   they're very upset.

00:13:42   - Because they're like, "I'm working hard to earn this stat,

00:13:45   "and you stole it from me."

00:13:46   - That is both a joke and actually how they feel.

00:13:48   (laughing)

00:13:49   It feels like I took something from them

00:13:51   that they worked towards,

00:13:52   which I suppose is true in some ways.

00:13:55   But yeah, I mean those are the big things.

00:13:57   I mean it's just one other avenue for things

00:14:01   that you have to now manage in terms of the,

00:14:04   yeah, like both the user experience,

00:14:06   which is a little awkward as well as, I mean,

00:14:09   in general, I haven't found,

00:14:11   haven't had too many issues on the compliance

00:14:13   or worry about people's data

00:14:15   because I don't actually store any of their data.

00:14:17   All their data is in the health app.

00:14:20   - Yeah, like the only thing I'd be doing here

00:14:21   is activating a workout session,

00:14:23   displaying its data on the screen during it,

00:14:26   and then saving it to HealthKit.

00:14:27   That's it.

00:14:28   - The other thing you'll have to navigate on your side

00:14:31   that's related to that is,

00:14:33   I think you will have a fair bit of confusion

00:14:35   around needing to have a workout active

00:14:39   to start offline playback.

00:14:42   - Yeah.

00:14:42   - And then that they need, like if you end the workout,

00:14:45   the playback will stop, will likely be more confusing

00:14:48   because when you're playing from your phone,

00:14:50   that's not the case.

00:14:52   - Exactly.

00:14:52   - If you use the watch app

00:14:54   while you're playing from your phone,

00:14:55   there's no connection whatsoever.

00:14:58   And so I think that'll likely be confusing

00:15:01   as to why do I need to,

00:15:04   why do I need to start a workout?

00:15:07   I'm not working out.

00:15:08   Or I don't wanna drain my battery

00:15:12   with the heart rate monitor all the time.

00:15:14   I just wanna listen to a podcast.

00:15:15   It's like, well you need to,

00:15:17   because the primary purpose for your app

00:15:19   is to listen to the podcast, not to do a workout.

00:15:23   I imagine there will be a dissidence there.

00:15:25   - Oh, definitely.

00:15:26   Yeah, and that's the main argument

00:15:28   for whether I should or shouldn't do this or not.

00:15:30   It's like, how bad is that, basically?

00:15:33   Like how bad is combining these things,

00:15:36   and then what happens if watchOS 5

00:15:39   gives me the ability to do it without a workout?

00:15:41   Then do I remove all these features?

00:15:43   - Yeah, you are taking on the people's expectation

00:15:46   that oh, this is the app I use for a workout now.

00:15:49   And so are you then becoming a workout app forever?

00:15:52   And if Apple changes the way workouts can do

00:15:55   or adds capabilities for workouts,

00:15:58   will you then have the problem of people being like,

00:16:00   oh, are you gonna support

00:16:02   the new something-something workout system?

00:16:04   But it may not really, it's not really at all aligned

00:16:07   with the core goal of the app.

00:16:09   - I guess the advantage there is like,

00:16:10   they don't add new workout types that often.

00:16:12   Usually it's like, it's once a year.

00:16:13   It's during the watchOS update, they'll add a few new ones.

00:16:16   And the way I'm picturing the UI is like,

00:16:18   I replace the star button with a workout start/stop button,

00:16:21   and it pops up a table view list that just says like,

00:16:24   all right, pick your workout type.

00:16:25   And it can be smart, it can sort the last ones

00:16:27   you've used on top, just the way

00:16:29   the system workout app does.

00:16:31   But it doesn't really matter how long that list is.

00:16:33   And then the API for all of them is the same.

00:16:36   I think it would only add elements to that list

00:16:40   as the workload, right?

00:16:42   - Sure, I mean, I'm not necessarily talking

00:16:43   about just like workout types.

00:16:44   I think that's like, so as an example,

00:16:47   the recent edition in this, like in watchOS 4,

00:16:50   you can now do location tracking.

00:16:52   So you can get the map of where you walked

00:16:55   while you went for your walk.

00:16:56   But in order to do that, you need to implement

00:16:59   all the core location stuff yourself.

00:17:01   - Oh, I didn't know that.

00:17:03   Wait, so if I just start a workout,

00:17:05   and I do, I just record like, you know,

00:17:07   like I saw this code sample online

00:17:09   when I looked at it like last month.

00:17:11   So if I just do like, you know, saving like the samples

00:17:14   or whatever, that like the, does it,

00:17:16   it doesn't keep a GPS map?

00:17:18   - No.

00:17:19   - Oh, God.

00:17:20   - So you have to implement that yourself.

00:17:22   Otherwise you lose the ability to have your GPS maps.

00:17:25   - Oh, that's really bad.

00:17:26   - So like, this is, that's more what I mean

00:17:29   where it's really, it's like as people's expectations

00:17:32   for what a workout, like, 'cause then if all

00:17:34   of the overcast workouts don't have location data,

00:17:37   then is that gonna be annoying and frustrating

00:17:39   and not what we want, not what they want?

00:17:42   And do you wanna go down the road

00:17:43   if we're now implementing core location tracking and so on?

00:17:47   So that's more what I mean by,

00:17:49   'cause conceptually what you're sort of,

00:17:53   it's like having a workout app that's super minimal.

00:17:56   I mean, maybe you could even just like,

00:17:58   all I can do is runs and walks, right?

00:18:00   Like, even if you just said that that's what it does,

00:18:02   it's like, it's just for runs and walks.

00:18:04   It's the purpose of, I mean, it's sort of like

00:18:05   Pedometer++'s workout app, where on the watch,

00:18:09   you can say, like, start a walk,

00:18:11   which for Pedometer++, kind of, it's like outdoor walk

00:18:14   is the only workout type, because it's a pedometer.

00:18:18   Like, that's what, it's for counting steps.

00:18:20   So narrowing it in that way doesn't limit it too much,

00:18:24   but is it because, you know, your core purpose

00:18:28   is not specific, in fact, it has nothing to do

00:18:30   with working out.

00:18:32   It may be something that people do while they work out,

00:18:34   but it's got nothing to do with working out.

00:18:36   Like, it's, I don't know.

00:18:38   And of course, then you have to worry about your card,

00:18:40   it's like, you're still worrying about your card API

00:18:42   and your massive redesign.

00:18:43   So who knows, maybe by the time you get finished

00:18:46   with your cards, watchOS 5 will have come out,

00:18:49   and then it'll all be, you know,

00:18:52   it'll all be fixed at that point,

00:18:53   so you don't even have to worry about it.

00:18:55   - Oh man, all right, so if I wanted to do this right,

00:18:57   I would have to not only have all the workout stuff,

00:19:01   starting and stopping the workout,

00:19:02   have that being basically tied to the play/pause button,

00:19:05   where they would like disable it

00:19:06   when you're not running a workout,

00:19:07   but also have location tracking in my app

00:19:11   during the workout.

00:19:12   Presumably I'd have to just like, you know,

00:19:14   do continuous monitoring, save the samples.

00:19:17   - Yep.

00:19:18   - Can you give location access with a prompt

00:19:20   that only appears on the watch,

00:19:21   or does it prompt you on the phone?

00:19:22   - I think it'll still show up on the phone.

00:19:25   They've made it, in watchOS 4, a couple of the prompts

00:19:28   are now on the, like the motion and fitness one,

00:19:31   which is the one that I like interact with a lot,

00:19:33   is now possible to, you used to have to do it on the phone,

00:19:37   now it'll pop up and say, you can approve it from the watch.

00:19:41   But yes, I think health ones still require

00:19:43   that you go to the phone, which makes sense,

00:19:45   because they're so much more complicated.

00:19:47   And I actually don't know about location.

00:19:50   It wouldn't surprise me if you can do it on the watch now,

00:19:52   just because they did it for motion and fitness as well,

00:19:56   but I don't know that for sure.

00:19:58   - This is just adding more and more clunkiness to this.

00:20:00   - Sure, it does, this is the thing, right?

00:20:03   And now, and then you have the same thing,

00:20:05   it's like now you have the question of,

00:20:07   you need to have, navigate people with location privacy,

00:20:12   or people can, like, try it with like,

00:20:14   why does my podcast player need to know where I am?

00:20:17   And those types of questions, which are enough,

00:20:19   it's like both, because if you want your workout map,

00:20:22   then I have to do this, but.

00:20:25   - All right, so what if I, (laughs)

00:20:27   so what if I don't do workout stuff at all,

00:20:30   and just to recap, so if I go back,

00:20:33   if I do WK Audio File Player,

00:20:35   - Yeah.

00:20:36   - I'm trying to think, what's the best I could do,

00:20:38   so like, the problems, so now we know the problems

00:20:41   of doing a workout app, all this confusion,

00:20:43   all this overhead, all this, you know,

00:20:44   additional having to prompt for permissions

00:20:46   and manage those permissions and everything,

00:20:48   maybe involving the phone, and so, okay.

00:20:50   If I go back to not having a workout,

00:20:54   go back to the way I was doing it before,

00:20:55   just this time with WK Audio File Player,

00:20:57   instead of AB Audio, AB File Player, whatever it is,

00:21:00   the main downsides to that is, if somebody hits next track

00:21:03   or previous track on their AirPods, playback will stop,

00:21:06   and it won't be able to be restarted

00:21:09   until they go to my app again.

00:21:11   - And you won't know where they left off.

00:21:13   - So what, so if they, oh God, all right, so. (laughs)

00:21:17   - Fundamentally, the problem is that it's like,

00:21:20   if you go down that road, the issue is,

00:21:23   it changes it from being able to,

00:21:26   the basic expectation with a podcast,

00:21:28   that you have a bookmark where you're keeping track,

00:21:31   and you are offsetting from that,

00:21:34   doesn't work unless you can keep track of that bookmark.

00:21:37   - Right, so if the user, so let's say, you know,

00:21:39   they get back to their house, they end the workout,

00:21:42   and they turn off their headphones, or whatever it is,

00:21:44   like they stop playback somehow.

00:21:47   Am I, I'm not notified of that at all, right?

00:21:49   - Not at all.

00:21:50   - Ugh.

00:21:51   - Or at least, you are almost certainly not.

00:21:53   Like, your app theoretically could be in the, like,

00:21:57   if it was the last thing they had running,

00:21:59   you may be in the not fully backgrounded,

00:22:02   but not foregrounded state, so you may have some visibility,

00:22:06   but you have no guarantees of that,

00:22:09   or no expectation of getting that event,

00:22:11   because it's not an event that you get.

00:22:13   (laughing)

00:22:14   Like, or you would get the event when they finish it,

00:22:16   you'll get the, like, did finish to end notification

00:22:19   the next time your app was foregrounded, but.

00:22:21   - But it won't wake me up in the background

00:22:23   and tell me of these events as they happen.

00:22:25   - I don't believe so now.

00:22:27   - Oh my God.

00:22:27   (laughing)

00:22:29   I hate this so much.

00:22:31   Why isn't this easier?

00:22:33   - Yeah, we're engineers, our job is to solve hard problems.

00:22:37   - 'Cause, like, literally, like every day,

00:22:39   I'm gonna be getting questions from people every single day

00:22:42   with LTE watches saying, why haven't you done this yet?

00:22:46   Why is there no podcast app?

00:22:47   Why haven't you, like, and the worst thing is,

00:22:49   if Apple does it, if Apple does their version of podcasts,

00:22:53   if they bring it to the watch,

00:22:55   they're gonna use real APIs that I can't use.

00:22:59   And so that's gonna just make me look bad

00:23:02   and make my users complain

00:23:03   and I'm gonna lose users for that

00:23:05   because they're gonna be like, well, why, you know,

00:23:08   if Apple can do it, why can't you do it?

00:23:10   You know, they're already, oh, also,

00:23:11   while I have you here talking about audio APIs,

00:23:14   is there any streaming API that we can use on the watch?

00:23:17   - So the only way to do streaming, as best I can tell,

00:23:20   would be to, so it would be to do the crazy hacks.

00:23:25   I think I mentioned before,

00:23:26   I used to do in the first version of audiobooks

00:23:28   back in iPhone OS 2,

00:23:30   where I would download MP3 files sequentially.

00:23:34   And after I had like the first two megs of it,

00:23:37   I would hand give those two megs to the player

00:23:41   and then have it start playing those

00:23:43   and then keep backfilling.

00:23:45   Like, it's like I'm on a train trying to build the tracks

00:23:50   as I go.

00:23:50   - Yeah, right.

00:23:51   - Which is not, it's like, is streaming insofar as,

00:23:56   most people's definition of streaming

00:23:58   is just instant playback.

00:24:01   Technically, streaming is a different thing than fast start.

00:24:04   For most user expectation perspective,

00:24:06   streaming is fast start.

00:24:08   So as long as you could do something like that,

00:24:13   you would, from a user's perspective,

00:24:15   it would basically be streaming.

00:24:17   And I mean, you'd hope, like, if the watch is fast enough

00:24:19   and the network connection is fast enough,

00:24:21   like if the download completes in 10 seconds,

00:24:25   it doesn't really matter.

00:24:27   Like the fact that if you have to wait 10 seconds,

00:24:30   like that's not a huge killer.

00:24:31   Like even if you're streaming,

00:24:33   there's usually like a buffering interval.

00:24:35   So, but yeah, there's not a strict streaming interface

00:24:39   in the same way that like AV player,

00:24:40   you can just pass an HTTP URL

00:24:43   and it takes care of it for you.

00:24:45   Everything has to be file-based.

00:24:47   - Yeah, and we don't have the kind of low-level access

00:24:49   that I could like do my own thing,

00:24:51   like I do in the phone version.

00:24:52   'Cause I don't use AV player,

00:24:53   but like I just, I use raw audio playback APIs

00:24:57   that I download the files in chunks myself.

00:24:59   I pass them as I have them to, you know, it's like,

00:25:02   but I can't do any of that on the watch

00:25:03   'cause there's no core audio, right?

00:25:04   Or at least not for background playback.

00:25:08   - Yeah, you would have the same problem,

00:25:09   you would have the same problem of using AV audio player,

00:25:12   where you can use AV audio player if you're a workout app,

00:25:16   but then you don't integrate with the NowPlaying app,

00:25:19   and you also can't control audio volume as a result.

00:25:27   So if the Bluetooth volume on the headsets is set to low,

00:25:32   there's no way to raise it up.

00:25:33   - Right, yes, I had that problem dramatically.

00:25:36   - It's like at least if you use the file player API

00:25:39   or the cue player API, then you can change,

00:25:42   it correctly ties into it.

00:25:43   And so then you could, like I'm expecting to have a little,

00:25:48   I can detect what the current system audio is,

00:25:51   I can detect what the system volume is at least.

00:25:54   So I can tell you, I know if it's low,

00:25:57   like if the system volume is like 0.2,

00:26:01   then I can at least know that and pop up a thing that says,

00:26:03   please adjust your volume in the NowPlaying app

00:26:06   or something like that.

00:26:07   Like I can at least tell you, I can't do it for you.

00:26:10   - Yeah, that still sucks.

00:26:11   Like it still sucks that, like the experience of this

00:26:14   will suck, but at least it's better than like

00:26:16   it just being super low and the user not really knowing why

00:26:19   or having any idea of how to change that.

00:26:21   - Yeah, and having no mechanism for it.

00:26:24   - Oh, why does this, I want so badly for these,

00:26:28   like I wish I could just have the phone audio APIs

00:26:31   on the watch, like why, why don't we have, I mean.

00:26:34   - I mean, I will say it reminds me in the best possible,

00:26:38   like both in a lovely and in a terrible way,

00:26:41   of all the development I did with audio APIs in iPhone OS 2,

00:26:46   like way back, what is that, eight years ago,

00:26:49   like I was dealing with, back then, I mean, I remember

00:26:53   it was a massive deal, like huge, like applause

00:26:57   during the keynote when Steve Jobs was playing a track

00:27:02   in Pandora and then he hit the home button

00:27:07   and it didn't stop playing.

00:27:09   That was like rip roaring applause for something

00:27:13   that now seems like completely foolish, like,

00:27:16   and I remember having to build all these crazy,

00:27:18   like there's still a setting in audio books,

00:27:21   auto resume playback on launch, which at the time

00:27:26   was an important feature, whereas now I get some people

00:27:29   being like, why would I want to do that?

00:27:31   Like when I opened the app, why should it just like

00:27:33   immediately start playing?

00:27:34   It's like, well, back in the day, you'd get a text message

00:27:37   and you'd quit the app and it would stop playing your audio

00:27:40   and you'd reply to your text message and you'd come back

00:27:42   to the app and it'd have to re-spring the whole thing

00:27:45   'cause there wasn't multitasking, so it would restart

00:27:48   the app from scratch and then you'd want it to keep playing.

00:27:51   And like that was the world in which I had to build things

00:27:55   and it's like, the watch feels like the phone did

00:27:59   eight years ago in that way.

00:28:02   - Yeah, except by year three of the phone,

00:28:03   we had multitasking and background audio.

00:28:06   (laughing)

00:28:07   - You know, so maybe this June, maybe next June,

00:28:09   we just need to wait one more cycle or 4.1 maybe or 4.2,

00:28:13   I don't know.

00:28:14   So is this a show?

00:28:16   - I think we just made a show.

00:28:18   - It's like unintentional, the accidental technical podcast.

00:28:23   I hear accidental podcasts are very successful,

00:28:27   so maybe it's a good pivot for us.

00:28:30   - Wow, well, thanks for listening everybody

00:28:31   and we'll talk to you next week.

00:28:33   - Oh, that's awesome.

00:28:36   [ Silence ]