Skip to content
Episode 507

507: iCircuit UI Roast: Toolbar, Popovers, and Polish

Your Hosts

About this Episode

In Episode 507 James grills Frank about UI choices in his iCircuit app—crowded toolbars, popover behavior on iPhone vs iPad, and flaky TestFlight/App Store review timing. They trace a nasty bug to Apple’s deprecated OpenURL behavior in iOS 26, debate in-app browsers vs Safari and multi-window docs, and remind developers that subtle platform changes and lack of polish can silently break UX—practical lessons for shipping mobile apps.

Follow Us

⭐⭐ Review Us ⭐⭐

Machine transcription available on http://mergeconflict.fm

Support Merge Conflict

Transcript

James 00:00

Welcome back everyone to Merge Conflict, your weekly developer podcast where I am still extremely upset with Frank Kruger. How's it going, buddy?

Frank 00:08

Oh buddy, i don't like to hear that, but I can think of a thousand reasons you'd be upset with me. Hi James, can I make you feel better?

James 00:16

I don't think so. I don't think today because Frank, you and I have been friends for the last decade plus five years, 15 years.

Frank 00:19

dang. Yeah, I guess so. At least 400 something episodes.

James 00:30

I think it's been, i mean, yeah, it must be at least 15 years. mean, since I i started at Xamarin, I've been 13 half years ago, but 14 years. um I always looked up to you as someone that was like an archetype, a holy writer of pristine code, an elite developer, a pragmatic programmer,

Read Full Transcript Hide Full Transcript

Frank 00:53

hu Okay.

James 00:57

Somebody that knows UIKit to a T inside and out, no matter what.

Frank 00:58

Oh. Okay. This is about one of my apps, isn't it?

James 01:06

But today, today I've been dogfooding iCircuit, the app in which makes Frank all of his money in life.

Frank 01:07

Okay.

James 01:15

And Frank, I'm highly upset at so many UI decisions that have been made in two areas.

Frank 01:18

Oh, no. Oh

James 01:22

And I wanna discuss them today and understand, What's going on in this app? It's very upsetting in many ways. Frank Kruger, want to know what...

Frank 01:32

Okay, I'm willing to have this discussion, but let's preface it with everyone go out there and buy it anyway, no matter what you're about to hear.

James 01:33

like

Frank 01:38

um Oh boy, I'm afraid to find out how I disappointed you. But the truth is, i already know I disappointed you a little bit because i got a bug report from you over the weekend. I think, was it like a Saturday morning I think you were testing my software? Like a good employee that doesn't get paid. Good job, James.

James 01:58

It's at least I could do, you know, well, so the one good part about doing a lot of like AI development, I gotta get Heather into our, into our Netflix. She's like, I got the email. It says you're not in the household. Like I'm on it. Confirm update. Um, is because I've been shipping more and more software. I go in and in to, um, my test flight application more and more and more so much more like all the time.

Frank 02:21

Progress bars. Oh, that's true.

James 02:25

Look at all those apps, see all those apps right there.

Frank 02:27

Yeah.

James 02:27

And,

Frank 02:27

Actually, most of my apps in TestFlight are your apps. So I like that we spam each other, basically.

James 02:33

Yes. And I don't get too many from you because you know for external, for x so TestFlight is a broken system. It's completely broken for external developers. For internal, great. For external, it it's not, I mean, if you're using like,

Frank 02:48

Yeah.

James 02:53

CI CD, you can set it up where it will like automatically do a build, push it, assign it to you, and you can actually assign it to another external group. However, that app also needs to be reviewed. Sometimes it's Insta.

Frank 03:07

Yeah.

James 03:08

Sometimes it's not for some reason, if you haven't done it in a while, Which then leads to the problem is that you can't assign a build to a group if one is review and you also can't unassign it to the group either.

Frank 03:12

Very not insta.

James 03:22

And it's completely broken. In fact, what happened today, Frank, in to to prove to the point of how broken, prove it, prove it right now.

Frank 03:28

Yeah, right.

James 03:30

I'm proving it to you.

Frank 03:31

Right now, right now.

James 03:31

Go for You prove it.

Frank 03:32

So I have um all good apps, as we know, have a.1 release.

James 03:32

Prove it to me. Prove it to me

Frank 03:37

It's just what happens. ah My app is especially good, so it's going to have a.2 release. That means I made two big mistakes in the last release that I'm trying to correct. um We'll get into what those are, but um one of them was reported to you, so I wanted to get a beta out to you with the fixes because I'm a good developer. So I put my app into TestFlight review because it's whenever you up the minor version. So as long as you don't change your version number, they'll usually yo get auto approved. So whenever you update your minor version, then you have to go through the review process again. And to your point, I was so sure that you were going to approve my Tesla beta version that I just went ahead and submitted the real app to the real app store review because i always do manual developer release.

So if I'm not happy with the actual, um you know, if the beta is garbage, if the beta is blowing up on devices, then I can always developer reject and then resubmit later.

James 04:31

Same. Yeah. Pull it back.

Frank 04:42

But especially for bug fixes, I like to just get everything into the review queue right away.

James 04:42

Yep.

Frank 04:47

And i think the point you want me to make is my app was reviewed for the App Store, good for release within one hour. And it took, I think, about 10 hours for my test flight version to get not just not just reviewed. like um The whole process was about two days. But like in review for 10 hours, it sat there. Meanwhile, it took one hour for to get approved for the App Store. I do not know what is going on behind the curtain at Apple, James.

