PodSearch

Under the Radar

322: Requiring iOS 26?

 

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

00:00:03   I'm Marco Arment.

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

00:00:06   Under the Radar is usually not longer than 30 minutes, so let's get started.

00:00:09   All right, so tis the season of diving into the redesigned iOS SDK, trying to adopt our

00:00:18   apps to the redesign, and we get that nagging question, that mind virus, could I just require

00:00:27   iOS 26?

00:00:29   Like, right at the start?

00:00:30   Yeah, it happens every year.

00:00:32   Every year we have that feeling, that little itch of, ooh, maybe this would be a lot easier.

00:00:37   You know, after you write if available 26 times in a day, you're like, hmm, this is really

00:00:42   uncomfortable.

00:00:43   Yep.

00:00:44   And so, Dave, you had a blog post the other day, which was very insightful.

00:00:48   And of course, to nobody's surprise, very well-reasoned, supported by data.

00:00:54   This is very much your style.

00:00:56   And my feeling is, come on, I don't want to keep support for 18.

00:01:03   Like, please, can I please require 26?

00:01:07   And when I look at my reasons that I want to require 26, it really basically boils down

00:01:14   to, with iOS 18, I don't want to.

00:01:18   Yeah.

00:01:18   It's too hard.

00:01:20   I don't have a lot of better reasons than I don't want to.

00:01:23   But I would like you to try to convince me to keep iOS 18 compatibility.

00:01:30   Sure.

00:01:31   And I think this is one of those, exactly what you're saying.

00:01:35   Like, there is a, as a developer, there is a technical as well as reasonable, like, productivity

00:01:42   perspective.

00:01:43   There's lots of reasons why holding on to support for old versions of iOS is very cumbersome.

00:01:49   And this is, I would say, doubly a problem I find in SwiftUI, that it makes the technical,

00:01:55   we'll talk about this later maybe, but the technical aspect of backwards compatibility in

00:02:00   SwiftUI is just awkward.

00:02:02   Because the way that you do it with all the modifiers on views and things, like, you do

00:02:07   this weird, you know, this modifier chaining is the way that SwiftUI works.

00:02:10   It makes it really awkward to have things that are, you know, if you want to change something

00:02:15   in the middle of the tree, it's really difficult.

00:02:17   Whereas in UIKit, that would have been much easier and more straightforward.

00:02:21   But it's, either way, there is a technical version of that, of struggle to that.

00:02:25   So it is reasonable to want to not do it.

00:02:29   And I think the main, and it was slightly tricky, and this is, you know, there's two

00:02:35   dynamics that are going to come into play with, should you support older versions or not?

00:02:39   And I think for existing, you know, I guess there's three.

00:02:41   There's how it affects you, how it affects your existing users, and what it does to your

00:02:46   market for new users.

00:02:47   And for every app, it's going to be a question of, how do you value, respectively, each of those

00:02:52   three, those three, those three sort of decision factors?

00:02:57   And because for you as a developer, it is, like, it is 100% better not to support old

00:03:03   versions of iOS.

00:03:03   It is going to make your life easier.

00:03:05   It's going to make your development faster.

00:03:06   You're going to be more productive.

00:03:07   A lot of things are just going to be better.

00:03:09   Like, this is one of those things where every year, beyond the big, shiny, like, glass effect

00:03:15   stuff coming in iOS 26, there's just refinements to SwiftUI, to Swift, to, you know, iOS.

00:03:22   All of these things are refined and improved.

00:03:24   And so very often, it's like, you were previously needing to do this really complicated, you know,

00:03:29   sort of ugly bag of hacks to do something.

00:03:31   And then in iOS 26, they've fixed it.

00:03:34   And you can just do it directly with a fully supported, you know, system function.

00:03:38   And so it makes your life 100% easier.

00:03:42   For your existing users, the story is actually relatively good in the sense of your existing

00:03:47   users who don't update or have yet to update will continue to get whatever the last compatible

00:03:54   version of your app is.

00:03:56   So they don't lose anything necessarily in terms of what they lose is, you know, future

00:04:02   updates that would potentially benefit them.

00:04:05   And this is awkward if you, you know, if there is a lingering bug that exists in your app that

00:04:10   exists, you know, that was you fixed subsequent to your iOS 28 or iOS 26 update in this case,

00:04:17   they would never get that bug fix that, you know, they are sort of locked into whatever that

