Podcast Search

Under the Radar

98: The Accidental Episode

Select a time to play from there. The line being spoken is highlighted as the audio plays.

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

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

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

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

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

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

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

0:00:10and in our preamble,

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

0:00:13before we record,

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

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

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

0:00:21Just some context here.

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

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

0:00:29for Overcast,

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

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

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

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

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

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

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

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

0:00:52but it would work.

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

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

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

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

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

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

0:01:08and dealing with HealthKit,

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

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

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

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

0:01:16and work with HealthKit

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:01:55wouldn't be crazy.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:02:33when you were starting.

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

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

0:02:36about these crazy things.

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

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

0:02:42fast, powerful web hosting options

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

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

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

0:02:52Linode offers industry-leading performance

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

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

0:02:59and Intel Xeon E5 processors.

0:03:00These are the fastest processors available

0:03:02in the cloud market.

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

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

0:03:08with super simple scaling,

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

0:03:12They have fantastic pricing.

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

0:03:17about twice the amount of RAM

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

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

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

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

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

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

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

0:03:35there is nothing to lose.

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

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

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

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

0:03:48(upbeat music)

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

0:03:53Workouts++ Podcast Player.

0:03:54- That's good.

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

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

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

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

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

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

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

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

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

0:04:23without an active workout running.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:05:03and overwrite it.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:05:59to be responsive.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:07:39the back button is meaningless.

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

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

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

0:07:51- Yes.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:08:33- Right. (laughs)

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

0:08:39or activate that.

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

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

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

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

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

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

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

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

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

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

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

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

0:09:14- Yeah.

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

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

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

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

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

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

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

0:09:34to move things across,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:10:10without having any playback UI,

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

0:10:15like it automatically transferred overnight.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:11:19And then you get into,

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

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

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

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

0:11:36in a lot of ways.

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

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

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

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

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

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

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

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

0:11:56that also solves the other purpose

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

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

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

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

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

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

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

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

0:12:18if that makes sense.

0:12:19- Oh, sure.

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

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

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

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

0:12:30What else do I need?

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

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

0:12:36to your app store description

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

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

0:12:40of those for subscriptions.

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

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

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

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

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

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

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

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

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

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

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

0:13:12(laughing)

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

0:13:16like from a support perspective,

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

0:13:19because there is such a,

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

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

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

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

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

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

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

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

0:13:38- Of course.

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

0:13:41they're very upset.

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

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

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

0:13:48(laughing)

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

0:13:51that they worked towards,

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

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

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

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

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

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

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

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

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

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

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

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

0:14:21is activating a workout session,

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

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

0:14:27That's it.

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

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

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

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

0:14:39to start offline playback.

0:14:42- Yeah.

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

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

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

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

0:14:52- Exactly.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:15:25- Oh, definitely.

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

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

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

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

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

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

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

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

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

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

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

0:15:55or adds capabilities for workouts,

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

0:16:00oh, are you gonna support

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

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

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

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

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

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

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

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

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

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

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

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

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

0:16:29the system workout app does.

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

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

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

0:16:40as the workload, right?

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

0:16:43about just like workout types.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:17:18- No.

0:17:19- Oh, God.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:18:30with working out.

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

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

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

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

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

0:18:42and your massive redesign.

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

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

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

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

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

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

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

0:19:01starting and stopping the workout,

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

0:19:05where they would like disable it

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

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

0:19:11during the workout.

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

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

0:19:17- Yep.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:20:35- Yeah.

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

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

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

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

0:20:44additional having to prompt for permissions

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:21:44like they stop playback somehow.

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

0:21:49- Not at all.

0:21:50- Ugh.

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

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

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

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

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

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

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

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

0:22:13(laughing)

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

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

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

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

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

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

0:22:27- Oh my God.

0:22:27(laughing)

0:22:29I hate this so much.

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

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

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

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

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

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

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

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

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

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

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

0:23:02and make my users complain

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

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

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

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

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

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

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

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

0:23:25I think I mentioned before,

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

0:23:28back in iPhone OS 2,

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

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

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

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

0:23:43and then keep backfilling.

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

0:23:50as I go.

0:23:50- Yeah, right.

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

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

0:23:58is just instant playback.

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

0:24:04For most user expectation perspective,

0:24:06streaming is fast start.

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

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

0:24:15it would basically be streaming.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:25:42it correctly ties into it.

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

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

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

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

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

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

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

0:26:06or something like that.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

0:27:33immediately start playing?

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

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

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

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

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

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

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

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

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

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

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

0:28:06(laughing)

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

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

0:28:13I don't know.

0:28:14So is this a show?

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

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

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

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

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

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

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

0:28:36[ Silence ]