Not at all. Not not one I mean, we all know there's different reviewers out there. They all they all go by their own playbook, I guess. And so I always just chalk it up to that. But, like, you would think, given how limited external testing is, that they just kind of approve the apps, you know? Like, the most damage I'm going to do is to, like, 30 people out there.

James 05:41

Yeah. And it's like, yeah, it's like these people signed up for it, right? They're installing it, X, Y, z And especially in in a situation like this, where like you added more testers or did anything, you know what I mean?

Frank 05:56

Yeah. Yeah. Yeah.

James 06:03

It's clearly there.

Frank 06:03

yeah

James 06:04

And on top of the point, it's also a broken system because I'm sitting here and I open the application, auto updates on, didn't auto update. I go to my Mac for my own application, Tiny Clips, I open it, I hit i open it, auto updates on, didn't auto update. Sometimes I hit the update button and it's like, no, you're already updated. I was what do you mean I already updated it? It says update right here. Just like fix the thing. you know I'm just saying, I love the thing, but I hate the thing, fix the thing.

Frank 06:31

Yeah.

James 06:32

Kind of like your app, Frank Kruger.

Frank 06:34

Oh, ouch.

James 06:34

Okay. Ooh, I see, okay.

Frank 06:35

What a segue. James, do you have any critical feedback for me? is that is that what I'm about to get for the next half hour? i hope everyone will run with me and enjoy this moment of being critiqued.

James 06:43

Yeah. Problem one.

Frank 06:51

Yeah, sir.

James 06:52

One. Your top bar.

Frank 06:53

Yeah.

James 06:55

we're just install Go give Frank $15 and then let's critique this together.

Frank 07:00

$13, but thank you. Yes.

James 07:03

One. Compliment.

Frank 07:04

One.

James 07:05

Let's kick it off with a compliment.

Frank 07:06

Oh, thank you.

James 07:06

Ooh.

Frank 07:08

I like that.

James 07:08

When you hit the search, it goes up.

Frank 07:10

Uh-huh.

James 07:11

It was was nice animation. Ooh, that's nice.

Frank 07:13

Compliment sandwich, so you have to end with a compliment too, you know, but thank you. I have to say that UI is baked in Everyone use ui document browser. it's all It's all set up for you.

James 07:23

You don't have to use that, but it's there. I did that in the travel app that I built. um they they did They built that in. i was like, oh, I worked on i was like, oh that's nice.

Frank 07:32

Yeah. ah Can I make a little complaint there?

James 07:35

That's nice.

Frank 07:36

My god, I've been doing iOS development since iOS 2, and the way search bars integrate with the nav bar seems to change on every single version. It's it's maddening, honestly, dealing with that stupid search bar.

James 07:45

Totally.

Frank 07:48

But yeah.

James 07:49

Yep. That being said, your toolbar, it's very crowded. It's very crowded. It's got, it's got crowdiness all over. It's got, it's got a gear. It's got a gear.

Frank 08:00

Yeah.

James 08:00

It's got a, it's got a gallery.

Frank 08:01

Every app needs a gear, James.

James 08:03

It's got the word gallery.

Frank 08:03

Yeah. Yeah.

James 08:05

It's got a plus button and it's got a triple dot, which is nice.

Frank 08:09

What's the triple dot do?

James 08:10

That's nice. Connect to us.

Frank 08:12

I'm not even aware of the triple dot.

James 08:13

The, You can select connect to a server, do list name, kind, sorting view options. It's all your view options. It does very nice. Yeah.

Frank 08:21

Oh, OK. Yeah. Right. So the gear is for settings. ah So I should say, I'm using the UI document browser. that Literally, the only thing you're allowed to do is add toolbar buttons. So I actually i fully admit it's getting crowded up there. um And the gallery could probably be an icon. It's probably at that point where I could have an icon for that. It's tricky, though. like what is What is the iconography for a gallery?

James 08:46

Should be a tab. Should be a tab at the bottom. um um yeah

Frank 08:50

Ideally. Can't do it. Not going to happen.

James 08:52

Can't do it. No, because it is, everything is browser-based, but that it is a gallery. You know, it could be, it could be, could be like a thingy.

Frank 08:58

Yeah.

James 09:05

But yeah, no, agree.

Frank 09:07

Yeah.

James 09:08

But so you added gallery. i mean, it makes sense.

Frank 09:09

I'll work on an icon. I'll work on an icon for you.

James 09:11

and It makes sense to be gallery. That's a hard one, right? Because also, like, people need to know what it is.

Frank 09:15

Mm-hmm.

James 09:18

And they see an icon, it's like a little photo. You're like, oh, what is that, right? And and gallery is a hard one.

Frank 09:20

Like, do you even know what gallery is? Like, it's tricky because, like, even the word I kept kept debating, but basically it's user submitted circuits. So it's it's it's stuff other people have uploaded, you know. So I just, I call that the iCircuit gallery and gallery for short. Yeah, it's it's tricky.

James 09:38

It's a hard one. It's, it's great functionality.

Frank 09:39

Yeah.

James 09:41

That was the first thing I tested. I saw the, now here's the thing is, you know, the gallery button works. Cause I pressed the gallery button and was like, Ooh, and I got it. And I literally didn't have to sign in, didn't have to do anything. You can hit gallery. You can browse around, click on one download circuit and Oh,

Frank 09:52

Mm-hmm. Mm-hmm. Yeah. No, no. Works fine. Works fine. dont No uh-ohs.

James 10:04

though