00:04:22   last version is.

00:04:23   And that's something you can, as a developer, deal with.

00:04:25   Like I have, when I've done something sort of like this, sometimes I've made sure that

00:04:30   the last version that someone gets is a version that I feel very confident about.

00:04:35   You know, it isn't the situation where you should do a bunch of messy underground work in your

00:04:41   app, ship that, and then the next update that you submit right away is the one that dropped

00:04:46   compatibility with the previous version.

00:04:48   Because, you know, you ideally will want a period of time where you do a bunch of bug fixes,

00:04:52   make sure it's all nice and stable, and then you can cut off those users.

00:04:55   Because they will get, on their old devices, they will get the old version.

00:05:00   And if they get, you know, say they get a new phone or they get a new iPad or something,

00:05:03   they will then get the new version on that device.

00:05:05   So your existing users have a pretty reasonable situation with that.

00:05:09   And it's mostly just a question of, you know, whatever device they happen to have,

00:05:12   they may have this weird mismatch between two devices.

00:05:15   But overall, it's reasonable.

00:05:17   Where things get really awkward.

00:05:19   And this is the, like, business side of things, where it's mostly a business question rather than a

00:05:24   technical or kind of philosophical question, is new users have to be on the platform that

00:05:31   have to be supported by your app in order to download the app in the first place from the app store.

00:05:37   That's just the way Apple does it.

00:05:38   They don't let you download the last compatible version.

00:05:41   You always have to be getting the current version or no version.

00:05:44   And so what you do by cutting off support for previous versions of iOS.

00:05:50   So in this case, say you went iOS 26 only on day one in September.

00:05:57   You would immediately be cutting off any user, new user to your app, I mean, who didn't have that version.

00:06:03   And for some apps, that may not matter.

00:06:06   That really may be totally fine.

00:06:08   Depends on how broad your audience is, how fast they are to adopt, how much you're trying to maximize

00:06:14   every new user to your app.

00:06:16   It's a complicated question.

00:06:19   In the blog post I did, like, I pulled the numbers for Widgetsmith for me.

00:06:22   Because that's something that I'm looking at, not in my case, I'm not looking at it to drop iOS 18.

00:06:28   I'm just asking now the question of, can I drop iOS 15, which is currently the version that it supports.

00:06:33   Because that's, which, you know, it took a long time before I dropped iOS 14 as well.

00:06:40   But like, for right now, iOS 15 represents 2.2% of my new downloads of Widgetsmith.

00:06:48   And so if I dropped support for iOS 15, you know, ostensibly my downloads will go down by 2.2%.

00:06:54   And it's tricky because it's so difficult to get a new download that in doing something proactively

00:07:03   that reduces my, you know, downloads by 2.5% or whatever is hard to justify in some ways to me.

00:07:11   Because I'm, you know, it's like, I'm willing to do the work on the technical side to manage the backwards compatibility to get that gain.

00:07:18   But even on the other side, it's like, if I decided to look at iOS 18 and get a sense of how many users I would be dropping going forward.

00:07:27   Like, I looked back at last year when we went from iOS 17 to iOS 18.

00:07:32   And by sort of the end of the year, so by, because essentially what Apple does, they launch it in late September.

00:07:39   And it goes out in terms of it's available.

00:07:42   But typically, it's only available to people who go to the settings app, do general software update, and actually like look for the update and hit, I want to update now.

00:07:51   The big, like, automatic update version doesn't typically seem to go out until right around the third week of November.

00:07:59   That's been that way for iOS 18.

00:08:02   It was that way for iOS 17.

00:08:03   Like, it seems like they are intentionally holding back the big, broad, goes-to-everyone update until late November, presumably once the new iPhones are out,

00:08:13   the bugs are sort of potentially dealt with and fixed, and it's a very stable, broad thing.

00:08:18   And slightly I have the conspiracy theory that they're having it go out right before Thanksgiving in case people need to have their, like, you know,

00:08:26   the technical person in the family to help anyone through things.

00:08:29   Maybe that's true.

00:08:31   Maybe that isn't.

00:08:31   That's just what I tell myself.

00:08:32   Oh, I was thinking it might juice sales in the holiday season of new devices.

00:08:36   Could be.

00:08:37   It could do that too.

00:08:38   Either way, it seems like the end of November…

00:08:41   Yours was much more charitable.

