PodSearch

Under the Radar

132: Accessibility

 

00:00:00 ◼   ► Welcome to Under the Radar, a show about independent iOS app development.

00:00:04 ◼   ► I'm Marco Arment.

00:00:05 ◼   ► And I'm David Smith.

00:00:06 ◼   ► Under the Radar is never longer than 30 minutes, so let's get started.

00:00:10 ◼   ► Today what we want to talk about is accessibility.

00:00:14 ◼   ► If you remember from our Q&A episode a couple weeks ago,

00:00:17 ◼   ► we had a very brief discussion about accessibility,

00:00:21 ◼   ► but I think it's a topic that deserves a much broader discussion

00:00:24 ◼   ► than the few minutes you were able to give it inside of that.

00:00:27 ◼   ► It turns out also that this week has National Global Accessibility Awareness Day, I think.

00:00:35 ◼   ► I don't typically get into these kind of awareness days,

00:00:39 ◼   ► but it's just coincided well, and it seemed a good thing to talk about.

00:00:44 ◼   ► Because I think accessibility is a topic that is...

00:00:49 ◼   ► It's an interesting intersection between something very...

00:00:55 ◼   ► It's a very personal side of development,

00:00:57 ◼   ► because it tends to interact with people at a level that is different

00:01:02 ◼   ► than just our normal development.

00:01:04 ◼   ► And I think as a result, accessibility can often become something

00:01:07 ◼   ► that you can become very emotional about, or very...

00:01:09 ◼   ► It takes a different level of importance than a lot of things.

00:01:13 ◼   ► But before I dive into a bit more of what accessibility, the specifics of it,

00:01:17 ◼   ► I think it probably makes sense to have a bit of an overview

00:01:20 ◼   ► about what it is that we mean when we talk about accessibility.

00:01:23 ◼   ► And in general, I would say it's best to think about accessibility

00:01:28 ◼   ► as methods of development that make your app usable by specific communities

00:01:36 ◼   ► within your user base.

00:01:37 ◼   ► And that can take a lot of different uses, take a lot of different paths,

00:01:42 ◼   ► depending on if there's different impairments that you may have to be working around,

00:01:45 ◼   ► or to consider.

00:01:47 ◼   ► But in general, accessibility and usability are one and the same.

00:01:52 ◼   ► There are certain things that we might do in our application to make it usable,

00:01:56 ◼   ► just for general usability with our general population who uses our application.

00:02:00 ◼   ► And then accessibility, I think, is the extreme versions of those,

00:02:05 ◼   ► where we have to make it usable by people who don't have all of the affordances

00:02:10 ◼   ► that a typical user might have.

00:02:12 ◼   ► And so these often get into things like visual impairments,

00:02:15 ◼   ► physical impairments, auditory impairments.

00:02:17 ◼   ► There's a variety of things that could make our app less usable for somebody.

00:02:21 ◼   ► And so accessibility is about making it work for those users.

00:02:26 ◼   ► We often tend to think of accessibility as something that's for other people,

00:02:31 ◼   ► something that is for people who, "Well, we don't know anybody like that

00:02:34 ◼   ► because we're all young, able-bodied developers," whatever.

00:02:37 ◼   ► But the reality is almost everybody will use some kind of accessibility feature

00:02:41 ◼   ► sometime in their lives.

00:02:43 ◼   ► The most common example is text sizing, making text larger as you get older

00:02:49 ◼   ► and as your eyes get worse, because that's just how our bodies work.

00:02:52 ◼   ► And so it's good to think of accessibility not as a special accommodation

00:02:59 ◼   ► for other people, but as a collection of features, tools, and design considerations

00:03:06 ◼   ► that make the app usable for as many people as possible.

00:03:11 ◼   ► Yeah, and I think that, too, it's the powerful thing of --

00:03:14 ◼   ► I remember I used to think of accessibility as this --

00:03:18 ◼   ► it's like there's this thing for other people that I do for them,

00:03:22 ◼   ► which is a really kind of entitled, privileged way to see it.

00:03:27 ◼   ► It's like, "Oh, I'm being so kind to this other community."

00:03:30 ◼   ► But I'm very glad that I think over time I've developed that into a much more mature,

00:03:36 ◼   ► actual understanding that accessibility is something that is for everybody.

00:03:41 ◼   ► It is most beneficial and most impactful in special communities,

00:03:45 ◼   ► but it just makes my app better for everybody.

00:03:48 ◼   ► And I think about the last time I went and had my eyes dilated

00:03:53 ◼   ► when I was having an eye exam, and suddenly I need to crank dynamic type

00:03:58 ◼   ► all the way up to see my phone, and all of a sudden it's like,

00:04:02 ◼   ► "Right, yeah, this impacts everybody."

