00:00:00 ◼ ► Welcome to Under the Radar, a show about independent iOS app development. I'm Mark Orment.
00:00:05 ◼ ► And I'm David Smith. Under the Radar is never longer than 30 minutes, so let's get started.
00:00:11 ◼ ► Yeah, it's funny, because a couple weeks ago we had WWDC, and I think that is, in the moment,
00:00:23 ◼ ► The first few couple days of WWDC is very much just trying to wrap your head around what are the things that are new,
00:00:31 ◼ ► what are the things that are interesting, what does Apple want you to care about this year,
00:00:40 ◼ ► Apple does a reasonably good job of communicating that in the keynote and State of the Union,
00:00:44 ◼ ► but there's always the little nooks and crannies in places where different things can happen.
00:00:57 ◼ ► And it's kind of a weird summer for me, because I feel like last summer turned out to be a pretty big summer for me.
00:01:06 ◼ ► I talked about plans for world domination of widgets, and it turned out that that was successful.
00:01:20 ◼ ► Whereas this year, it's much quieter. I look at my notebook, and so usually what I've done with WWDC is I'll sit down,
00:01:26 ◼ ► and at the end I find for some reason I don't know why, but paper seems to work better for this than me.
00:01:41 ◼ ► but it's almost in a weird way that this fall there will be a lot of point releases to my apps to support the new stuff,
00:02:00 ◼ ► It's adding support for the extra large widget in WidgetSmith, which is great, but is a relatively minor feature,
00:02:15 ◼ ► We can certainly dive into it. I think it's interesting, we'll talk about it more, what it actually looks like in practice.
00:02:20 ◼ ► It's a quiet summer, maybe one that will be spent a bit more outside than trapped inside and feverishly working away.
00:02:30 ◼ ► Kind of similar. After the excitement died down from WVDC, and after I watched a bunch of session videos,
00:02:37 ◼ ► and played with a few of the new APIs, I've gotten to the point where I think I have a pretty clear path forward
00:02:44 ◼ ► of how I'm going to be doing things. I've already built certain things using some new APIs,
00:02:55 ◼ ► There's a whole bunch of various niceties that you can conditionally enable with the available macros,
00:03:02 ◼ ► for things like, there's some new properties on URL requests, so you can properly attribute them for the privacy tracking features.
00:03:10 ◼ ► There's the new refund sheet that you can conditionally enable on your purchase screen.
00:03:17 ◼ ► There's stuff like that that we can do, but none of that really requires massive revamping of anything.
00:03:48 ◼ ► There's the UI Sheet Presentation Controller to have a system where you can show sheet style controllers.
00:04:07 ◼ ► a lot of that's going to be harder to actually use in practice until you can require 15,
00:04:22 ◼ ► Most of my plan for the summer is really features and fixes, and that's what I've been doing.
00:04:37 ◼ ► I've actually had a pretty good couple of weeks, and I've been working on just features my users want.
00:05:19 ◼ ► to be like, how many of these things will they fix for me so I don't have to deal with it?
00:05:29 ◼ ► from the 15 changes to navigation and table views, I'm mostly just doing feature work now.
00:06:05 ◼ ► But I do remember using it at some levels, so you're not completely off base in attempting to use it.
00:06:26 ◼ ► That's this kind of elusive, under-documented thing out there that it seems like no one's using it,
00:06:32 ◼ ► but that's the replacement for begin background task in places where you don't have that API available to you,
00:06:49 ◼ ► as soon as the audio stops, you have a very small amount of time while your app is not suspended.
00:07:05 ◼ ► and then they get back to their house, pause, they take out the headphones and that's it.
00:07:08 ◼ ► And then the watch then, my process is not running for enough time when it's actually internet connected
00:07:53 ◼ ► and I've got to redo my CarPlay interface for the new iOS 14 CarPlay API from last year.
00:08:10 ◼ ► I think is a perfectly fine and reasonable place to be, even though it's all one year old.
00:08:49 ◼ ► I want to use all this new stuff. I want to use SwiftUI's new search box and the refreshable
00:09:09 ◼ ► and finally adopting some of the stuff from iOS 14 last year that I just haven't had time to get to.
00:09:19 ◼ ► I've been spending my programming time recently, like we were talking about last episode,
00:10:11 ◼ ► But I'm not really taking too much advantage of it because there's just not a huge amount there
00:10:33 ◼ ► I just get a reasonable experience for free, and I can enhance that experience, which is great.
00:10:42 ◼ ► But it's so nice to not have this place where I need to just dive in and learn this whole new thing
00:11:04 ◼ ► This summer, I think even just personally, it's kind of nice to be able to be a little more low-key with work.
00:11:19 ◼ ► That's just the reality of not having a 9-to-5 job, is that you can work whenever for however much you want.
00:11:29 ◼ ► And it's kind of nice that I think this summer will be an opportunity to work a little bit less
00:11:51 ◼ ► At least at this point, it is really kind of reassuring to not have any plans for any new apps.
00:12:29 ◼ ► I've been migrating a lot of things over to Swift or from old APIs to new APIs or both,
00:12:38 ◼ ► It's work that when the platform is moving very quickly with a bunch of must-have changes,
00:13:06 ◼ ► And so we're able, if we want to spend time paying down technical debt or making new features,
00:13:43 ◼ ► It kind of shows that Apple kind of took this year to be mostly a stability and refinement year as well.
00:14:55 ◼ ► as perceived by your users, engage with your users by letting them report issues and questions
00:15:25 ◼ ► Join over 25,000 top mobile developers around the world who use Instabug to ship high-quality apps.
00:15:48 ◼ ► it is weird to also have, I've started to think about and feel a bit more confident about tackling
00:15:53 ◼ ► some of the more business-y features, things that I think might help my apps, but aren't technical.
00:16:00 ◼ ► Like, there's the tech debt that you've been talking about, which I think is certainly something we're always paying down,
00:16:04 ◼ ► but I feel like sometimes there's also this, like, I don't know, business and marketing debt that I've been accumulating as well.
00:16:10 ◼ ► And, like, for example, one of the things is localization, and it's something that I, you know,
00:16:16 ◼ ► a couple of my apps are localized and a couple of them aren't, and, you know, the reason some of them aren't
00:16:20 ◼ ► is because I know it's an undertaking. It takes a long time to do it well and reasonably,
00:16:32 ◼ ► But it's also on the flip side. I've also seen the effect of it firsthand, where it can really help with downloads
00:16:39 ◼ ► and with usage and certainly the customer experience if, you know, your app has a meaningful audience
00:16:49 ◼ ► who doesn't speak, you know, English in my case, the language of the developer. It's certainly a benefit.
00:16:56 ◼ ► And so it's like one of my things on my to-do list is, like, once I kind of knock out some of the technical stuff,
00:17:01 ◼ ► is I think I'll have time to potentially start exploring that and thinking about, you know, localizing WidgetSmith
00:17:06 ◼ ► or trying out some of those things where I just previously, I've been so focused on, you know,
00:17:12 ◼ ► I'm in Xcode so much that I'm not even really thinking about that. Or similarly, it's like Apple is introducing all this,
00:17:19 ◼ ► it's not quite A/B testing, but it sort of is, like, so all these things that we can start to do with our App Store page,
00:17:25 ◼ ► which is something that I'm a little intimidated by in some ways, just because it's not an expertise or an area of mine,
00:17:31 ◼ ► and I know it's going to take a lot of time for me to really kind of explore and understand it as a result.
00:17:37 ◼ ► But it's kind of nice to feel like I have a little bit of the slack to be able to dive into that a little bit
00:17:43 ◼ ► and, you know, at least do a few cursory explorations into that of creating, you know, three different sets of screenshots
00:17:50 ◼ ► and trying them out and seeing if a different set of screenshots works in a different context or those kinds of things
00:17:56 ◼ ► that Apple is allowing us to do now. And so it's kind of cool to be able to explore those a little bit.
00:18:04 ◼ ► And as much as, you know, as much as I think ostensibly I would like to do more and better with that,
00:18:10 ◼ ► it's something that I've learned from history that usually making sure that my technical ducks are in order
00:18:15 ◼ ► is overall much more important and a much better use of my time than spending all this time and effort on the sort of the businessy size
00:18:27 ◼ ► And so I can sort of make up for it a bit by, you know, focusing my time where it's better spent.
00:18:33 ◼ ► But it's kind of an interesting aspect too this summer that it's, you know, I feel like for a long time,
00:18:37 ◼ ► the last item on my to-do list has always been like localize this app and I kept pushing it off, pushing it off.
00:18:43 ◼ ► And in some ways I had been pushing it off because I was expecting, oh, this summer I'm going to have to implement a whole bunch of new stuff technically.
00:18:51 ◼ ► And it's kind of nice that when I look through it, it's like, you know, it's like maybe a third of the summer is going to be like mandatory technical work.
00:18:59 ◼ ► Maybe a third of the summer is kind of optional fun technical work. And there's, you know, a third of the summer that is just available for, you know,
00:19:15 ◼ ► Like in the last, you know, week or so, like when I've been kind of toying with some things, you know, toying with some new APIs I haven't used before,
00:19:22 ◼ ► you know, toying with, you know, different ways to do things that I've been doing for a while but like revisiting old methods that I was doing something.
00:19:30 ◼ ► I'm like, you know, I first tried to do this thing and I got the math wrong and I thought it just didn't work.
00:19:36 ◼ ► Let me try doing it again and maybe I can get the math right and maybe I can get it to work.
00:19:40 ◼ ► And sometimes I succeeded at that. And so it's just, it's fun. I guess it's optionally fun. In the Swift way, there's optionals everywhere.
00:19:56 ◼ ► This is the one audience that really would appreciate it though. I'm sure that one absolutely landed perfectly.
00:20:01 ◼ ► Yeah, I'm sure. But yeah, that kind of thing to me, or you know, just again, like moving stuff from old code to new code is actually fun for me.
00:20:11 ◼ ► Like it's in part a pain in the butt. It's certainly a pain in the butt when like you have to re-fix all the bugs and edge cases that you had originally fixed in the original code that you forgot about when you moved it over to the new code.
00:20:22 ◼ ► But overall, like programmers love rewriting stuff. That is fun. Especially when the new way can be smaller, cleaner, possibly more advanced, more resilient or whatever.
00:20:34 ◼ ► And this is all going to get even better once we can require 15 and then we can all use async/await and all that other stuff.
00:20:47 ◼ ► Yeah, I think in a weird way that particular situation with async/await is really interesting to me because I'm really excited by it and I really like, oh, I watched a bunch of W3C videos and I was kind of diving into it and it's like, this is really cool.
00:20:59 ◼ ► But since I need to require 15 in order to use it, I don't expect to really like, you know, sink my teeth into it until much, much later.
00:21:10 ◼ ► Because it's still going to be in flux probably and I can't use it in practice because it's not the kind of thing you can really like, you know, if iOS 15 do this, if iOS 14 do that, like you're going to drive yourself insane trying to do that.
00:21:24 ◼ ► And so instead it's just kind of like, cool, it's nice to know that's coming. Like maybe this time next summer it'll be transitioning a bunch of my code over to that where, you know, I hope that iOS 15 is doing what iOS 14 is now.
00:21:39 ◼ ► Like for me anyway, like iOS 14 is like 90% adoption or something like that among my active users.
00:21:46 ◼ ► And like if that's where iOS 15 is next summer, then, you know, adopting async/await and requiring iOS 15, you know, September of next year seems pretty reasonable and safe.
00:21:58 ◼ ► And so it's kind of an interesting, and which is also interesting to think through in terms of, I think we'll finally be able to drop all those, I remember for a while we were kind of stuck with, there are a couple sort of versions of iOS that were still slowly dying, which I think they'll have finally died.
00:22:13 ◼ ► And so next year kind of feels like a year where maybe that kind of sort of step function change where we can adopt a bunch of stuff that, you know, we've been waiting on, but up until now, it's like, you know, it's cool to look at, but I kind of feel glad, I'm glad in some ways, though, that I just don't need to touch it because, you know, I'm not going to, yeah, I can't require iOS 15 for a while at least.
00:22:35 ◼ ► And so I'm not going to go near that kind of a fundamental technology in a way that maybe, you know, some of the system level features, sure, I'll, you know, I'll ifdef them in and here, here and there, but I'm not going to do anything like that for such a fundamental, like change to the way that concurrency works in applications, which is, you know, all the things you want to mess with.
00:22:55 ◼ ► And in theory, async await should make it safer, but concurrency is, you know, it's by far the cause of, you know, a huge, a huge swath of bugs. Like I just recently discovered, lead aside, but I just finally fixed, I think, fingers crossed, the biggest crashing bug in widgetsmith.
00:23:10 ◼ ► And it turned out it was this weird threading bug. And it's like, yeah, threads are hard. Like concurrency is really challenging. And I couldn't find this thing. It was one of those issues where like the bug doesn't show up in the wrong place.
00:23:23 ◼ ► So you took a lot of detective work to actually track trace it back to where the threading issue was happening. And maybe that's back to the theme of what I think what we're saying for this summer is I kind of like that I've been able to spend a couple of days, just doing the breadcrumb detective work to try and find this crash.
00:23:40 ◼ ► And it turns out it's like, oh, this one, you know, this one, this one Swift dictionary was being accessed by two different threads in this particular circumstance. It's like, it took me forever to work that out. Now that I know that, it's like, well, yes, that would cause trouble.
00:23:53 ◼ ► But it's kind of cool to be able to have the time to do that. And, you know, just in some ways, we waste a couple of days not getting anywhere until you actually find that final path where you can, you can trace the problem.
00:24:04 ◼ ► You're lucky you found it at all. I mean, a lot of concurrency bugs you just kind of never find. Like, most of the ones that I find or most of the situations like that that might cause bugs, usually the thread sanitizer catches it for me.
00:24:18 ◼ ► Like as I'm running it like on device or in a simulator, like I see this giant warning dumped out to my console and I see the little blue warning. I'm like, uh-oh, I did something wrong.
00:24:27 ◼ ► And like usually, if not for that catching it, usually I don't catch concurrency mugs until I just rewrite that code in some other way.
00:24:35 ◼ ► But, and it's a good point though that, you know, we're so excited as a community about, you know, Swift finally getting this like first class concurrency support in this new modern cool way.
00:24:45 ◼ ► But this is 1.0 of that. And it's kind of nice in a way. Like if they never backport this to 14 and we have to require 15 and Mac OS whatever to use it, that it kind of sucks temporarily because we're all like, oh, we want to use it, we're trying to use it right now, but we can't use it until, you know, a year or two from now whenever we can require 15.
00:25:05 ◼ ► But in reality, that's kind of nice really because that's going to give them a chance to work out the bugs and the shortcomings and also work into like what's going to be the idioms for how we use these things.
00:25:17 ◼ ► What's going to be like the good practice, the common case, you know, what's going to be like the quote right styles that we all use for things like how the APIs work with this new capability, how things are named.
00:25:29 ◼ ► And it will give them more time to adopt the new style including not only async await stuff but also actors into the system frameworks.
00:25:38 ◼ ► And we can start, you know, avoiding more and more bugs about stuff being off the main thread and stuff like that.
00:25:43 ◼ ► Like there's so many, there's so much work to do now that the system is here, there's still a lot of work to do to adopt it and to refine it and to fix the bugs and to adopt all the old APIs to use this new style.
00:25:58 ◼ ► And if it takes us a year or two before we can really require, you know, the version of the OS that include this, that's ultimately fine because that year or two I think we'll be thankful that we didn't jump in with all of our main code yet.
00:26:11 ◼ ► Because then when we do jump in, a lot of those little bugs and shortcomings and unknowns will be fixed.
00:26:16 ◼ ► Yeah, and I mean I think that's the best thing. Like the theme of the summer is just like the sense of, it's just like making everything better and not in, and like I think I'm excited and I enjoy reading the articles from like, you know, Swift Bus and Sindel or things like that where they're like building and stuff where they sync await and exploring and there are people who are doing that work.
00:26:35 ◼ ► And I enjoy reading it and it's like they're off making that part of the iOS world better. And I can focus on making my own lap corner better and more stable and more reliable and then hopefully those paths will join in the future in kind of a cool way.
00:26:50 ◼ ► But it is kind of fun to, yeah, it's like I can enjoy it, I can look at it more academically rather than tactically, which is reassuring rather than when all of a sudden like learning SwiftUI. I remember when SwiftUI came out, I used the very first version of it because it was available on the watch.
00:27:07 ◼ ► It was for the first time you could make real first class watch apps. And it's like that was a rough summer because there were all kinds of issues and especially it was like SwiftUI and the watch, both at the same time, was certainly not making things easy on myself.
00:27:21 ◼ ► And so it's nice to be able to instead, yeah, it's like I'm not using any version one technologies, I think this summer. It's all old stuff for the most part and just little improvements here and there. And I have a lot of tasks I've added to myself of like, look, when you can adopt iOS 15 fully,
00:27:40 ◼ ► then remember to go back and backport this feature. And like I have in a bunch of my SwiftUI stuff, I have like a search controllers and stuff, which I built and it sort of worked well enough. And I'm not probably going to pull them out and do the weird like if 14 do this, if 15 do that, because that's just awkward.
00:27:57 ◼ ► And feel like it's more likely to create bugs in the short term. And so it's like, moreover, see what iOS 15 adoption is like, and maybe in six months, it's actually reasonable to require it. I don't know. And in that case, then I'll be in a great place and I can go back and sort of open up all these little tickets that I have to myself of like go and replace my search with other search or do the drag to pull to refresh or any of those kind of things.
00:28:21 ◼ ► Like, great. I look forward to that. Like, that sounds great. And in the meantime, just work on features and make the apps kind of just more solid and better.
00:28:28 ◼ ► Yeah, that's that's really smart. I mean, you know what you give up in the excitement of not using like the cool cutting edge stuff immediately you gain in productivity and and stability. And that's really it's really nice to be able to use the tools and everything after all the trailblazers have got have gotten through all the bugs and have figured out how things are best done. Like let them do that. If you're not one of them, and I'm certainly not let them do that.
00:28:56 ◼ ► And then when you get there, everything's nicely paved and everything works. Like you can just fly. It's really nice. Sure. Plus, it'll give me a chance to, you know, like, before I jump into my Swift UI redesign, it'll give Apple a chance to release that Mac Pro so I can actually compile Swift UI in a reasonable amount of time.
00:29:12 ◼ ► That is something that I think I'm I still feel like I could use some more speed for sure. Like when I go to compile some of my widgets Smith and watch Smith stuff, which is also if you I like every now and then it is just like what like it just all explodes. And, you know, I think there was a period last week where all of a sudden it was taking like, I don't know, 15 minutes to try and compile my app.
00:29:34 ◼ ► And it turned out it was just like this one very simple like Swift UI change that I had made and it just completely broke and everything. I couldn't work it out for a while. Like how do what? How do I do this? How do I fix it? But eventually I got there and it was fine. So, you know, bring on the Mac Pro, but also just, you know, understand that sometimes that happens. Yes.