00:08:42   Yeah.

00:08:42   And the end of November is when it goes out.

00:08:44   And by that point, like, for Widgetsmith, it was getting to about 70% of my downloads, you know, by, you know, sort of by the second week of December, 70% of my downloads were coming from iOS 18, which is pretty substantial.

00:08:59   Like, that's a very meaningful proportion of users that would still be able to.

00:09:04   So, in this case, if we project forward and say you had the same structure, you know, you're dropping maybe for a period of time maybe half of your downloads, you know, in September and October.

00:09:16   And then by November, December, you're getting up to about, you know, only losing about 30%.

00:09:21   And then, you know, over the course of the rest of the year, at this point, iOS 18 represents 91% of my downloads.

00:09:26   So, I'd be giving up about 9%.

00:09:28   Wow.

00:09:29   And all these numbers and graphs and things are in the blog post.

00:09:32   We'll link to this.

00:09:32   So, obviously.

00:09:33   But essentially, that's the crux of it for anyone.

00:09:36   And it's – there is no one answer is, I think, something that is fundamental to all of this, that those three factors, your, you know, your enjoyment, your satisfaction, the technical debt, and all the things that come along with it, how it affects your existing users and how it affects your new acquisition of users, is just going to vary for everyone.

00:09:54   Like, for me and for most of my apps, I tend to be very conservative with this.

00:09:58   I tend to make my life more difficult in terms of the backwards compatibility thing because I am, you know, I am willing to do that work.

00:10:07   I've done it in enough times that I know how to do it in a way that doesn't drive me crazy.

00:10:10   And so, I will do that so that I can, you know, in this case, have 9% more downloads now, you know, versus if I went iOS 18 only last year or even if I went iOS 18 right now, it would reduce my downloads by 9%.

00:10:25   And, you know, I would be thrilled if I was able to do some simple, you know, some App Store optimization activity that boosted my downloads by 9%.

00:10:32   I would be delighted.

00:10:33   And so, I'm doing that activity and it just happens to be that it's, you know, supporting these older versions.

00:10:40   And so, that's the way the calculus works for me, you know, but for every app, it's going to be variable.

00:10:44   And you just kind of have to decide whether you're going to do it that way.

00:10:48   And I think it's the only other factor that's a little awkward is in some ways, you know, it's, it's, if you're, most of the benefit would come from only supporting the current version, you know, iOS, in this case, iOS 26.

00:11:01   Anytime you support anything behind that, very often, it's just as much work to support, you know, sort of N minus 3 or N minus 2 versions of things.

00:11:11   Because once you're not only supporting one, you have to do that work anyway.

00:11:15   So, if you wanted to support iOS 18 and iOS 26, the difference between supporting that and iOS, you know, 26, 18, 17, 16, that difference is much smaller.

00:11:26   And so, it's a weird dynamic that either you should be sort of all in or probably very conservative.

00:11:32   There's not a lot of desire, I think, and a lot of, huge amount of benefit in this case to go back and forth.

00:11:37   Because if you have to do the work of supporting the pre-26 design as well as the post-26 design, you're kind of, you're doing that work anyway.

00:11:46   So, you may as well get credit for it in terms of the breadth of new user acquisition.

00:11:50   Oh, you gave me a lot to think about.

00:11:52   All right.

00:11:52   First, we're brought to you by Century this episode.

00:11:55   All right, founders, time to be honest.

00:11:56   How much time is your team wasting on debugging?

00:11:59   If you're like most startups, it's way too much.

00:12:02   Your team should be focused on shipping features, not chasing down bugs.

00:12:05   That is where Century comes in.

00:12:07   Century is a real-time error monitoring and tracing platform.

00:12:10   So, you know exactly when something breaks, where it happened, and why.

00:12:14   So, there's no more like 1 a.m. Slack threads or digging through endless logs trying to figure out what's going on.

00:12:19   Now, here's the game changer.

00:12:20   Sear, Century's new AI debugging agent.

00:12:23   It's like hiring an engineer who already knows your entire code base.

00:12:27   Sear finds the true root cause 94% of the time, and can even generate merge-ready pull requests, plus optional tests to prevent regressions.

00:12:37   The bottom line is you ship faster, your team isn't drowning in bug alerts, and instead of grinding through logs, your developers get back to building the product.

00:12:44   This is a great platform for developers who need insight into the apps you've built.