00:04:05 ◼   ► It impacts everybody to a different degree, but it's the same affordances

00:04:09 ◼   ► and the same benefits that apply to everybody.

00:04:12 ◼   ► Having that change in mindset that just makes your app better

00:04:17 ◼   ► and more accessible for everybody,

00:04:20 ◼   ► it changes the degree in which I was motivated to think about it.

00:04:24 ◼   ► And I think it was also just so useful to change my --

00:04:28 ◼   ► it's like this just as a person, that was a really useful thing.

00:04:32 ◼   ► Any time you can get away from that kind of others versus yourself mindset,

00:04:38 ◼   ► it's like, "No, this is just part of development because this is for everybody."

00:04:41 ◼   ► All of my users benefit from this.

00:04:44 ◼   ► It reminds me in a funny way of all of the episodes under the radar have a transcript.

00:04:50 ◼   ► If you look in your -- wherever you're listening to this now, in the show notes,

00:04:53 ◼   ► the top link is "episode transcript," and that is there in many ways

00:04:57 ◼   ► for people who can't hear the episode.

00:05:00 ◼   ► If you have auditory impairments, you may not be able to listen to us speak,

00:05:04 ◼   ► and so podcasts can be very inaccessible to you.

00:05:07 ◼   ► But if you have a transcript, you can read it if you're able to read.

00:05:10 ◼   ► But it also has benefits for people who might just want to quickly browse something,

00:05:17 ◼   ► if you want to search for something later.

00:05:19 ◼   ► There's a tremendous number of other benefits that can come from something

00:05:22 ◼   ► that is ostensibly an accessibility feature

00:05:25 ◼   ► or something that is more particularly targeted, but it benefits everybody.

00:05:29 ◼   ► And because it benefits everybody, it's also just smart business

00:05:33 ◼   ► to design your apps to maximize accessibility.

00:05:36 ◼   ► Because as you mentioned, it is kind of an extension of usability,

00:05:40 ◼   ► and no one questions the value of good usability in like,

00:05:44 ◼   ► "Oh, if you want your app to succeed, you should make it as usable as possible."

00:05:48 ◼   ► That seems universally agreed upon.

00:05:50 ◼   ► Accessibility is part of that, and yet accessibility kind of gets low priority

00:05:55 ◼   ► or people don't talk about it as much.

00:05:58 ◼   ► And I get that. I have been there.

00:06:01 ◼   ► I have frequently in my career, I have shipped accessibility problems.

00:06:06 ◼   ► I have shipped unlabeled voiceover buttons and stuff like that,

00:06:10 ◼   ► or I've broken accessibility because I forgot to test it when I moved a view around or something.

00:06:15 ◼   ► We've all made these mistakes, but I think it's important to keep it in mind more.

00:06:23 ◼   ► And if you have any kind of testing process, any kind of formalized checklist

00:06:27 ◼   ► or anything like that, to make it a part of that.

00:06:30 ◼   ► And that will help you avoid shipping accessibility problems.

00:06:34 ◼   ► Yeah. And I think too, probably to wrap up the overview,

00:06:37 ◼   ► is to say that why should you development?

00:06:39 ◼   ► Like if I was trying to convince somebody why making accessibility

00:06:42 ◼   ► a big part of their development process.

00:06:44 ◼   ► There's two main reasons for it.

00:06:46 ◼   ► I think there's the first, which is the more just general,

00:06:50 ◼   ► it's a good thing at a human level to make your apps very usable,

00:06:53 ◼   ► which is a good general thing.

00:06:55 ◼   ► But more specifically, it's good business.

00:06:58 ◼   ► It's in the same way that localizing your application

00:07:01 ◼   ► makes your app usable to broader communities,

00:07:05 ◼   ► which allows you to make more money or have a more sustainable business

00:07:09 ◼   ► because you have more users.

00:07:11 ◼   ► Accessibility is the same thing, where you open up your app to be usable

00:07:16 ◼   ► by these other communities that then allows you to broaden your user base,

00:07:20 ◼   ► which is just good business.

00:07:22 ◼   ► And thirdly, it's also just, Apple really likes accessibility,

00:07:26 ◼   ► and they care a lot about it.

00:07:28 ◼   ► And it is something that you will hear Apple talk about many times.

00:07:32 ◼   ► They spend a tremendous amount of effort,

00:07:34 ◼   ► clearly on the engineering side,

00:07:36 ◼   ► making sure that the tooling and abilities that we have

00:07:40 ◼   ► on the accessibility side are very robust.

00:07:42 ◼   ► And so doing things that Apple cares about is going to benefit you

00:07:46 ◼   ► in terms of featuring, in terms of your just general being a good member

00:07:52 ◼   ► of that community and having the knock-on benefits that that brings with it.