Frank 10:07

Now what did I break, James?

James 10:08

Let me click another one. Did you break it?

Frank 10:11

No.

James 10:11

Download.

Frank 10:12

It's fine.

James 10:13

It's not downloaded for me.

Frank 10:17

Great. Maybe I did break it in the beta. Thank you. Thank you, beta tester.

James 10:20

oh. All Test that. Anyways, that that did work in zero, in one. That did work.

Frank 10:27

Oh, beta.

James 10:27

How come that didn't work?

Frank 10:28

UI development's tricky. Yeah, there must be an error being swallowed.

James 10:30

You click on it. Yeah. Anyways. Cause you probably changed the logic of your you UI pickers. Anyways, you click the thing. It it worked for me before. So that's cool. That comes up from the bottom. That's nice right there. A little gallery like that's nice comes up. You can see it it's like, you can see the back button. It says back. It says gallery. Now let me, let me, hint let me continue on my rant and critique of said crowded toolbar.

Frank 10:55

OK. Yes.

James 11:00

See, and no one can see this on YouTube, but if you have the app, you just want to scroll up, not down, up.

Frank 11:00

Yeah.

James 11:07

And notice that it says i circuit recents, but when you scroll up, it says i circuit re dot dot dot sloppy, sloppy,

Frank 11:19

Yeah, I agree it's sloppy. um I have an excuse. My excuse is that's Apple's UI, sloppy Apple.

James 11:26

I don't know if you even need the word up there. I think you could live without it because it's in the bottom toolbar. I don't know if that's to code, but it's there.

Frank 11:36

But if I pitch to you, I have no control that.

James 11:39

um I don't know, because if I go to browse, it's not there.

Frank 11:43

Yeah. that's Just how it works.

James 11:46

i don't know, man.

Frank 11:47

Yeah. it's it's a little It's a little weird.

James 11:47

Anyways.

Frank 11:48

They put your bundle name up there. i'll i'll look into I'll look into getting rid of it.

James 11:55

Elite hacker, Frank Krueger. We're nameless, man.

Frank 11:58

Oh, it's always good to hack the Apple APIs.

James 11:59

We're nameless.

Frank 12:00

Yeah.

James 12:01

I have no names. Okay.

Frank 12:03

Yeah.

James 12:03

Now here is the real gripe. Internet. Internet.

Frank 12:08

I'm ready.

James 12:09

You hit gallery.

Frank 12:09

The internet is terrible.

James 12:10

Beautiful. Right up.

Frank 12:10

I agree.

James 12:12

Look at that. You see the how I can just look at that from the bottom, just up. It's beautiful.

Frank 12:15

It's nice, right? you You approve of that, right?

James 12:18

Yeah. Now, ideally, the iCircuit gallery would be themed dark theme in in our year of Lord AI.

Frank 12:19

That's okay?

James 12:24

But digress.

Frank 12:24

Yeah.

James 12:26

Digress. um Okay.

Frank 12:27

I should say, on an iPad, it comes up as a nice page sheet also.

James 12:32

Ooh, I love that.

Frank 12:32

Just saying. Okay.

James 12:35

I will say, um if you do some of this development, like a Mac OS and like Mac, these things that are built in that you can just spice it up, it actually looks really good. Like when you're having the popovers and the thingies.

Frank 12:49

Yeah.

James 12:49

um Okay. That new button, it's like, did animate in? anyways Okay. The gear. I have a problem with the gear because it comes up the gear.

Frank 13:01

Yes, sir.

James 13:03

The gallery comes from the bottom. the gaput It comes from the bottom.

Frank 13:06

Yes, sir. Because it's a paid sheet.

James 13:08

But the gear comes from the gear. Now, it's a popover, but I'm on an iPhone.

Frank 13:12

because it's a popover on an iPhone. On an iPhone.

James 13:17

There are no popovers. Popovers don't exist on the iPhone.

Frank 13:19

Correct. Right.

James 13:22

Right? This is this the band of your existence. Okay. Okay. so This is fine.

Frank 13:27

Uh-huh.

James 13:28

This is a UI table view.

Frank 13:29

It's fine.

James 13:29

This is a monotouch.dialog.

Frank 13:30

Classic. but It isn't, but it basically Okay.

James 13:39

This is a monotouch.dialog.

Frank 13:41

worse than that, it's from a library I wrote called Preclerum Forms.

James 13:41

Oh my God.

Frank 13:46

Anyone can use it out there.

James 13:48

That's great. It's very touchy. It's very touchy. Okay. um so i look at good tester.

Frank 13:55

Yes, sir.

James 13:57

i was like, oh, maybe I should have an iCircuit account.

Frank 13:58

Yeah.

James 14:00

That'd be kind of cool.

Frank 14:01

Mm-hmm.

James 14:01

So what did do? I said, sign into gallery on this thing. Signed in. Boom. Went away. It flew back. The window flew back to the gears. Like, I'm out of here. Yeah. Yeah. And I told you, I said, it's broken, Frank.

Frank 14:15

Yeah.

James 14:15

um So let's start there.

Frank 14:17

and And James, let's let's actually be informative. or should I not interrupt your critique?

James 14:21

No, no, no. We have plenty of critiques to go.

Frank 14:23

Why does it go to the gear? Because when you choose a model model presentation style of popover, you get to tell it what view generated the popover. So in that case, I'm able to say it's the gear icon um that generated the popover. So that's why the system knows how to animate to and from the gear icon.

James 14:47

I don't want it to animate from the gear.