00:12:50   This can help you retain people, improve quality, improve the user experience, improve performance.

00:12:56   It's a great product.

00:12:58   So, try it out.

00:12:58   The good news is new users get three months free of the team plan, which covers 150,000 errors.

00:13:06   I have generated that many errors before.

00:13:07   Me too.

00:13:09   Yeah, we all have.

00:13:10   So, click the link in the show notes or go to Sentry.io and use the code RADAR.

00:13:15   That's Sentry, S-E-N-T-R-Y dot I-O, and use the code RADAR or just click the link in the show notes.

00:13:22   Our thanks to Sentry for their support of this show and Relay.

00:13:26   So, you kind of set me on a roller coaster with your reasoning.

00:13:29   So, like, at first I was like, hmm, like, you know, you make a good argument at first for, like, why I probably should support 18.

00:13:38   And, by the way, and 17.

00:13:40   Like, you know, right now I'm about – I guess I still have about 2% of people on 17.

00:13:44   Everyone else is on 18 except for the 2.5% that are already on 26.

00:13:48   But, you know, certainly, you know, supporting 17 and 18 together is fine.

00:13:54   And I've been doing it for a year, and I haven't dropped 17 because there really wasn't much of a reason to.

00:13:58   I have, you know, a few views in the app that have conditional, you know, things in them, but not much.

00:14:03   So, at first, as you were going through that, I was like, hmm, I should really support it.

00:14:08   I'll support the back one.

00:14:10   But then, at the end, as you were talking about how, well, actually, you know, after a few months, it doesn't really matter.

00:14:19   Or it matters a lot less.

00:14:21   Now, like, that was, like – now I'm, like, on a roller coaster.

00:14:24   Backup's like, hmm.

00:14:25   So, here's some more reasons why I would love to just require 26 sometime, you know, by mid-fall.

00:14:33   You know, whenever my iOS 26 release happens.

00:14:37   And that's something we can play with the timing of, you know.

00:14:40   Like, do you want to release on day one?

00:14:42   Well, on day one, you can get a decent amount of press.

00:14:45   You might get attention from Apple.

00:14:48   But you will be competing with everyone else who did the same thing for that attention and for that editorial selection.

00:14:55   And on day one, the fewest number of your customers will have the OS installed.

00:15:02   So, that's – I think the day one game might be better for apps that are supporting the old OSs still.

00:15:10   Whereas, if you can wait – if you can hold off until October or November to do your release at all that has the new OS, it mostly doesn't matter if you require it, like, for many types of apps.

00:15:23   Now, it also depends, you know, what phase of your app are you in, like, business-wise and lifecycle-wise.

00:15:29   Overcast is not growing massively anymore.

00:15:33   It's mostly a maintenance level of people using the app.

00:15:39   Like, it's – you know, I'm not getting tons of new users.

00:15:41   I'm mostly just serving the existing users of the app at this point.

00:15:45   But I'm not getting no new users, and I obviously want and need to keep a steady stream of people coming in because there are obviously a steady stream of people going out with every app.

00:15:54   So, you kind of need – you know, to maintain your user base, you have to keep having more coming in.

00:15:58   So, that being said, though, I am not in the growth phase anymore.

00:16:02   So, the percentage of new users that I have is way, way, way lower than the percentage of existing users that I have.

00:16:11   So, that also kind of leans towards requiring it might be fine.

00:16:15   I also – you know, obviously, there's the practical concerns.

00:16:18   If you require only the newest OS, all this summer when – like, this summer, we have a lot of work to do to adopt this.

00:16:26   Like, we are busy.

00:16:27   We are cramming.

00:16:28   We're trying to hit this deadline in the fall.

00:16:30   It helps a lot to have simpler testing in QA, and you have a lot simpler testing in QA when you're only supporting one family of OSs, not the previous ones.

00:16:41   And it also reduces the number of bugs that get shipped out to customers because you don't have to worry.

00:16:47   Oh, in my change for 26, I broke this one behavior, this one control on iOS 17, and I'm not going to necessarily know that if I don't do a very, very deep testing on the old OSs, which, let's be honest, we don't always do that.

00:17:01   So, you know, it also makes the test device situation simpler.

00:17:04   Like, you can kind of cull your pool of test devices a little bit.