00:07:56 ◼   ► It's just a good business decision as well as a good human decision.

00:08:00 ◼   ► We are sponsored this week by Linode.

00:08:03 ◼   ► With Linode, you have access to a suite of powerful hosting options

00:08:06 ◼   ► with pricing starting at just $5 a month.

00:08:08 ◼   ► You can be up and running with your own virtual server

00:08:10 ◼   ► in the Linode cloud in under a minute.

00:08:12 ◼   ► Linode has hundreds of thousands of customers,

00:08:15 ◼   ► all of whom are serviced by their friendly 24/7 support team.

00:08:18 ◼   ► You can email them, call them, even chat over IRC in the Linode community.

00:08:22 ◼   ► They know how important it is to get the help you want,

00:08:25 ◼   ► and Linode also has a suite of amazing guides and support documentation

00:08:29 ◼   ► to give you any references when you need it.

00:08:31 ◼   ► So, for instance, if you wanted to learn details about how to set up

00:08:34 ◼   ► your Linux server, Linode, you can even, if you search the web,

00:08:37 ◼   ► these are public. Anybody can see these documentation.

00:08:39 ◼   ► And I have frequently found when I've searched for some kind of,

00:08:42 ◼   ► like, you know, Linux help thing, oftentimes the best answer

00:08:45 ◼   ► and one of the top answers is a Linode document.

00:08:47 ◼   ► They really know what you need, and they're really great at explaining it.

00:08:50 ◼   ► And they have an intuitive control panel.

00:08:52 ◼   ► This allows you to deploy, boot, resize, snapshot,

00:08:55 ◼   ► and clone your virtual servers in just a few clicks.

00:08:58 ◼   ► And they also now have two-factor authentication to keep you safe.

00:09:01 ◼   ► So Linode has fantastic pricing options for every budget and every need.

00:09:05 ◼   ► Their plans start at one gig of RAM for just five dollars a month,

00:09:09 ◼   ► and they offer lots of other plans that go up from there,

00:09:11 ◼   ► including high memory plans, depending on what your needs are.

00:09:14 ◼   ► As listener of this show, sign up at linode.com/radar.

00:09:18 ◼   ► That will support us and give you $20 towards any Linode plan.

00:09:21 ◼   ► So on that base $5 plan, that's four months free.

00:09:24 ◼   ► And with a seven-day money-back guarantee, there's nothing to lose.

00:09:27 ◼   ► So go to linode.com/radar to learn more, sign up,

00:09:31 ◼   ► and take advantage of that $20 credit, or use promo code radar2018 at checkout.

00:09:36 ◼   ► Thank you so much to Linode for supporting the show.

00:09:39 ◼   ► So I think now that it's sort of the general overview to the side,

00:09:42 ◼   ► I think let's dive into some of the more specific types of accessibility

00:09:47 ◼   ► and probably even more over from the developer perspective,

00:09:50 ◼   ► some of the tools and abilities that we have as a result.

00:09:53 ◼   ► And I think the main area to start with probably are visual accessibility tools that we can use.

00:09:59 ◼   ► So visual impairments can come in all varieties.

00:10:02 ◼   ► They can go all the way to the extreme forms of things like blindness,

00:10:05 ◼   ► where a user is completely unable to view the interface that your app has,

00:10:11 ◼   ► to the more minor, to things like we were talking about,

00:10:15 ◼   ► where they have difficulty seeing things that are small,

00:10:18 ◼   ► they have difficulties around differentiating between colors or contrast,

00:10:23 ◼   ► and so you can run the gambit between those.

00:10:25 ◼   ► But in general, because our apps at their core are fundamentally visual things,

00:10:32 ◼   ► one of the key innovations of the iPhone was that it didn't have any buttons on the main screen,

00:10:39 ◼   ► which means that our entire app is functionally something that is visual,

00:10:43 ◼   ► that there's no tactile cues to it, or at least not intrinsically.

00:10:48 ◼   ► And so there's a variety of different things that we have to take advantage of.

00:10:52 ◼   ► And I think the first one and probably the biggest one that most people think about

00:10:55 ◼   ► when they think of visual accessibility is the voiceover system in iOS,

00:11:01 ◼   ► which if you've never used it, I highly recommend that you stop this episode now,

00:11:06 ◼   ► go turn it on, and just play with your iPhone for a little while,

00:11:10 ◼   ► because it is a fascinating alternative way to navigate an iPhone,

00:11:15 ◼   ► that you can do essentially everything that you currently do with your iPhone,

00:11:19 ◼   ► you can do without having--if you close your eyes and just swipe left and right

00:11:25 ◼   ► and then double-tap to select things,

00:11:27 ◼   ► you do a tremendous amount of capabilities of your iPhone without ever having to look at it.