Frank 14:47

I'll ah allow you to continue now

James 14:49

I don't want it to animate from the gear.

Frank 14:50

You do not want to. OK.

James 14:51

Navigate, navigate, navigate, Frank.

Frank 14:56

Yeah.

James 14:56

no No, what other app does that?

Frank 14:57

So, okay.

James 14:58

No other app does that.

Frank 15:00

It looks good on the iPad because so the problem is um yeah your classic modal dialogs are ah form sheet, page sheet, popover.

James 15:01

I'm so mean right now.

Frank 15:12

There's a few new ones, but let's ignore those. They don't count.

James 15:14

Yeah.

Frank 15:14

um And page sheet, form sheet, the big difference is is it top to bottom or does it get margins at the top or bottom on an iPad? This is all iPad kind of stuff. um So the gallery that you were mentioning that comes up from the bottom is a page sheet. So it does it works the way that you want it. And this whole sheet system was revised in what? Was it like iOS 8 or 9 or something like that? They got kind of crazy with the sheets.

um The problem is because the settings, this is excuses, I get it. You're you're giving me good user feedback and I'm just handing you developer excuses. um The settings, because it's a table view, it looks terrible, in my opinion, when it's all wide as a page sheet. But maybe I should get over myself because in this modern world of people shipping basically iOS apps on Mac, and it's it's just a thing.

James 16:00

Hmm.

Frank 16:09

So those big those big table view rows, those bordered and background filled rows, They can be wide. I get it. It's not just 320 pixels anymore. We're not living in that era anymore. But i I still prefer it when the table views are narrow, not wide. And so that's why even on the phone, um I still put it in a popover. And the popover is anchored to the gear icon, and that's why you get all the animations from the gear.

See, I thought you would like the animation to the gear. That's that's a subtlety. That's a nicety. You don't like it, though. Dang.

James 16:45

The thing the thing is and the reason I don't like it, is because on an iPad, I love it. Because it's going be that nice popover.

Frank 16:55

Mm.

James 16:56

It's going like there. On an iPhone, it actually just displays as a modal. And you can actually see, and you can actually, and it scrunches down.

Frank 17:02

Yeah.

James 17:06

It's like a weird scrunchie.

Frank 17:06

It's cute. Sheet system 2.0.

James 17:10

Yeah. And so it's it's a very touchy sheet. So so for example here, if you it's very touchy.

Frank 17:15

Yeah. Mm-hmm.

James 17:20

<unk> very It's very, see I didn't even touch anything. It's very touchy. No good, no good.

Frank 17:26

OK.

James 17:26

Okay, it's very touchy. So what Frank would have to do to appease me is he'd have to either change it to be a modal, kind of how he has the gallery.

Frank 17:31

Yes.

James 17:34

That's an option.

Frank 17:35

Mm-hmm.

James 17:35

Then that'd be a modal, that'd be beautiful. It wouldn't be as nice though, but it'd be something. I do think on an iPad, this this also looks very good by the way. So like the app is very optimized for iPad. So I'm just on my iPhone cause don't have an iPad. So that's my iPad, just might as well.

Frank 17:49

But, you know, my my user base, m I mean, I do look at user statistics.

James 17:50

might as well.

Frank 17:56

So as much as I love the iPad and I think the app shines on iPad, i have a lot of phone users.

James 18:02

It does.

Frank 18:03

and So I do have to make sure it works nicely and behaves nicely on phone.

James 18:08

So why did, so what happened? So let's talk about what happened here on the sign in with gallery. Cause it wasn't just a sign in gallery. What ended up happening is I also was like, oh online resources. I circuit manual. Yeah. Nothing happened. Other buttons, basically, I was like, I feel like and my first inclination was this windowing system.

Frank 18:21

Yeah.

James 18:26

I was like, you know what? You got fancy on the iPad and you messed up the window and you're trying to open a new window, but there's no parent, so it can't find the parent. So it it no in no exception, you swallowed it and boom, it went away. That was my assumption, but I don't think I was correct.

Frank 18:42

You weren't correct, but I assumed the same thing. We think alike, James. I'm like, oh, God, did view controllers, popovers, emulating on the phone. I thought the exact same thing as you. Because to be 100% honest, I wrote that settings dialogue 15 years ago. And it uses APIs that I really just don't think that much about. um But the iCircuit manual is important, especially for new customers. And there's a few other links on there. I know the email button works because I still get lots of feedback from users. Thank you, everyone.

James 19:15

That one did work. I tested it.

Frank 19:16

Yeah.

James 19:16

That one did work.

Frank 19:16

Yeah.

James 19:17

Yeah. That, cause that was the main, that's the, um, I'm assuming that's using like the built-in mail dialog-y thingy. there's like a there's a u well There's an API for it that's sending the mail.

Frank 19:29

Yeah, exactly.

James 19:30

Like two lines.

Frank 19:30

Yeah, so it's real easy to um merge into and that that API has been there forever.

James 19:31

Yeah.

Frank 19:35

um

James 19:35

And now that API is very fascinating too because i use this API as well. And I really like it and it, but it only opens the mail app. If people like are using Gmail and that's the default, it like will not And they're like, they don't use the mail app.

Frank 19:50

Oh, is that right?

James 19:50

It will not. Yeah. It'll throw an exception.

Frank 19:53

I thought the opposite. Dang. Okay.

James 19:55

No, no, it only opens the mail app. Then it'll throw an exception. If you don't have it, you know, ask me how I know.