00:17:08   And then finally, I worry that if I maintain compatibility with 18, I worry that that might hold back how aggressive of a design refresh I inherently do.

00:17:22   Like, it might hold me back from doing, like, a more pure iOS 26 redesign if I'm also trying to maintain the structure of the app.

00:17:31   To make it work well on 18 and before and look good on 18 and before.

00:17:35   I think I can do my best work if I require 26.

00:17:39   And that is a pretty big hurdle for me to overcome with logic to say I should be responsible and maintain 18.

00:17:47   Sure.

00:17:48   And I suppose maybe the next thing for me to say is the way that I do my iOS 26 or expect to do my iOS 26 updates may help you a little bit here.

00:17:59   So I learned this from watchOS, where watchOS is the version, you know, like what I do.

00:18:06   It took 10 minutes for me to describe my strategy on iOS.

00:18:09   On watchOS, it's, like, immeasurably more complicated because you have the iPhone version that's different from the watch version.

00:18:15   And if the watch version is different, you know, like the watch app just disappears in that case from the person's watch.

00:18:21   They can't get the last compatible version because the version that they have is tied to their iPhone version, not the watch version.

00:18:27   And it gets really complicated.

00:18:28   So in there, what I've done in watchOS is I'm very conservative about dropping old versions of watchOS because the impact to the user is much more different.

00:18:39   You know, the second of my factors where existing users on watchOS, it's really difficult because they just lose the app.

00:18:46   It just completely disappears.

00:18:47   There's no way for them to get it.

00:18:48   And so I'm taking something from an existing user, which is, you know, often something I try and avoid.

00:18:53   And so what I've done on watchOS, and it's worked, it'll sound terrible.

00:18:58   So let me, like, explain my reasoning before you jump to conclusions as to whether this is a good idea,

00:19:03   is essentially for every major sort of time I'm redesigning or restructuring or doing compatibility work with the app,

00:19:12   I, to some degree, create an entirely parallel copy of the view hierarchy of the app.

00:19:20   Oh, my God.

00:19:20   That has a new entry point, and it's essentially just a copied version of the old one.

00:19:26   And so you will have a lot of views that are like, you know, it's like workout view, you know, it's like underscore 18 or 10.

00:19:33   Or like for watchOS, it would be like, you know, this one's for watchOS 7.

00:19:36   This is the one for watchOS 10.

00:19:37   Like when we did the watchOS 10 redesign, I have a lot of views that just end in a 10 now.

00:19:42   And there's a new entry point to the app that, like, at the highest level of the app is basically like,

00:19:47   which version of the app are we going to run?

00:19:49   Okay, we're going to run the post watchOS 10 version.

00:19:53   Oh, you know, if we're on a version that supports that, otherwise it runs the old version.

00:19:57   And in some ways, what I'm doing is replicating the behavior that Apple is doing with their, you know,

00:20:06   the last compatible version of the app system, where that code is very stable, doesn't change.

00:20:13   And if I've done my work sort of neatly and cleanly with the underlying app logic,

00:20:19   that, you know, those APIs are good and thoughtful and stable at this point,

00:20:23   it should just continue to work.

00:20:25   And generally, that's been the case.

00:20:26   And then on the new version, so in this case, you know, for iOS 26,

00:20:30   my iOS 26 branch of the view out of that initial sort of view hierarchy,

00:20:36   can require iOS 26 100%.

00:20:39   I tend to intentionally add a bunch of add available sort of modifiers to all of my new views

00:20:45   to make sure that I'm not creating weird issues there.

00:20:49   Like, I'm intentionally trying to separate the views as much as I can.

00:20:53   And a lot of it is literally I will take a copy of the old version, you know,

00:20:58   sort of make a new file, paste it in, add 26 to the top,

00:21:02   and then go from there and completely ignore all of the, you know,

00:21:07   the implications that I'm deleting code or changing things or adding modifiers.

00:21:10   I can run freely in that view, because it's not affecting the old version as well.

00:21:16   The old version exists completely as it is.

00:21:18   And the new version can be completely optimized.

00:21:20   And it is a little bit crazy.

00:21:22   It is a little bit cumbersome in the sense of I have two versions of a lot of the view logic of my app.

00:21:28   But the reality is, like, I find that it works pretty well.

00:21:32   And, like, in watchOS, it has not really bitten me at all in the, you know,

00:21:36   the last five years that I've been doing it this way.