00:11:33 ◼   ► And so voiceover is that system.

00:11:35 ◼   ► It's a system that is this alternative interface on top of the main interface,

00:11:40 ◼   ► and you'll see it visually with these little cues,

00:11:43 ◼   ► which obviously if you couldn't see them, they're not important,

00:11:46 ◼   ► but they're ways for us as developers at least to see what's happening,

00:11:50 ◼   ► where it's a way of navigating the screen hierarchically,

00:11:54 ◼   ► so you move from element to element to element,

00:11:58 ◼   ► and then rather than some of the--in a typical interface on the iOS,

00:12:04 ◼   ► there's typically direct input, so wherever you--

00:12:07 ◼   ► if you want to tap on a button, you have to find--

00:12:09 ◼   ► your finger has to be directly over that button.

00:12:12 ◼   ► What voiceover does is it takes that and adds a level of indirection

00:12:15 ◼   ► where you have a selection state and then a tap state, for example.

00:12:20 ◼   ► So you would swipe over until the button you want to select is selected,

00:12:25 ◼   ► and then you double-tap on the screen,

00:12:27 ◼   ► and so where you're swiping is irrelevant in voiceover,

00:12:30 ◼   ► and so it creates that level of indirection,

00:12:32 ◼   ► which then allows you to use it if you can't see the screen.

00:12:36 ◼   ► I would even say--go a little harder on this--

00:12:38 ◼   ► I would say actually learn voiceover.

00:12:41 ◼   ► Figure out the basics, which it sounds intimidating.

00:12:45 ◼   ► Trust me, it's not. It's really quite simple.

00:12:47 ◼   ► It's like swipe right to go to the next item in the sequence,

00:12:50 ◼   ► swipe left to go to the previous item in the sequence,

00:12:52 ◼   ► double-tap the screen to select something.

00:12:55 ◼   ► That's roughly all--that's the basics to all--

00:12:58 ◼   ► that's all you need to know to start this.

00:13:00 ◼   ► There are lots of other little tricks.

00:13:02 ◼   ► One thing the developers should make sure your apps work with

00:13:04 ◼   ► is if you present any kind of custom modals or sheets or anything like that,

00:13:09 ◼   ► you want to support the accessibility perform escape gesture,

00:13:13 ◼   ► which is two fingers on the screen, swipe left, right, left,

00:13:16 ◼   ► and it's kind of like a zigzag, like you're crossing out the current screen,

00:13:20 ◼   ► and that should dismiss or be like a cancel button

00:13:23 ◼   ► on any kind of modal or sheet and everything,

00:13:25 ◼   ► and that's something that the built-in stuff

00:13:27 ◼   ► does not make it incredibly easy to support that

00:13:30 ◼   ► if you don't know about it, but once you know about it,

00:13:32 ◼   ► it's pretty easy.

00:13:33 ◼   ► But I would say the basics of voiceover,

00:13:36 ◼   ► swipe right, swipe left, double-tap to select,

00:13:39 ◼   ► learn that, then actually cover your eyes

00:13:43 ◼   ► or look away from the screen and try to navigate your app

00:13:46 ◼   ► and try to actually use it and see,

00:13:48 ◼   ► does the sequence of these things make sense?

00:13:51 ◼   ► Are there things that are missing?

00:13:52 ◼   ► Are there states that you can get in that you can't get out of

00:13:55 ◼   ► because you can't leave the screen from voiceover

00:13:58 ◼   ► or you can't leave this mode?

00:14:00 ◼   ► Things like that are incredibly important

00:14:02 ◼   ► for just the basics of voiceover testing.

00:14:04 ◼   ► And voiceover also, not only does it serve visual impairments,

00:14:08 ◼   ► but the same kind of mechanic, the same system,

00:14:11 ◼   ► can also serve things like motor disabilities and things like that

00:14:14 ◼   ► because it's using these same APIs and everything.

00:14:16 ◼   ► So the voiceover accessibility API is the number one API

00:14:21 ◼   ► to try to support after probably dynamic type,

00:14:24 ◼   ► although ideally you shouldn't have to choose,

00:14:26 ◼   ► you should really be supporting both.

00:14:27 ◼   ► But those are the two big ones.

00:14:30 ◼   ► And really, it does not take much to teach yourself voiceover

00:14:35 ◼   ► enough to be able to go through your app

00:14:38 ◼   ► and just see if there's any major pain points.

00:14:40 ◼   ► And I would even extend that to say,

00:14:42 ◼   ► actually, if at all possible, seek out voiceover testers,

00:14:46 ◼   ► seek out people who are full-time voiceover users

00:14:49 ◼   ► on their phones as your beta testers.

00:14:52 ◼   ► I made tons of voiceover mistakes

00:14:54 ◼   ► until I had voiceover people on my betas,

