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
◼
►
- 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: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: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: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: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: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
◼
►
- 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
◼
►
- 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: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: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: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: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: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: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
◼
►
- 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: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.