00:21:38   It seems to work pretty well.

00:21:39   It works fairly stably.

00:21:40   I have the advantage of being able to do bug fixes on old versions.

00:21:45   You know, so I don't maintain or improve the old version of the app in this context.

00:21:50   So, like, on iOS 18, they're getting essentially the last compatible version of the app

00:21:55   that is the last thing that has shipped.

00:21:57   And that's all they should expect to get from there, or, like, from my perspective.

00:22:01   I could subsequently change it if I needed to or wanted to, or for, you know,

00:22:06   if there was some compelling reason for me to open up the iOS 18 branch of the app,

00:22:11   you know, the, you know, view branch, not code branch.

00:22:14   Like, in the view branch, I could go in there and say,

00:22:16   oh, I need to change something.

00:22:17   Say there was some marketing reason, or even I wanted to add a message that was talking about,

00:22:22   if you're, you know, hey, you're running an old version,

00:22:24   but on a device that could support an update, there'd be this great feature if you were updated to it.

00:22:29   Like, I could do those kinds of things and message to my users in that way,

00:22:32   because the version they're getting is still live and active.

00:22:36   And that kind of works better for me, because, like, the alternative in SwiftUI,

00:22:40   I find it so painful to have any code in SwiftUI that is designed to support two different versions of iOS.

00:22:48   Like, the way you have to do it with modifiers, and there's, like, hacks you can do

00:22:52   where you can use the backported features to, like, do it for specific modifiers,

00:22:57   but, like, then you're dealing with this weird case where, like,

00:23:00   I never like the fact that you have the same code that does two different,

00:23:03   radically different things on two different platforms.

00:23:06   That feels weird and brittle in a different way to me.

00:23:09   And so, for me, that never works.

00:23:11   I don't like it.

00:23:12   I would much rather just have, this is my iOS 26 version.

00:23:15   And, I mean, the reality is, as much as, like, my apps are complicated,

00:23:18   there's only, like, I'm not talking about thousands of files that are duplicated.

00:23:25   I'm talking about 100 files that are duplicated.

00:23:28   There's not this massive, which is a lot of files,

00:23:31   but not an impossibly large-to-manage number of files.

00:23:35   And so that's the way that I do it, and that's what keeps me sane when I'm supporting older versions.

00:23:41   And that's, you know, I've spent the last few days properly getting into a redesign for Pedometer++.

00:23:46   That's the way that I'm doing it.

00:23:47   And as a result, it feels really fast.

00:23:50   It feels very fluid.

00:23:50   You know, it's essentially as though I've dropped support for iOS 18,

00:23:54   because from a technical perspective, I kind of have.

00:23:57   But from a business perspective and from a marketing perspective and all those things, I haven't.

00:24:01   And so that's the approach I take.

00:24:03   And it kind of, it's weird.

00:24:05   And I know it's weird.

00:24:06   And there's probably people listening to this who are shouting at their podcast app right now,

00:24:11   being like, what are you doing?

00:24:12   That is terrible.

00:24:13   And maybe it is, but it kind of works for me somehow.

00:24:16   That's, okay.

00:24:17   That, like, first of all, this is the perfect underscore solution to a problem.

00:24:23   It's, like, surprisingly, like, logical and clever and reasonable and something I would not have thought to do on my own,

00:24:31   because for whatever reason, it just, like, it's, like, it's too straightforward.

00:24:35   Just copy everything.

00:24:36   Like, that, I feel like a lot, like, a lot of, like, you know, idiomatic development would be, like, what?

00:24:43   You're just going to copy all your files?

00:24:44   What?

00:24:45   Like, that's, you can't do that.

00:24:47   That's wrong.

00:24:49   You know, we've read books, you know, from the 90s that say don't do that.

00:24:53   Yeah, no, exactly.

00:24:54   But that actually, so I think I'm going to give that, like, one day of a try.

00:25:01   Absolutely.

00:25:02   Like, just copy, because, like, I'm about to start my big UI work now.

00:25:06   It's, like, all right, let me try that.

00:25:08   I'll give it one day and see, like, how hard is this?

00:25:11   Like, how, because that would kind of give me everything.

00:25:15   Like, if I can do that, you know, it gives me a day one releasable update that doesn't cut me off from anything.

00:25:23   In the App Store.

00:25:24   Hmm.

00:25:26   And that is, like, that is how I've done widgets.