00:14:56 ◼   ► and it made all the difference in the world.

00:14:58 ◼   ► I know how an interface should look.

00:15:01 ◼   ► I have a pretty good idea of how the app should be laid out visually.

00:15:05 ◼   ► But because I'm not a full-time voiceover user,

00:15:08 ◼   ► not only do I not run into those problems if they exist,

00:15:11 ◼   ► but I don't really have a good concept of what's good.

00:15:14 ◼   ► And so it's important to have full-time voiceover users,

00:15:17 ◼   ► if at all possible, testing your app and telling you,

00:15:20 ◼   ► not only if they see any problems,

00:15:22 ◼   ► but also what's good design, what's bad design?

00:15:25 ◼   ► What works, what's a pain,

00:15:27 ◼   ► what's more complicated than it needs to be?

00:15:29 ◼   ► One of the questions I had was,

00:15:31 ◼   ► when I was arranging my now-playing screen elements in voiceover,

00:15:36 ◼   ► and I thought it would make more sense

00:15:39 ◼   ► to have the most frequently used things come first

00:15:43 ◼   ► in the sequence of things that you're iterating through,

00:15:45 ◼   ► even though that's not how the screen is laid out.

00:15:48 ◼   ► If you just try to read the screen left to right, top to bottom,

00:15:51 ◼   ► that isn't how the screen is laid out.

00:15:53 ◼   ► The most frequent controls are on the bottom, actually.

00:15:55 ◼   ► So in the sequence of the naively ordered controls,

00:15:58 ◼   ► they would almost be last.

00:16:00 ◼   ► But I was like, "Don't you want play/pause first,

00:16:03 ◼   ► and skip forward second, and skip back third?"

00:16:06 ◼   ► Stuff like that.

00:16:07 ◼   ► And so I just asked my voiceover testers,

00:16:09 ◼   ► "Hey, would this be weird? Would this be unusual?

00:16:13 ◼   ► Would this be bad or off-putting to arrange these in a custom way?

00:16:17 ◼   ► Or is that a useful thing to do?"

00:16:20 ◼   ► Because I honestly don't know what's normal.

00:16:23 ◼   ► What would throw somebody off as being weird or unexpected,

00:16:26 ◼   ► versus what's a nice convenience.

00:16:29 ◼   ► And I got great feedback on stuff like that.

00:16:31 ◼   ► So anything you can do to have voiceover testers,

00:16:34 ◼   ► and this applies to all other types of accessibility APIs, too,

00:16:38 ◼   ► have testers that use different dynamic type sizes.

00:16:41 ◼   ► My dynamic type implementation in Overcast is still not perfect.

00:16:44 ◼   ► I only know that because people tell me,

00:16:46 ◼   ► because I have testers who actually use it and tell me.

00:16:48 ◼   ► So it's just incredibly valuable to have that kind of actual feedback,

00:16:52 ◼   ► because it is important for you as a developer to try to learn,

00:16:57 ◼   ► to test out your app in these different scenarios,

00:17:00 ◼   ► and learn the basics of voiceover so you can navigate it and stuff like that.

00:17:03 ◼   ► But you're never going to use it as much,

00:17:06 ◼   ► and find as much good and bad stuff about your implementation,

00:17:10 ◼   ► or have as much of a sensibility of what works and what doesn't,

00:17:13 ◼   ► as a full-time user of these technologies.

00:17:15 ◼   ► So if at all possible, involve people who use them in your testing.

00:17:18 ◼   ► And I'd say, too, one of my biggest recommendations

00:17:22 ◼   ► for anyone who is going to be at WWDC,

00:17:24 ◼   ► who has a ticket and is going to be inside,

00:17:26 ◼   ► is to make an appointment for the Accessibility Lab.

00:17:28 ◼   ► Yes.

00:17:29 ◼   ► Where typically, the way I've gone every year,

00:17:31 ◼   ► I always find a reason to go, even if I don't have a pressing reason,

00:17:34 ◼   ► because I learn so much from the experience,

00:17:37 ◼   ► because the way it's typically set up is they have a typically sighted user

00:17:41 ◼   ► and a non-typically sighted user,

00:17:43 ◼   ► someone who has a vision impairment of some kind from Apple,

00:17:47 ◼   ► who will sit down and they'll go through and use your app.

00:17:50 ◼   ► And you get to watch and take notes on how they use it,

00:17:55 ◼   ► what they see, what they're hearing,

00:17:57 ◼   ► the speed at which they're interacting with.

00:17:59 ◼   ► And that in-person experience, I found to be tremendously helpful

00:18:03 ◼   ► for understanding things that you wouldn't really understand otherwise.

00:18:07 ◼   ► I've learned a lot around how verbose I want to make my button

