PodSearch

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 ]