00:25:31   Like, obviously, I'm talking to Mr. Widgets.

00:25:33   But, like, you know, widgets, as you know, like, they've changed a lot over the last few iOS releases.

00:25:38   And trying to maintain a bunch of, if available, checks inside of a widget is ridiculously horrible.

00:25:45   And so I have just had copies.

00:25:47   Like, all right, this is the, you know, playlist widget underscore iOS 18.

00:25:51   Like, that's, that's how I have all those named, too.

00:25:54   But I think for the entire app, there is both, on one hand, there are, like, fewer views that will differ between the versions compared to a widget.

00:26:05   But there's also just tons more total views.

00:26:09   Like, I have so many views in Overcast.

00:26:12   It's such a complicated app.

00:26:14   There's so many screens.

00:26:16   There's so many little cells and little backgrounds.

00:26:18   Like, there's so much that I worry that it might be too daunting.

00:26:22   But I guess I won't know until I try.

00:26:24   So, all right, you've convinced me.

00:26:25   I'm going to give it one day and see how I feel about it after that day.

00:26:29   And I think the thing, there's two things that I think make this sort of work.

00:26:33   And one of them is that all of the advice, like, I always remember, like, when I was getting into web development and it was always, like, keep your code dry, right?

00:26:40   Don't repeat yourself.

00:26:41   That was, like, the big, one of the big kind of ethoses.

00:26:44   And I think the big reason for that sort of philosophy is if you expect to maintain and actively work on both parts of the app, then that is something that is a useful and, you know, like, desirable outcome.

00:26:59   Because then you, every time you make a fix, you have to make the fix in both places.

00:27:03   So, if you can consolidate your logic into one location, that location will always benefit everyone else who depends on it.

00:27:10   Like, that is why, I think that is the motivation for the don't repeat yourself philosophy.

00:27:14   And, like, the reason it seems to have worked in the past for me to do this, take this approach is because I don't maintain the old version in many ways.

00:27:22   Like, sometimes that's come up and I will go back and fix a bug that I'm aware of.

00:27:27   But by and large, that's not what I'm doing.

00:27:30   Like, I'm not trying to maintain two, like, two paths at the same time.

00:27:35   Like, one of them is stable and you get the benefit of, like, that iOS 18 code is never going to run on a machine running something other than iOS 18.

00:27:43   You know, it's never going to get run on iOS 26.

00:27:46   So, you don't have the kind of unknown future compatibility issue.

00:27:49   You know, that future compatibility issue is only ever happening on the new branch, not on the old one.

00:27:55   And then the other thing is in SwiftUI, like, it incentivizes you to make your UI out of lots of small atoms, you know, within the app.

00:28:06   So that you have lots of small little views that do one, that, you know, tend to do one thing or focus in on one particular, you know, idea.

00:28:13   And many of the smallest leafs in your view tree, you can share between the old version and the new version because they're not doing something complicated or, you know, nuanced or taking advantage of the new glass effect or all these kinds of things.

00:28:28   That they're, you know, they're the part that you can share comfortably between two views or between both sides.

00:28:34   And so you'll have this relatively big thing that is shared, but the big kind of like hierarchical, the navigation stack, the big kind of chunky views are the things that you're going to repeat.

00:28:44   And so duplicating them is much, it's much less daunting than duplicating the entire app in that way.

00:28:51   You're only typically having to duplicate, I find, these big structural views and then lots of the small detailed views you won't.

00:28:58   But, you know, it's not for everyone.

00:29:00   I'm not necessarily recommending this as a strategy that I think is best.

00:29:03   I'm just saying it's worked really well for me.

00:29:05   And if you know what you're getting into when you do this, it can have these big, you know, payoffs that you get these business benefits.

00:29:12   You still get the developer benefit of really your new iOS 26 work is just as though you've dropped support for iOS 18, but you haven't actually.

00:29:21   And so it's kind of like a best of both worlds, but, you know, your mileage may vary, I suppose, is just fair to say.

00:29:28   I wish Apple would just give us a checkbox to say, let people download the last compatible version from the app store.

00:29:34   That would be, that would be much simpler.

00:29:37   Absolutely.

00:29:37   But until that day, that this is what the best we can do.

00:29:40   Thanks for listening, everybody.

00:29:42   And we'll talk to you in two weeks.

00:29:43   Bye.