00:18:11 ◼   ► accessibility labels be, for example.

00:18:14 ◼   ► Spoiler, not.

00:18:16 ◼   ► Yeah, you get this, where they're like, "No, no, no,

00:18:19 ◼   ► the shortest amount of text possible.

00:18:21 ◼   ► I don't need to be having this big, long thing where,

00:18:24 ◼   ► so for a lot of my apps, it's like I'm displaying user data.

00:18:27 ◼   ► And so for a while, I would have these usability labels

00:18:31 ◼   ► that would be like, "Your steps on Thursday, May 17th, 2018,

00:18:36 ◼   ► were 10,163."

00:18:39 ◼   ► And she's like, "I don't need that. I know where I am in the app.

00:18:43 ◼   ► You can just say Thursday's steps, 10,383."

00:18:46 ◼   ► And that's all they wanted, because they're very used to,

00:18:51 ◼   ► they have a tremendous ability, you develop a tremendous ability

00:18:54 ◼   ► to know where you are in the hierarchy,

00:18:56 ◼   ► and they have to wait to listen to what's going on

00:19:01 ◼   ► before they can make their next action.

00:19:03 ◼   ► And so if you make those labels really long,

00:19:05 ◼   ► it's hard for them to navigate quickly.

00:19:07 ◼   ► Also, things like I learned from going to the accessibility lab

00:19:10 ◼   ► was like putting the most important information up front,

00:19:13 ◼   ► not at the end.

00:19:15 ◼   ► And so actually, I think what I do in my apps,

00:19:18 ◼   ► I think I say the number of steps first,

00:19:20 ◼   ► and then I say the date in certain circumstances,

00:19:23 ◼   ► because that's actually what they're interested in,

00:19:25 ◼   ► rather than the date.

00:19:27 ◼   ► Because once they have what they need,

00:19:29 ◼   ► they can move on or swipe to the next thing,

00:19:31 ◼   ► or if this is not the right thing.

00:19:33 ◼   ► But I highly recommend going and seeing that in person.

00:19:35 ◼   ► Or if you know somebody in person who has a vision impairment

00:19:38 ◼   ► and uses VoiceOver, it's tremendously effective.

00:19:41 ◼   ► Because at its core, VoiceOver is,

00:19:44 ◼   ► it's almost like painfully simple to implement on a developer side.

00:19:48 ◼   ► Every UI control in iOS has accessibility baked into it,

00:19:53 ◼   ► and most of what you're doing when you're making your app work well

00:19:57 ◼   ► with VoiceOver is making sure that you set accessibility labels

00:20:00 ◼   ► for everything so that when an element becomes the focused element,

00:20:04 ◼   ► that's what VoiceOver reads.

00:20:06 ◼   ► And so you need to have a description of what that is,

00:20:10 ◼   ► and then making sure that the hierarchy within your app makes sense,

00:20:14 ◼   ► so that as you swipe left and right,

00:20:16 ◼   ► it's logically moving through the hierarchy of your app,

00:20:20 ◼   ► rather than it's, in general, it does a pretty good job of doing that,

00:20:24 ◼   ► because it's sort of working its way along visually,

00:20:27 ◼   ► based on sort of X, Y coordinates,

00:20:29 ◼   ► but sometimes you need to override that

00:20:32 ◼   ► with an orientation that makes sense.

00:20:34 ◼   ► So as an example, like in Podometer++,

00:20:37 ◼   ► I have a bunch of bar graphs showing the history of your step counts.

00:20:42 ◼   ► In the default implementation, they would go from left to right,

00:20:47 ◼   ► which in my case would be oldest to newest,

00:20:50 ◼   ► whereas for an accessibility perspective, I flip that around.

00:20:53 ◼   ► And so the newest is the earliest one,

00:20:56 ◼   ► and then it works its way back in time,

00:20:58 ◼   ► even though visually that's flipped.

00:21:00 ◼   ► Things like that are basically all you have to do

00:21:04 ◼   ► to make good use of VoiceOver,

00:21:06 ◼   ► good labels and good hierarchy,

00:21:08 ◼   ► and you'll be like 99% there,

00:21:10 ◼   ► and then get feedback from users as best you can,

00:21:12 ◼   ► either in person, at the Accessibility Lab,

00:21:15 ◼   ► beta testing, wherever you can.

00:21:17 ◼   ► - And I can't stress enough how important it is to just try it.

00:21:20 ◼   ► Just try your app.

00:21:22 ◼   ► There's a few things you can do.

00:21:24 ◼   ► You can set the triple tap home button shortcut

00:21:27 ◼   ► to turn on and off VoiceOver.

00:21:29 ◼   ► And that's something I've found

00:21:30 ◼   ► after years of accidentally triggering that

00:21:33 ◼   ► when I meant to double click the home button