Frank 20:02

And someone how would someone send you a bug report? They can't email you. ah

James 20:06

Exactly.

Frank 20:08

Well, the doesn't this always get down to like, it's the worst, developer devices are the worst. Like now what, do I have to set Gmail as my default email? I don't want Gmail as my default email.

James 20:18

Yeah.

Frank 20:19

So I have to add that to my test plan, I guess. um Yeah, i I'll investigate that. I thought it was smarter than that. So won't open, for example, Gmail or...

James 20:28

Now it'll just, ah I think it throws an exception. um And then, so what I do is I swallow the exception and then I pop up a, oh, sorry, email me directly at this this email.

Frank 20:32

Darn. OK, so. Right. Well, I will add that to the bug report. Thank you very much.

James 20:42

Hmm.

Frank 20:43

So no, what was happening is quite different from all that. So the iCircuit manual is a web page that I bring people to. I actually used to, the macOS version of the app ships with the manual integrated as a bundled HTML thing because Mac has a really nice help system.

James 20:59

Ooh, I have it.

Frank 21:03

And it's actually pretty easy to compile everything into a help file as the Windows people would know it. Mac has an equivalent to that.

James 21:11

Oh, look at that.

Frank 21:12

Yeah.

James 21:13

Look at that.

Frank 21:13

Yeah, really not bad. um On iOS, however, i just take people to...

James 21:16

Cool. this but Wait, this this is built in?

Frank 21:22

Yeah, forever. um since Yeah, basically since Next Step, as far as I know.

James 21:24

Wow.

Frank 21:28

like This is classic Mac stuff.

James 21:29

Ah, very cool.

Frank 21:31

um So if you're writing a proper Mac app out there, I highly recommend doing a proper help page. um It's totally worth it. You can just throw all your HTML into a little help bundle. And there's even um and a help indexing app that'll create like search terms and everything so that the the help menu bar integrates with your help system.

James 21:42

Hmm. Wow.

Frank 21:55

It's really quite good, honestly.

James 21:56

Crazy.

Frank 21:58

I think it's really so. um But iOS has none of that. That's one of the AppKit things that never made it to iOS. So in that case, I just open a web page. And now it's time for me to give you the excuse for why i wasn't working. ah In general, I do not like, I'm just going I have a ah naughty term for these, but I hate app built-in browsers because they're never full featured.

James 22:24

Green eggs and ham.

Frank 22:33

Oftentimes they don't share credentials. um ah They just put you, they're just a terrible browsing experience. And because I have that bias, um I basically kick people out of the app and open up real Safari.

James 22:42

It's true. It's true.

Frank 22:50

um This isn't so bad because it's you know Apple added the little back button thing in the top left and everything. So I bounce you over sorry Safari, whatever your default web browser is. And the manual opens. And if you want to go back, it's pretty easy. I think most people know how to get back to an app. ah think I think I'll agree with you, it's not perfect, because I know what your next complaint is going to be. But allow me to finish what the bug was. So forever um since iOS 2, UI application has been able to open a yeah URL.

Open yeah URL, it's a perfect API.

James 23:31

Open it up.

Frank 23:31

You give it a yeah URL, it opens it.

James 23:32

It's right there. it is good it's It's in the name.

Frank 23:35

Can't really.

James 23:37

It's in the name, people.

Frank 23:37

Yeah. And it's actually surprising. um So you can do in-app yeah URLs also. So it'll delegate off if you've registered different schemes for different apps and things like that. So everyone knows OpenURL. Everyone loves OpenURL. James, did you know OpenURL no longer works in iOS 26?

James 23:56

Oh, wow. didn't know that.

Frank 23:58

Yeah, so it's been deprecated for a while. I believe in iOS 10 it was deprecated. So we'll go we'll just call that eight years. I don't know what the actual number is, but roughly speaking, it's it's been deprecated for eight years. But like all Apple deprecations, it's a little boy crying wolf. Apple deprecates everything, removes nothing. This is what I have learned over my whatever million years of writing iOS apps.

And that's all totally true unless you start compiling with the new iOS 26 SDK, which is what I just started doing with my app. So if you compile with the old SDK, they run a little shim layer and OpenURL still works. James, but if you compile with the iOS 26, do you think that they perhaps remove that API?

James 24:57

No.

Frank 24:58

No. No, what they did instead was they made the API do nothing.

James 24:59

No.

Frank 25:04

It's still there. You still compile against it.

James 25:06

So the ah the click works. The click works. so that That makes sense.

Frank 25:09

The click works.

James 25:10

Yeah.

Frank 25:10

Absolutely no error is brought up. No error is logged in the console app. In fact, in Apple's documentation, they say, hey, this API is here, but it does nothing. Goes nowhere, does nothing. This has got to be the worst form of deprecation i have ever run into. Now, I should be clear with my iCircuit is still compatible with iOS 12.

James 25:33

Bye.

Frank 25:39

So I have no excuse. I really should have upgraded to the new API. But, you know, there's bigger fish to fry out there than chasing what Apple engineers think you should be using as an API. And it's always just been stable. I fully admit i do not thoroughly test the settings dialog on every release because you just assume that API called OpenURL is going to open the stupid URL. This isn't rocket science. Open the URL, Apple. Please just open it.

Well, it no longer opens yeah URLs. So that bug got through and you were kind enough to report it to me. um It was so funny though, because like, yeah, I'm looking through all the error logs. i'm like, there is no error being generated anywhere. Like, what is going on? had to lower myself and read the docs.

