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 ]