00:21:35 ◼   ► and hearing VoiceOver on in the middle of the world.

00:21:38 ◼   ► (laughs)

00:21:39 ◼   ► I turned that off because I learned

00:21:41 ◼   ► that you could just turn it on and off via Siri.

00:21:43 ◼   ► So you can just ask Siri, "Turn VoiceOver on.

00:21:45 ◼   ► "Turn VoiceOver off."

00:21:46 ◼   ► And it takes two seconds and no setup to do that,

00:21:49 ◼   ► so it's great.

00:21:51 ◼   ► And then just try it because usually when you mess up,

00:21:54 ◼   ► it's usually like, oh, you have some kind of custom button

00:21:57 ◼   ► that doesn't have the standard label text.

00:21:59 ◼   ► It has some other way to display what it is,

00:22:01 ◼   ► and you didn't put in a label.

00:22:02 ◼   ► So you scroll past it with VoiceOver,

00:22:04 ◼   ► and it just says, "Button, button."

00:22:06 ◼   ► And it's like, oh, god, it's like head-smackingly obvious.

00:22:10 ◼   ► It's embarrassing how easy it is to fix that.

00:22:12 ◼   ► It takes two seconds to add an Accessibility label,

00:22:15 ◼   ► and you fix this incredibly embarrassing Accessibility bug.

00:22:18 ◼   ► So just actually trying it and testing it

00:22:21 ◼   ► gets you so far, so much of the way there.

00:22:23 ◼   ► I'd also say if you don't know

00:22:25 ◼   ► or can't access any visually impaired users

00:22:28 ◼   ► who use this kind of stuff,

00:22:30 ◼   ► at least what everybody can do is look on YouTube

00:22:32 ◼   ► and try to look at videos of screen reader users

00:22:35 ◼   ► actually using their screen readers.

00:22:37 ◼   ► And that should give you some sense of how they navigate,

00:22:39 ◼   ► how quickly they navigate,

00:22:41 ◼   ► what kind of phrasing and wording you should use,

00:22:44 ◼   ► how brief or verbose should you be, things like that.

00:22:47 ◼   ► It's not a great solution, but it's better than nothing.

00:22:50 ◼   ► - The next kind of type of accessibility

00:22:52 ◼   ► that's probably worth talking about

00:22:53 ◼   ► is just around things like dynamic type,

00:22:56 ◼   ► which I think is a simpler topic,

00:22:58 ◼   ► where dynamic type is inside of iOS.

00:23:00 ◼   ► You can set the system text size queue in the Settings app

00:23:06 ◼   ► or then in the Accessibility app

00:23:08 ◼   ► if you want really, really, really big text.

00:23:11 ◼   ► And this is something that I've noticed

00:23:13 ◼   ► just in normal life is used incredibly widely.

00:23:19 ◼   ► Voiceover use is probably a relatively smaller part

00:23:22 ◼   ► of your user community.

00:23:24 ◼   ► Dynamic type is a very large proportion

00:23:26 ◼   ► of your user community.

00:23:28 ◼   ► And I think in general, dynamic type is pretty straightforward

00:23:30 ◼   ► because it just makes everything bigger.

00:23:33 ◼   ► And especially this has gotten easier

00:23:35 ◼   ► as we have to support multiple phone sizes,

00:23:38 ◼   ► that having more flexible, flowable layouts

00:23:40 ◼   ► is just something that I think in general

00:23:42 ◼   ► we kind of have to do because we have to make an app

00:23:45 ◼   ► that works on a 5S screen

00:23:48 ◼   ► all the way up to an 8+ screen.

00:23:51 ◼   ► And so you have to be flexible anyway.

00:23:54 ◼   ► And so dynamic type is just a way of saying,

00:23:56 ◼   ► "Make my text bigger, make my text smaller,

00:23:59 ◼   ► and as it gets bigger, making sure that it doesn't break,"

00:24:01 ◼   ► is functionally what dynamic type is.

00:24:03 ◼   ► And I think it's just a question

00:24:05 ◼   ► of making your app flexible in layout

00:24:07 ◼   ► so that when you crank up dynamic type,

00:24:10 ◼   ► if everything just becomes--

00:24:11 ◼   ► you get the first letter and the last letter

00:24:13 ◼   ► and then a bunch of ellipses in the middle

00:24:15 ◼   ► because everything's getting truncated.

00:24:17 ◼   ► You didn't do dynamic type right.

00:24:19 ◼   ► So it's something to try and to make sure

00:24:21 ◼   ► that your app responds reasonably well to

00:24:24 ◼   ► as well as opting into supporting it.

00:24:27 ◼   ► Some controls will automatically do this.

00:24:29 ◼   ► Like, certain UI label setups will just automatically use it,