James 26:35

I, uh, it's one, it's funny too, cause yeah, open yeah url has been deprecated for a while. However, can open URL is still not deprecated. That still works. And so the funny part is instead of opening open URL, the, the actual API is just open. So, and then you give it a yeah URL silly and a few other options where you have external and you can do SF Safari view and all these other ones. Right.

Frank 26:58

Right. So, I should tell everyone.

James 26:59

Um,

Frank 26:59

So, there's still an open yeah URL, but there's an overload for it now. There's open URL that takes a yeah URL, a set of options, and a callback function. Two parameters you don't need at all because you're just opening a yeah URL, but there they are, and you have to use them.

James 27:15

Open it up. Gotta to use it. Open it up. Nope, not a allowed to. ah No, that's a good one because we've talked about on this podcast how yeah APIs, I mean, this is like my fear of like, ah of a store kit, right?

Frank 27:20

okay

James 27:32

Store kit, that's why I stopped doing, because I'm like, it's gonna stop working eventually and then I don't know what to do.

Frank 27:32

Yeah. Silently, i from what I've learned.

James 27:41

silently up it's just gone um so that's a pretty good that's a pretty good one okay that's good okay cool i'm glad you found it that's good

Frank 27:49

Yeah, okay. so um So I think, and then maybe before the show, I'm just going to jump straight to your second criticism. um You said, why jump out of the app at all? So I should say there are alternatives now. I believe um Safari Kit, not WebKit. um has more of a full-blown browser that you can use in the app. And it actually does share cookies with the real browser and all that stuff, assuming you use Safari, though, I think, on all your other stuff.

James 28:14

Thank

Frank 28:23

So I probably could do an in-app browser. And in fact, I remember even starting a project to improve the help system on here and basically building in and an in-app browser. And hilariously enough, I do have an in-app browser for the Circuit Gallery. So when you hit gallery, it's bringing up my in-app browser. And it's not very good, to be thoroughly honest, because it's an in-app browser and they're all terrible. But um I can probably move a bunch of those so over SafariKit because I think they have a better one.

James 29:00

It is, because I mean, I would say there's like pros and cons of this. And and I almost oddly, you you may have convinced me to like not, but I think you could make it an option, funnily enough.

Frank 29:09

Oh, god.

James 29:13

Like, you know, where do you want?

Frank 29:13

the The worst, no. Yeah.

James 29:16

Because here's the benefit of opening it in another browser is that I could go back and forth between documentation and my circuit.

Frank 29:20

Yeah. Right.

James 29:26

And I could be on different pages. The problem with the in-app ah So I think you're actually doing it correct, but by the way.

Frank 29:32

Oh, whoa, whoa, whoa.

James 29:32

The problem with the int...

Frank 29:33

Can we get, did it everyone get that?

James 29:34

Yeah.

Frank 29:35

Everyone clip that? So there's your ringtone. Thank you.

James 29:39

Now, maybe like suggest an improvement should be in app and not maybe jump me out. That seems a little bit... You know you want to keep people in the app.

Frank 29:45

Okay. Yeah, I agree.

James 29:47

um terms Terms in EULA, maybe that's not completely necessary to to jump me out of the application.

Frank 29:48

I agree. Apple made me put that one in.

James 29:54

Now the iCircuit manual I do think would make sense to jump outside because I might wanna flip back and forth between the app, back and forth.

Frank 30:02

Yeah.

James 30:03

And yeah.

Frank 30:03

And on iPad, iPad actually has multi-windowing support, so it is nice. Now, you can finally put two apps side by side. Mm-hmm.

James 30:11

unless Unless you were to actually make it super integrated And what I mean by that is like you you would like store the user's you know nav state as they're napping around. And then when I'm on a circuit, so let's say I create a new circuit and I go to to the gear down there, which is also different, then maybe there's a manual button and then it would open it so I could see the manual in real time, like in the application, but I'd have to remember where I'm at.

Right. So imagine. having a manual that I can flip around anytime, kind of like on the Mac, right?

Frank 30:43

Yeah.

James 30:46

It's a different window. um So, yeah.

Frank 30:50

Yeah, and there is multi-scene support. So technically, I could have a documentation scene. But those get a little bit funky too because technically, every scene in your app should be able to get you back to the root scene of your app.

James 30:56

Ooh. Yeah.

Frank 31:05

So basically, I'd be opening a whole second window of the app that just happens to have a full screen help system in it.

James 31:06

Yeah.

Frank 31:13

think help has always been a little bit hard in apps, to be honest.

James 31:17

I feel like it. and But an app like yours does need like that sort of you know documentation.

Frank 31:22

polish yeah mm-hmm mm-hmm

James 31:23

It's pretty advanced. mean, it's a very advanced app in general. So I actually don't have too much else. um One, when you hit the new button, it does a nice little little animation thing.

Frank 31:33

ah You're OK with my sign in and sign out buttons.

James 31:35

And then it zooms in.

Frank 31:37

on I was mentally preparing myself for you hating those um because i do have signing in and signing out of the gallery so that you can upload to the gallery. For that, I make you have a user account. You can download anytime or if that bugs not.

James 31:51

That one pops up in the app because you have to.

Frank 31:56

Oh, interesting. OK. Well, I thought you were going to complain.

James 32:00

yeah so when you oh That's okay.

Frank 32:02

Sorry, thought you going to complain because it pops up the Apple dialog box of, are you sure you want to go to icirca.com to authenticate?

James 32:11

