WWDC2019 Session 716

Transcript

[ Music ]
>> Last year in watchOS 5, we
introduced the ability to play
local, long-form audio in the
background.
This year with watchOS 6, we're
bringing the ability for watch
apps to stream audio directly on
Apple Watch.
This means that your customers
no longer need to bring their
iPhone with them to access your
audio content, they no longer
need to sync audio content to
their watches, and they now have
access to live audio programing
like sports events.
WatchOS 6 supports two main ways
to stream audio to Apple Watch.
HLS and custom audio protocols.
Let's dive into a bit more
detail.
If your content is available as
an HLS audio feed, you can point
AVQueuePlayer to the feed and it
will take care of streaming your
content.
WatchOS is optimized for HLS
audio feeds and makes it simple
to get started with.
Applications that use
proprietary audio formats or use
custom protocols are a bit
different.
They need to use URLSession on
the network framework to
retrieve and interpret their
metadata and audio content.
Once audio content has been
downloaded to the watch, use
AVFoundation for audio route
selection and audio playback.
Audio streaming is made possible
in watchOS 6 by bringing several
iOS APIs into the watchOS SDK.
Our goal has been to bring the
two SDKs closer together so that
your code can run watchOS with
little or no modification.
For networking, watchOS 6 now
has the network framework, first
introducing iOS 12.
This framework provides a modern
alternative to unit sockets.
Network framework is not only
more on C API but also provides
a very convenient Swift API.
URLSession brings
URLSessionStreamingTask to
watchOS.
It also brings along
URLSessionWebSocketTask, which
is new in both iOS 13 and in
watchOS 6.
Audio streaming presents special
challenges to the way the data
is retrieved from the network.
To this end, URLSession has
added the new AV streaming
network service type.
You should use it for your
streaming data request.
For audio playback, AVFoundation
is bringing many of their APIs
to watchOS 6 including AVPlayer
and AVQueuePlayer.
Also, for the first time,
CoreMedia is available in
watchOS.
If your application is already
set up for background audio
playback, it is ready for audio
streaming.
No other project configuration
is needed.
If your project is not
configured for background audio,
you will need to add this
capability to the WatchKit
extension target.
For this, open your Xcode
project and go to your WatchKit
extension target settings.
On the signing and capability
section, click Add Capability
and select Background Modes.
Finally, under Background Modes,
select the Audio Mode.
This is all that needs to be
done.
Now that the project is
configured, let's talk about the
different APIs that need to be
used during audio playback.
After your app launches and
before you activate an audio
session, you may need to
retrieve data from your servers.
This data is needed to present
streaming options and content to
users.
For example, album information,
playlist information, all
metadata about the content of
your applicant stream.
You may have already cached this
data when your app activated or
during the background refresh
opportunity.
If not, use URLSession to
retrieve your data.
At this time, socket, streaming
task, and the network framework
will not be available for use.
Once you have all the
information you need to begin
streaming, activate an audio
session.
The audio session should not be
activated before this point,
because activating one can
disrupt the user experience.
This is a very important
difference between watchOS and
iOS.
On iOS, there's always a default
audio route available.
Let's figure out.
This is not the case for
watchOS.
When you activate an audio
session, watchOS will
automatically present an audio
route picker on behalf of your
application if no route is
currently active.
There are two cases where
watchOS may be able to skip
presenting the audio route
picker.
For any Bluetooth device, if the
device is already connected to
the watch, or for Bluetooth
devices based on the Apple
wireless chip set, if the device
is connected to the iPhone, the
watch may temporarily borrow it.
There are cases where this is
not possible though, for
instance, if you are on a phone
call while connected to your
iPhone.
Once your application has an
active audio session, all of the
networking APIs are available to
retrieve audio content.
This includes
URLSessionStreamingTask,
URLSessionWebSocketTask, and the
network framework.
If you attempt to use these APIs
without an active audio session,
your calls will fail.
Finally, your application has
reached the point where it has
enough audio data to start
playback.
You can now use AVFoundation to
play your audio content.
If you need to request new
information from your servers to
do your streaming, you can use
all available networking APIs to
do this.
Now, let's talk about some audio
streaming best practices for
Apple Watch.
Audio streaming on Apple Watch
is available in Series 3 and
later.
This means that your application
needs to check if audio
streaming is available on the
watch it is running on.
In watchOS 6, use
WKInterphaseDevices
supportsAudioStreaming to make
this check.
The additional audio and
networking APIs in watchOS 6
mean that applications no longer
need to use WatchKit's WK audio
file APIs.
For this reason, these APIs have
been deprecated starting with
watchOS 6.
Now, let's discuss some
networking best practices.
Caching is very important.
The right amount of audio data
should be locally available at
all times to cope with changing
network conditions.
The number of network requests
and their sizes should be
reduced to the absolute minimum.
Extra requests that did not post
a problem on other devices may
delay or stall playback.
The same is true for downloading
unnecessary data in those
requests.
All of these can result in poor
user experiences.
To be safe, start streaming
using 64 kbps encoded audio
data.
Monitor the speed at which data
arrives to your application and
only upgrade to higher bit rates
if the network conditions allow
for them.
AVFoundation automatically does
this for HLS audio streaming.
Do not rely on network
reachability.
Due to the nature of networks,
the information returned by this
API may no longer be valid by
the time your application uses
it.
For the best user experience,
always assume that you have a
network connection and
gracefully handle stalls and
failures, and always adjust in
real-time the audio quality and
the amount of caching that your
application does.
Finally, your application is
likely to experience more
network transitions when running
an Apple Watch.
As the watch moves away from the
iPhone, a good transition from
Bluetooth to Wi-Fi or cellular.
It is not uncommon for the watch
to go between these three
network types while your app is
running.
Your application should be
prepared for such transitions,
which can take several seconds
to complete.
As you can see, when bringing
audio streaming applications to
Apple Watch from other
platforms, Apple or otherwise,
you should be prepared for the
possibility that you will need
to optimize your networking code
and protocols.
If you need more information to
get started writing audio
applications for Apple Watch,
Creating Audio Apps for watchOS
is a great start.
The information in the network
framework introduction talk is
100% applicable to watchOS.
Finally, check out these other
sessions to help create a great
audio streaming experience.