00:24:33 ◼   ► which you want to make sure you know

00:24:35 ◼   ► that they're going to opt into.

00:24:36 ◼   ► But it also just--in general, you can ask the system

00:24:39 ◼   ► for what the dynamic type size is right now,

00:24:42 ◼   ► and even if you're doing custom rendering,

00:24:44 ◼   ► you could respond to it appropriately.

00:24:47 ◼   ► And lastly, I think there's some elements around accessibility

00:24:52 ◼   ► for things like colors and button shapes,

00:24:56 ◼   ► things that users who may have difficulty

00:24:58 ◼   ► with low-contrast displays.

00:25:01 ◼   ► And so it's just in general--

00:25:02 ◼   ► it's always the general rule that I try and keep to is

00:25:06 ◼   ► color is a powerful way to communicate something to my user,

00:25:10 ◼   ► but it shouldn't be the only way that I communicate with my user.

00:25:13 ◼   ► So if you have--if I need to differentiate something

00:25:18 ◼   ► by only with color, then I'm making an interface

00:25:23 ◼   ► that's going to be confusing to users who have difficulty

00:25:26 ◼   ► differentiating colors or similar impairments.

00:25:29 ◼   ► And in general, that's just probably bad design.

00:25:31 ◼   ► I mean, this came up a lot around the iOS 7 redesign,

00:25:35 ◼   ► where color became the thing that we used

00:25:37 ◼   ► to differentiate buttons from just text.

00:25:40 ◼   ► And so I think in general, I tend to prefer actually making buttons

00:25:44 ◼   ► with some other affordance to them,

00:25:46 ◼   ► whether that be a rounded rectangle around them

00:25:48 ◼   ► or some indication, maybe an underline,

00:25:51 ◼   ► to make it seem that this is something different,

00:25:53 ◼   ► that it isn't just the color that makes it different.

00:25:56 ◼   ► Finally, I think I'd like to end with a plea to Apple.

00:26:01 ◼   ► There is no way in the App Store for users of apps

00:26:06 ◼   ► or buyers or potential users of apps

00:26:08 ◼   ► to know whether an app has accessibility compatibility or not.

00:26:12 ◼   ► There's no way to know if an app has been tested for voiceover.

00:26:15 ◼   ► There's no way to know if it responds to dynamic type,

00:26:18 ◼   ► things like that.

00:26:19 ◼   ► And so if you are a user who uses these technologies,

00:26:21 ◼   ► who needs these technologies, you're taking a risk.

00:26:24 ◼   ► You have no way to know whether an app that you're interested in

00:26:27 ◼   ► possibly buying will work for you at all or not.

00:26:30 ◼   ► The App Review tests apps for other things like crashing,

00:26:33 ◼   ► things like that.

00:26:34 ◼   ► So people can be sure that you're downloading an app

00:26:36 ◼   ► that will work if you don't need these technologies.

00:26:39 ◼   ► If you do, you have no way to know.

00:26:41 ◼   ► It's almost as if you don't have App Review for yourself.

00:26:43 ◼   ► And I wish Apple would either test for the basic accessibility technologies

00:26:50 ◼   ► like dynamic type and voiceover during App Review

00:26:52 ◼   ► and actually reject apps if you didn't do it,

00:26:54 ◼   ► which would also save us from shipping embarrassing shortcomings,

00:26:57 ◼   ► either require that or allow developers to opt in,

00:27:01 ◼   ► to optionally have that testing applied to us

00:27:04 ◼   ► and display some kind of little icon in the App Store page

00:27:07 ◼   ► for our apps that we are accessible.

00:27:10 ◼   ► I wrote a blog post to this effect a couple years ago.

00:27:12 ◼   ► It didn't get anywhere yet, but I still would like that

00:27:16 ◼   ► to be considered by Apple because if you think about

00:27:20 ◼   ► the value of App Review for mainstream purposes,

00:27:24 ◼   ► this is a pretty big thing that it serves that same kind of goal,

00:27:27 ◼   ► like making sure, giving people the assurance that apps will work for them

00:27:33 ◼   ► in a basic way, I think that would go a long way in accessibility as well.

00:27:37 ◼   ► Oh, sure. I also love the thought of it being an added incentive

00:27:43 ◼   ► for developers to adopt accessibility in a robust way within their applications.

00:27:48 ◼   ► Exactly.

00:27:49 ◼   ► If there is an additional flag or gold star that you get in the App Store

00:27:55 ◼   ► as a result of doing it, all the better.

00:27:58 ◼   ► That just seems like that would be a wonderful win.

00:28:01 ◼   ► Thanks for listening, everybody, and we'll talk to you next week.

00:28:03 ◼   ► Bye.

00:28:05 ◼   ► [BLANK_AUDIO]