im I'm used to that. so I think you pop that up.

Frank 32:13

Yeah, OK.

James 32:14

The bug is when you go to sign in

Frank 32:16

m

James 32:17

And then you don't sign It's like, you're now signed out. I never signed in Frank. I never signed in. Come on.

Frank 32:25

Written down, noted and approved, I'll admit, um I ran into that myself um and I was like, I should fix that.

James 32:31

It's not the worst.

Frank 32:32

And then I didn't fix it because this is this is proper developer excuse.

James 32:34

Yeah.

Frank 32:38

You ready for this one?

James 32:39

Yeah.

Frank 32:40

Preclerum forms can't refresh the form page. So I really need to close that page to refresh the UI. Oh, it's so embarrassing, the corners we paint ourselves into. This is... this is Can we just name this episode Frank's Embarrassment? um I do want to earn your respect back.

James 33:01

Uh...

Frank 33:01

um I do value polished apps, and I'm going to develop or reject this because I agree with you. um I was taking a shortcut by leaving that dialogue as it was, closing the settings, because... It's just easier. It's just easier. how how How many criminal activities have occurred because someone said it's just easier? I don't want to. I don't want to contribute to that.

James 33:27

And like none of these little things, like no one's going to stop using your app because of the things that I pointed out. I call this the um the the the Hanselflexion point because well i worked for Scott Hanselman for so long, and Scott is like meticulous with details. I would like create... like this stunning app or a website and like this and that. And I'd like, check out this thing I made and this demo. And he's like, fav icons blank. so You know, I did.

Frank 34:01

Dude, did you even try?

James 34:01

yeah.

Frank 34:02

Yeah. Mm-hmm.

James 34:03

It's like, did you, there's like some weird padding over here. yeah He'd be like, point out the most, he'd it would be, and i i've and i i I unfortunately have adopted because I've worked for him for so long.

Frank 34:09

yeah

James 34:15

And he pointed out all of my failures over and over and over again, these little tiny micro cuts. But it what it made me end up doing is like doing what I'm doing now. And I now I think about the user flow, the little things that people don't think matter, but actually kind of do matter because the polish, right?

Frank 34:26

yeah

James 34:30

People, especially if people are going in also, I'll say why this in dialogue is important. It's the one dialogue that you can give Frank extra money by the way for iCircuit Pro.

Frank 34:39

oh right very important yeah it's true gotta look good yeah

James 34:42

it's It's the one area. People have a bad experience, they're out. bunch Can I long press? Ooh, I can delete. Ooh, it doesn't ask me if I want to delete, but sure.

Frank 34:52

So um I 100% agree with the Hanselman and FlexionPoint, whatever you called it there. It's actually what drew me to Mac apps in the first place. I felt like Mac apps and Mac developers in particular um did spend a lot of time on this refinement and this polish stage. And it's what's drawn me to the platform. It's what drew me to being a Mac developer myself and wanting to create that kind of polish software. So um basically what I'm saying is your criticism is hitting me straight in the heart.

And I can't really, I'm not going to hide.

James 35:26

Nice. Oh,

Frank 35:29

I'm just going to like, yeah, you're right. Thanks for the call out because it's important. And honestly, this is what I find frustrating about because we have to make every episode about AI. This is what I find frustrating about AI user interfaces. They often lack this kind of polish. And um if if I'm going to still live in a world of making artisanal software with my artisanal hands, then I need to keep the quality standards high.

James 35:47

yeah. I hundred percent agree. um, have been working on this tiny clips clips manager, uh, pro deluxe version.

Frank 36:07

Mm-hmm.

James 36:09

And you it it's, it is polished. It's little tiny things. And it's some things that I can't know, actually spent a lot of time recently with, uh, having it understand retina displays and two X-ing what to actually save it at.

Frank 36:21

Oh gosh, yeah. You would think it'd be simple, right?

James 36:24

What's it is. No, it's not.

Frank 36:26

No, it's not.

James 36:26

ah It's not. So I spent a lot of time fixing a lot of stuff there. But then, yeah it it it it got a lot of things close because it's a pretty complex UI. it has a you know It automatically resizes. There's list views. There's icons. There's hover overs. There's favoriting.

Frank 36:44

And it's tricky because you're not just dealing with user interface elements.

James 36:45

There's...

Frank 36:47

You're dealing with media resources. And there's a million ways to deal with media resources when it comes to scaling because there's metadata.

James 36:50

Yep.

Frank 36:56

There's the actual resolution of the thing. There's the encoded resolution versus the display resolution. like i know the pain you're feeling. And ah I'm just going to say, you better get it right, buddy, or I'm just going to reject that beta.

James 37:07

yeah

Frank 37:12

ah yeah

James 37:12

um well yeah i guess let me double check the tiny clips yeah it's a it's definitely it's definitely a tricky one and i've spent the most time because most of tiny clips uh didn't really have a ui however the one thing i recently ah found out is, you know the nice little s slidey to the left UI, the little slidey thing?

Frank 37:39

Yeah, yeah, it used to be called the sidebar. i mean, it's still called the sidebar. It used to have a cute cute name. I forgot. The drawer.

James 37:47

The UI split view controller thingy.

Frank 37:47

No, sometimes. That's what we use now. There used to be a thing called the drawer. And now you do a split view.

James 37:55

Oh yeah.

Frank 37:56

you put a table view or an outline view in it. And you give it the sidebar background style. And then you get all the nice niceties that you want.

James 38:07

And the problem is that if you're not using a scene, a UI scene view kit thingy, it doesn't work how you want it to work. You have to actually use the scene and all this stuff. I had again, it was all these little things and yeah.

Frank 38:23

you can You can do it in code. It's just hard because they don't document very well how to make all that stuff light up.

James 38:30

No.

Frank 38:32

And in particular, in iOS 26, like, toolbars changed. you know The documentation doesn't say it. The HIG didn't change. But I'll tell you what, I struggled with that toolbar because I still support Mac. I go back pretty far. I mean, it's why I wrote Cleanroom, so I could test some old versions of Mac. And making sure that my new toolbar looked great on iOS 26 and looked good on, think, macOS 12, something like that.

um It's tough. And Apple does not document any of that stuff because, A, they've moved everyone over to SwiftUI and they totally pretend AppKit doesn't exist anymore. B, they keep changing how AppKit works. So it's impossible to keep up with how AppKit changes. Yeah.

James 39:17

It's true, yeah. I've been struggling and it's it's been one of those things where I got a lot of stuff down.

Frank 39:19

okay

James 39:23

It's really that polished. So I'm just, you know, mostly agreeing with you. It's like really just that polish at the end of the day, right? That is so important to really get correct for your users or else you get a butt like me that's like critiquing you, right?

Frank 39:28

Yeah.

James 39:34

The AI doesn't have a me to to be a critique because I am the critique.

Frank 39:35

Well, no. Mm-hmm. Mm-hmm.

James 39:38

I got to code it, right? I got to really nurse the thing to get it right. I mean, it's good, but it's not hundred percent right. And we can make mistakes too. We're not like all user experience experts, but also sometimes you just got to ship the code. It's got to ship the code.

Frank 39:51

Yeah. Well, especially when there's a glaring bug. So the glaring bug right now is you cannot log into the Circuit Gallery and you cannot open the manual. Those are pretty big bugs, in my opinion. So that's why I was pushing to get the app review done quickly, because I do want to just kind of push this thing out. So now I have to make the debate tonight of whether to push out a.2 and then prepare a.3, which has the James refinements, or um just take another swing at hopefully AppReview going quickly and get those refinements in.

James 40:25

Yeah. Well, let us know if you've ah ever been in a situation like this where you had a dear good friend that loves you so much. that they tell you to your face, I hate everything about your application.

Frank 40:38

You are a bad developer.

James 40:38

fix it Fix it for me, even though i'm not gonna use your app. um ah Let us know. I mean, I think it's super fascinating because while I just critiqued, you know Frank's app pretty you know complicatedly, just like one screen, two screens. like This is what I've been doing because to your point, I want my AI to be better.

Frank 40:54

Mm-hmm.

James 40:57

I want to be better. i want it to to to craft those screens like I wanted to. right and Also, I have my own expectations of how good I want my apps to be and it better be as good as if I was hand coding it.

Frank 41:07

Yeah. Mm-hmm.

James 41:11

Artisanal gelato.

Frank 41:13

Mm-hmm.

James 41:14

It's a UI. right It's good.

Frank 41:15

I always complain online that um the AIs are not good at user interface and someone's like, well, just write up a user interface markdown file describing all this stuff.

James 41:15

so

Frank 41:25

I'm just like, oh, ah okay, I just need to summarize 30 years of user interface lessons that I've learned into a markdown file that doesn't completely obliterate your context window.

James 41:35

Yeah. Yeah.

Frank 41:38

i'm like, OK, I can do that, maybe. No, it's impossible. like It's 30 years of experience of using software, having opinions, and building taste and quality standards. So it tragically hurts me in the heart that I missed my quality standards. I will hit those, James. They will be, we will up the qualities.

James 41:59

Well, I'm looking forward to that update. Go get that update because by the time you listen to this, Frank will have a beautiful refreshed user interface for iCircuit. So go to iCircuitapp.com, iCircuit.com, what's the URL?

Frank 42:10

I'd start with app.com. Yeah.

James 42:12

iCircuitApp.com. Couldn't get iCircuit.app because that domain didn't exist 15 years ago.

Frank 42:13

Awesome.

James 42:17

ah That's going to do it for this merge conflict.

Frank 42:19

yes

James 42:21

Hope you enjoyed it. If you're at MVP Summit, maybe I'll see you there because I'll be at the MVP Summit when your this comes out and the MVP Summit's upcoming.

Frank 42:28

so

James 42:29

Then else, maybe I'll see you at Build. Go to build.Microsoft.com. Registration's open. Check that out. you know What's his name? Peter's going to be there. um claud The Claude guy.

Frank 42:40

Ooh, open claw?

James 42:40

The claw bot, open claw guy, Peter Steinberger.

Frank 42:43

Claw. Claw.

James 42:45

I swear I met him in person somewhere.

Frank 42:45

so

James 42:47

It's Peter Steinberger.

Frank 42:48

Sweet. That'd be fun.

James 42:50

Yeah, so check it out, people. um Opportunities are about in San Francisco. San Francisco.

Frank 43:00

That's far away.

James 43:00

Gotta go to the bay.

Frank 43:00

That's in the sunshine state.

James 43:02

It is, gotta get those airline miles.

Frank 43:02

That's it.

James 43:04

All right, I'm gonna go eat some pizza. All right, everyone, have a great night. going to week's merch conflict. So until next time, I'm James Mottemagno.

Frank 43:13

And I'm Frank Kruger. thanks for watching and listening

James 43:16

Peace.

Download Transcript

Episode Comments