Frank: 00:00 James: 00:08 Frank. It is official. I'm a Mac OS developer. New Speaker: 00:12 What, you got hired by apple and you're working on MacOS? New Speaker: 00:15 No, I mean I, I'm a developer that is building macos as applications in Xamarin.Forms, Frank: 00:21 a third party developer and I guess the fee for the Mac platform. Welcome James. You're on the cool rebel side of the, uh, Star wars battled with this analogy. Got Out of hand. Nevermind. James: 00:34 No, you are correct in, in fact, I believe the provisioning profile or distribution center does a third party APP developer for Mac os or something crazy like that. Yeah. Yeah. Well you, you got to pay to join the club. You still pay, right? Did I? Yeah, I'm paying, I still pay it. I pay it. Okay. It's all in one. It's all encompassing, isn't it? Frank: 00:55 Yeah. If you're an ios developer, you're also a Mac developer, whether you're at least a Mac app or not, you're a Mac developer, but today I guess you graduated to fall Mac developer because I saw on the tweeters that you submitted an APP. James: 01:11 Yes, I submitted an APP. Well first it was, let me, let me walk through this scenario here of macro s development. So the first thing is you, you start off and you get frustrated and then things go, okay. And then you get frustrated and you're like, how do I package this thing and how'd the, how come this info peelers doesn't work. We're at the entitlements, I'm missing this thing. I'm missing that thing. Then you email frank and you say, frank, nothing is working. Help me please. For the love of everything that's holy. And then like 30 minutes later, everything works just fine. And then the email, frank again, you said, frank, oh, don't worry, I got it all working. And then you submit it to the APP store and then you get rejected. That's what happens. Frank: 01:50 Yeah. That sounds about accurate. Yeah. That tracks to my story, except I didn't have a frank to email. I just kinda sent it to myself. I'm like, Hey, it's this look. Okay. Nope. Uh, it, it's kind of depressing. Um, anytime you're submitting to a new APP store for the first time, I think I've done this a few times myself. Um, I pretty much always miss the mark on my first submittal. There's always something I forgot to do, I think on the windows once. It was always like something about age and ratings or something like that. I always forget to do on Mac. Uh, it can be a million things because it's a sandbox staff just like on Ios. So as he said, there's entitlements they're signing, there's the human interface guidelines, which they rarely test through and they really click every button in the APP. James: 02:36 Yeah. And before we get to why and how things are rejected, I think it's probably good to go to the beginning of what I was building. Okay. And am I really a Mac developer? Well, I have submitted a Mac app to the APP store, but it's about as beautiful as my WPF version of my stream or application. So when I picture Frank: 03:01 gorgeous here or are we talking, are you Kinda Kinda of not doing too much Ui design work here? James: 03:07 Uh, uh, baseline controls that are inside the box, so. Okay. Uh, Frank: 03:16 now did you say forms controls? Are these native controls? I am. By native, I mean are you using apps? James: 03:24 Oh yeah. So the thing is I could totally use app kit but then I didn't. So uh, so I have an APP that's called my stream timer. I built it with Don and courts three and WPF we talked about kind of the MSI, exe world and me zipping it up but that onto the windows store and naturally I wanted to then port that to Mac because I have a lot of friends that use Mac and uh, I thought it would be a fun little project. The APP itself is not very complicated. There's a few tabs where you can have different counters that go up and down a few tech centuries, a check box, a few buttons. Frank, nothing complicated. Frank: 04:02 Yeah, I would call this a classic forms control. These were my favorite kind of apps to write. And like even VB by itself, he just drags them buttons over a few textboxes some labels and you're like, that's an app, single page app kind of. But I guess you have to abs. So multipage but kind of signal pitch James: 04:19 and the most important part of the application was that it writes some stuff to disk and also that you can launch the application via URL protocols so you could automatically launch the APP via command line or stream deck in, in my, in my world is little little cool little desktop thing where I press a button and it does stuff. Frank: 04:41 Is that because that's how, if I remember this is all for kind of a twitch Abbott, is that because that's how twitch works and it likes to use URLs or is that just in general, do you think society has moved towards using URLs for Interapt execution and that kind of stuff? James: 04:57 You know it should, I at first thought about, well I'll just make it so it's some command line arguments that you pass to the ECC or to the UNIX APP x, Z or if there is one on one on Mac and it's there. So I figured you could do that. I think in this day and age though, people aren't going to necessarily know where that thing lives. Frank: 05:23 Yeah. I, I fear the idea of command line apps, especially to the general public because unless it has an icon and lives in the application's folder on the Mac or if it's on the Mac store, I don't think anyone's, you're, you're not going to get traction outside of a programmer community. Um, as, yeah, command line. That's totally a programmer thing. No one else wants to use the command line. James: 05:47 Yeah. So I figure, you know, well why not just have some very simple URL protocols where you can pass it some things to auto start. Bingle bangle. You're good. So the APP was really nice. I use WPF cause I wanted to bundle it all up and get it in there. Could have used UWP or Xamarin forms even for it. But I wanted some fancier controls. I don't know what I was thinking in my mind, but I did it frank. It happened so naturally. I went to Mac and to get to your question, I decided to use the preview. Unreleased hasn't been updated in a little bit of time. Xamarin forms version of Mac os support. That's what I did. I find this completely hilarious. So what you're saying is you started out on windows and went full. I'm just going to use the native Api, not across platform API. James: 06:36 And then he came over to Mac and said, well I didn't like that decision or I don't know app kit well enough. And I'm guessing that's more likely the truth and said, I'm going to use a cross platform tool kit to write the Mac version. Now I can't disagree with this though because the repercussions are, you can have android and ios versions very easily after this. But I do find it kind of hilarious that you went for a native Api, not controls. We can, we've had that discussion API on windows but not on Mac. Is that because you don't know app get it is because I don't know. App Kit and storyboard scare me. They're not so bad. Um, just as a general overview to demystify APP kit, it is a standard Ui library. There's buttons, there's check boxes, their views, there's a hierarchy. You add them to parents, you can position them with frames. James: 07:26 It's really not that complex, especially if you've done ios programming in the past. But I get a, I'm a big tool, like x code and storyboards are quite intimidating. I think it took me a full year of using x code before I knew what the heck I was doing inside there, so I can understand that. Yeah. The one of the nice things about this application is that I went into it knowing that I may bring it cross platform. So what I did is I had separate Ui libraries and business logic libraries. So the application as of today does have a WPF head, but about 90% of the code, if not more, is in a doughnut standard library, which all of the business logic, all the countdown timers, all the writing to dis essentially is inside of that.net standard library. So when I brought this over to Mac, I only needed a port for all intensive purposes, the Ui and the protocol handler, and that was it because everything else was going to call it into the doughnut standard library. James: 08:34 And in my mind, since I had already created the WPF application in Xaml, I was hoping that it wouldn't take that long to port and I was correct. It only maybe took a half an hour to port the Ui itself over because the text box is just a label. He just kind of replace a few things, very simplistic and the main controls are a little bit different. Like there is no checkbox currently. So I just added a switch with on Mac happens to be a checkbox, which is kind of funny. But uh, you know, I added those, some of those things in there automatically, um, on, on the, on the Mac version in the port. So overall it was okay. Um, in my Ui decision I think, Frank: 09:23 yeah, it sounds like you did pretty much the thing that we're all doing these days is in the very least we're separating out rui labors, Ui layers from our model layers. Um, and for an APP like this, obviously that was a little bit of foresight or you knew where you were going. You knew you didn't want to commit to WPF but it can be a little bit, uh, tricky because I imagine the business logic of this app honestly can't be too big. You know, we're not talking 10,000 lines or 20,000 mines here. And so with these kinds of apps I tend to see the Ui layer itself have more code to it or at least more design files and such. Then the actual business layer, the APP. And actually I, I think a lot about these kinds of apps because I wish I wrote more of them. Um, I think it'd be fun to just have a quicker Ui, um, turn around like that. All that to say is, it was nice to hear that you said you could reuse a good chunk of it. And I'm assuming that you're throwing your view models kind of into that a chunk of dotnet standard code. Cause I imagine those translate pretty much directly from WPF to Xamarin forms. Am I right? James: 10:34 Yeah, correct. So everything that's in here, I have some constants. I have user preferences. Like when you set how much time you want or if you want to auto start. Those are all stored using my settings plug in. I have some utilities that parse the command line. So it's the same command line arguments that get passed to not command line, but protocol handlers. Unfortunately on windows and Mac, they're exactly the same. So there's common parsing there. And then I just have a simple timer view model and about view model that that handle all the, the fancy schmancy stuff there. And I have some infrastructure helpers, but in general I would say the entire APP is less than a thousand lines of code. I mean the main view model, which is the timer one is 260. So you know, it's not doing much. Luckily our good friend, fila system.io handles all the, the, the file access. But um, besides that, it was pretty straight forward until I started Frank: 11:34 to go ahead. You were going right into it and I was about to say, but James, it's never that easy. I want to hear, I want to hear the bad parts now. Tell me what was the hardest part. So you hit file, new project or add to solution, some new MAC project. Where did you go from there? Was that stumbling from there? Was it easy from there? Tell us a story. James: 11:55 Well, so here's the fun part about the latest versions of visual studio and x code is that to get them, you're going to need to upgrade your system to Mojave. Uh, or else you can't get x code 12 so our 10 Frank: 12:11 apple there, they're pretty bad about that. I don't know if that's a new thing. I don't feel like they used to push us that hard. Now as the Mac developer, I do update my Ios, so I've kept up, but I feel like it's kind of knew that they were pushing us forward so fast James: 12:26 as three papers. I previously had excode ten.one on my previous version and they get 10 dot two no, no, no, no, no. You got to get Mojave. So I got Mojave. This is the whole overnight experience. Like I got Mojave, I got x code, you know, 10 dot two one all this stuff set up. And you know, everything was working pretty good. I mean, I feel as if my app was starting to come together in a port of the Ui, so I'm going to do one tab at a time, bring it over to see how it works. And when I set up my Mac, I put it in dark mode. I don't do that often, but I think that the Mojave dark mode is very beautiful. So I did it. Frank: 13:05 Let's take a moment. Um, because usually I try things just for their novelty as an, it's a new feature, let's try it out. Um, and normally I think we did whole episodes on how you and I don't like to change the defaults, but man, the Mojave dark theme has totally trapped me and I'm stuck in it now forever. So I'm glad that you gave that a shot before you opened your app. James: 13:27 Yeah, I, I, I have it. I had it all running. It was great. And then I went to run the APP and just nothing was really showing up. Like the text on the buttons weren't showing up. The, um, the entry wasn't really showing up. I the theme colors weren't showing up and I'm like, what's going on here? And Luckily I was doing this live and I had a 30 plus year Macko as developer in the chat room assisting night a little bit. Frank: 14:00 Nice. See, I can't even guess. I'm trying to guess what was going on. I've done dark mode ports for two of my apps. And generally the way it works is as long as you're using the newest Sdk, the operating system will kind of opt you in. And if the users in dark mode, all of a sudden your controls paint in dark mode, your menus in dark mode, um, any ns color you use will correctly reflect dark mode. Uh, so the question here is does Xamarin forms support dark mode? And so I'm guessing you were running into some compatibility issues James: 14:36 that is, that is the, that is the answer. The answer to you is, well the Xamarin forms of hadn't been updated nor would I expect it to be since it hasn't been up to in a bit to use the Mojave dark theme fully compatible. Nis, I assume that it needs be recompiled against the latest Sdk for it to work. That's my assumption. Maybe there's some optin things or maybe they're applying some default styles, but some things did work. So the tab bar, which is a segment it control just kind of silly, but it works. Um, that was properly themed. The labels seem to work okay. The button outlines worked, but you know, not everything showed up. So what I had to do is I had to go in and say, you know what, for this app we're just going to go ahead and turn on. Ns requires aqua system pro, uh, parents to true and a force it into old school mode. So Frank: 15:27 that's a Wah Wah fad. Fad. Yeah. So there's not too much you can do here because it takes quite a bit of code. Um, Xamarin forms renders to run on a new platform like Ios, android. Basically every control needs to be specifically implemented for the platform. And when this change happened, um, it, it's one of those changes where if you are all in on Africa, in your code was 100% APP kit. And you follow the API perfectly. Technically you wouldn't have to do any work and your APP would magically turn dark mode. But the truth is we all cheat here and there and especially, especially the Xamarin forms renders cheat here and there because they want to optimize speed and you know, optimized for these other things. And it worked fine before when aqua was the homie mode and like aqua was the only mode. Uh, so it, it caught us all for, it took us all for a loop. I had to both [inaudible] and coca, it took me days of figuring out exactly how to do it. And even then, I had to put in a few hacks where I specifically detective be user changes the system. Um, so that's all to say like you, I kind of understand why forms doesn't support it out of the box. James: 16:44 Yeah, yeah. And it, it's too bad. I mean, they probably could and you know, who knows with Marzipan what will will happen in the future. But, you know, I went into this, you know, people had asked me like, well, what's the status of it? What's, you know, what's this? I'm like, well, I'm not specifically on the team and I'm very close to the team and you know, there's real priorities on Ios and android and, and, and it also on windows, the UBP layer. And Mack has always been in previous, so I went into this frank knowing all full and well that I might have to throw away my entire work because what if the controls are missing? They're not implemented. You know, there's some catastrophic thing where I can't get around. Like what if this is a complete stopper. But luckily on the apple developer portal, they have this worker on that says, if you need to turn off, you know, automatic switching between dark mode for a short amount of time, we will allow you to do that. You know, they're really, you know, going to push it hard. But I go, you know, at least at this level, even if I had to rewrite my Ui, I know that all the business logic works, all the other bits and pieces fell in place. And I could probably rewrite the Ui, but Frank: 17:51 see, I'm okay. Wouldn't even, it wouldn't even come to that James, because in some ways at its basis levels, Xamarin forms is kind of just an architecture for laying out Ui controls. At any point you can override a renderer and use your own renders. And so if the current renderer is not picking up on dark mode properly, guess what and about 50 lines of code, you can write a new renderer or they're not that complicated to be thoroughly honest. And at that point you're still benefiting from Ios and functioning on android. And so I think that's kind of a nice fall out of the design. The Xamarin forms is that at its basis level, and it's, you could call it the dotnet standard level, it's just an architecture for Ui controls and how to lay them out on pages. It's very basic at that level. It's just the renderers that ad usefulness. James: 18:43 Yeah. And to be honest with you, I really only use for controls and the entire application. So even if I had to go down that route, like my application is so simple, it is a literally labels entries, a checkbox and a button. Like, that's the entirety of the entire thing. So, Frank: 19:06 well it's too bad that doesn't render a wellness cause those are pretty basic controls. But what can you do? Uh, it's open source. We should all be contributing. Yeah. Now a hackathon. James: 19:16 You should now I will say this though, and I, once I turned that flag on inside of my Info p list, everything worked just fine. Everything was great again. So all my effort, all my Ui lit up, everything was gravy. I started to, you know, rev, I added all the other tabs. Everything was great. Frank. Like it, it, it, it's not the most beautiful application. What does it mean to be frank? It doesn't need to be because it needs to do one thing and one thing while which is countdown and count up. So two things and needs to do two things and do them well and that's, and it does it well and it works like all the code, all the business logic, frank, everything worked, uh, inside the APP. So I was very, very happy Frank: 19:57 and we should be clear. It's only not pretty because you're being lazy. You could make it pretty if you actually want it to. James: 20:03 I did add some styling. Wow. James. I made it look halfway, a little bit better. I had some rounded corners in there. Frank: 20:13 I only have a really low resolution screenshot of it, so I really don't know how to judge this APP. It's, um, blurry labels with some burr blurry text boxes next to them. That's all I can tell. James: 20:25 That sounds about that. That sounds about right. Uh, yeah. I'll get you a fool. Okay. Screenshot. But yeah, Frank: 20:32 so we got a working app. You're convinced the thing's going to make me $1 billion. I gotta release it now before my competition gets on to me. Uh, we, I've done full rounds of Beta testing, had all my friends. They verify that it's okay. You did all that. Right? James: 20:48 Well, so there's a few things with this. So as I'm getting farther into APP development process, there's a few things that I wanted to do, which is why I ended up pinging you trying to get some help, which is what I found during Macko as development is there doesn't seem to be a lot of help on the Internet. Frank: 21:06 No. Um, yeah, because all the people who cut their teeth on APP, Kay did it in an era when the Internet was much smaller than it is when we didn't have the social networks when we didn't have stack exchange. Yeah. Is that what it's called? Stack overflow, you know, um, we just didn't have these things. And so literally you had to go to books. And I remember when I was starting out on Ios, I actually bought Mac books because even the ios books at the time, this was like the first year that you could program it. They weren't good. They would like tell you the API, but they wouldn't tell you how you're meant to use it. Uh, APP kit and to some degree, um, Ui kit are opinionated. They have a way they want you to be writing apps. And a lot of that is, um, not, it's written down in books. That's the unfortunate thing. And it's an old blogs and old parts of the Internet and not in the new parts of the Internet. So it's just harder information to find. So I totally feel you there. James: 22:12 Yeah, it's, it's pretty tricky. The, the hardest part of this APP was the protocol handler to open it up. And you, there's a lot of similarities between Ios and Mac Os. So I felt really comfortable coming into the Mac os project because I had an info p list and entitlements p list. They had a main, I had an APP delegate, I had view controllers, had the storyboard. So coming from that world, that felt relatively the same and okay. To me, even to the point where you, when you go into the APP delegate, it's called did finish launching and yeah, the same thing, you know, and I was, Frank: 22:52 it's eerily similar to Ios. If you've done any ios programming, you're going to feel very comfortable. And App Kit. I once heard a friend describe a Ui kit is apt kit version two as then we're going to fix a few little mistakes we made. Uh, I'm looking at you NSL you are a terrible API. Well I had to get down into the NS apple event manager Api. I don't know if you're familiar with that at all. No, I'm, and the sad thing is a lot of these ios see kind of features have just been kind of bolted on to APP kit. So affricate is a gorgeous, beautiful architecture and that means that you can definitely see the parts that were just kind of glued on like a little disgusting warts growing off of its side. And I imagine this is one of those things. James: 23:37 Yeah, this is some of those, you know, I have the open, you know, there's a few things and you want to open the APP with a URL, but you also want to get that if someone calls that again with your app open, you're going to get that notification again. So I started to research protocol handlers. And the problem is that since Ios and Mac os are very similar, you end up finding ios documentation even when you're trying to Google Macko as documentation and you find stack overflow's for Ios that don't apply to Mac os or they're similar but a little different. And then you need to attempt to decompile that objective c code into c sharp or just hope, just pray that Chris Hammond has gone and written a, a forum post somewhere describing and how to do this. So this was the most tedious part. Actually. Frank: 24:28 Can I give you a pro tip here? Pro Tip. Um, apple has really great sample applications and by really gray, I mean they basically build full applications and so if they want to show off a part of the API, they're like, go look at our drawing app and sample and sample in scare quotes here because they're not isolated samples. It's a very large app with a lot of code that does a lot of things. Now, James, the nice thing is a lot of those samples have been ported over to Xamarin. Mac, um, the team does this to make sure that they're covering all the API APIs and that everything works the way it should. So if you go around and look for, um, Xamarin Mac samples, that's usually a great place to see how things poured over. James: 25:17 No, that's a good idea. I never really thought of that. Um, yeah, I, I ended up finding a lot of hidden sort of forum posts from a long time ago that ended up helping me out. But this is a really crazy one, crazy one. Cause you have to create selectors and you have to export, um, specific methods. And then even in objective c, people were like, this is really hard. Like you got to, you got to magically know how to get this, you know, keyword out of this direct object thing and pass these things. It's crazy. It's a very ugly even objective CPI. But I got it working frank. I got it all working. And your right, I went through very stringent testing, Aka me, myself on my Mac and it totally worked. And I was ready to ship to the APP store that night. And I did. I did it. Frank: 26:05 Oh yeah. Work on my machine. Ready to go. Reminds me of my early days. James. It's bringing a tear to my eye. That's right. Wonderful. James: 26:13 I opened up the Info Pos at minimum SIF system version 10. Dot. 10. Why not? Who Cares? Frank: 26:20 Cause I didn't look up with Kpis. Do what now this is a nice thing is when you set that and you do a full build with warning set to errors, uh, usually the API APIs are documented well enough in Xamarin will yell at you if you're using a new API on an old version. I'm sure you ignored those warnings because no one looks at warnings. James: 26:41 Yeah, I dunno. I tell, I tell, I looked at it. It's only happened. Frank: 26:44 Uh, and plus I was using very minimally, I use the clipboard. I use system io, I used this protocol handler. So I picked this out. Things were good. And you know, I went into my apple provisioning portal like one does the first, I'm like, we got auto provisioning, right? Nope. That's not a thing that happens. I'm not for Mac. Uh, no, no. If ios only and even worth on Mac, you know all your problems on ios getting a good certificate. You got to do that twice on a Mac. Not only do you have to sign the APP, but you signed the installer separately from the APP to certificates. James, how much fun is this? Let me tell you, this was the most complicated thing ever. I'm s I'm so confused. So wait, wait, wait. I got to ask first. First question, sir, sir. Um, did you end up by the end of all this installing a Dev provisioning profile on your own Mac? Frank: 27:41 That is correct. Okay. I just had to know where we were going with this one. But please start us in the beginning. So you've never done this before. You went to the, you went to the tool. I went to the tool, I went to the documentation, which definitely told you how to create some provisioning profiles and get things running. So I did, I did the things that I knew I was going to need to do, create an application. Id did that. That seems pretty easy. Easy. You got to make sure you hit the [inaudible] dropdown or else it doesn't show up by the way in the beautiful beautifully updated certificates, identifiers and profiles portal. And uh, so then what I had to do is I created a developer ID application, a developer Id installer, a Mac developer certificate and Mac app distribution certificate and a Mac installer distribution certificate, five certificates. Frank: 28:33 Frank, you did not have to do all of that. So let me first explain to you developer ID versus Mac App store. Yup. So confused. Yeah. Okay. So for the Mac app store, you need to have those. Let's be clear there, but let's talk about the first ones. You mentioned that the developer id once. This is a program where apple wants you signing your Mac apps, whether you distribute them on the APP store or not. So even if you're just going to pop it up on your website and sell it your own way, distributed it your own way, they still want it to be signed to a registered developer Id. This is very similar to what we were talking about on the windows side where Microsoft wants you to go buy this very expensive certificate from this terrible Mafia run syndicate that it's just extorting money out of developers. Frank: 29:25 That's Microsoft solution. Apple solution is registered with us and we'll sign your APP. It's a different tact to kind of the same problem. Some people don't like the apple way because it's um, a singular entity that we all have to bow down to, to release apps. But others of us are just like, what ads? I don't want to get my money to various sign so it's fine. Right? So that's the developer ID program that is completely independent of the Mac app store. If you want the Mac app store, you need just like on Ios, a distribution certificate. And then one other called, um, the installer certificate. Now to develop for the Mac, you also need a developer certificate. So that's what brings us up to five. You have to, to distribute the APP to, to distribute the APP on your own. One left just to develop the thing. James: 30:17 So the hardest one surprisingly was trying to figure out how to sign this application because I did create the correct Mac app store provisioning profiles, the certs. I have all the certs under the, over the, over the moon. And then I go into Mac signing into the options and I see sign the APP, Bondo or I do that. And then I see this sign, the installer package. And I'm like, what does that thing? And uh, and I read the little, it'll help me. And it's like, this is what you said. And I tried to find documents. I'm like, how do I create this thing? I could not figure it out, frank. I was puzzled for an hour and a half. So I said, well, maybe I don't need it. So then here's where the fun happens. Okay. So I signed the APP. This is all fun for me. Just to be clear. James: 31:06 Oh, it was fun in quotes for me too. So I signed the APP bundle and I'm like, okay, well now I'm going to distribute this. So I go and I go into the archive manager and the archive managers there. And it's like, cool, sign and distribute, go to the apps or I'm so excited, right? Like let's do this. I see Yai CD, I don't care, let's just do it right here baby. Like right from the right from the thing. So I go in and it's like, cool, pick your identity, pick your provisioning profile, pic your installer Id thingy. And I was like, I don't got that. I was like, how do I create it? So then I was like, okay, well I'll just take the APP and I'll open the application loader. I already signed it and I go to sign into my application loader and apples all like, nope, we changed everything you need to turn on, you need to turn on a app specific passwords. I go, I go get my app specific password. I go to log into the application loader and it just sits there. It won't sign me in and I'm like googling nonstop for half an hour. I find out it's because my Gmail account is associated with both my personal one and an enterprise one. And they say, sorry you can't use that anymore to log into the application loader, go create a new apple id. So I go create another like yeah it's brand new and Johan, hey stop here cause Frank: 32:27 this is wholly new to me. That's this very unfortunate because you kind of just recited my nightmare in that I would lose control of my apple id because I do not thoroughly understand. I'll be honest here how apple James: 32:40 associates sales of my app with giving me money. And I'm always afraid that that little critical link is going to get destroyed somehow. So the moment you say something like, I made a new APP id, I'm like well there it goes. All my money. I'm impoverished now. So you just kind of scared me. But it wasn't as bad as it sounds. No, no, no. See you create another app id and what you do then is you invite that a app id to your account and you say this has app permission to create new APP team. Yeah, right. Gotcha. So then I go back to the application loader, I entered that credential, everything's happy, I'm ready to upload. Um, and, and then it says, Hey, you haven't signed this thing. And I'm like, oh, how do I create this thing? It's a, yeah, he's like, this isn't done yet. James: 33:28 So someone goes, you know what you can do, you can skip the application loader and you can do it through the organizer. And I was like, of course apple has a thousand ways to ship this thing to the apps. Or I'll go to the next code organizer, which is a lovely piece of software. So let's be clear why this is even working. It's because you did go through the step of archiving your app. And the neat thing here is in visual studio that actually puts it where x code expects it to be. So it builds the APP and copies it to this kind of central repository on your computer. And that's why x code now has access to it. And x code can reassign it. It can do fancy things to it. Yes, exactly. So I go through the preparing archive. It goes into fetching APP store data and it says, do you want to upload stuff and it says pick your district ship distribution certificate, select your, you know, install thing, which doesn't exist yet. James: 34:25 Select your profile. I select everything but of course I don't have the distribution installer but luckily James, haven't you gotten the hint yet? Like just go get the cert but is this just because it's not documented at all? Like it's still just a big mystery. I couldn't figure out what checkbox to check like I didn't know. I don't know how to do it. I'm in here right now. I don't see Mac installer distribution anywhere in here. I'm puzzled. So luckily when you do this through the archive manager, you say, let me manage it and then there is a plus button to create a new Mac installer distribution for you on your machine and boom, it all happened. It cre x good created it for me. Bingo Bango everything is good and I ship it to the APP store and I'm waiting for review. Woo, congratulations. Now I'm a little bit sad you weren't able to do it all on the San Fran side, but I'm excited that you did get your first Mac out there. You're waiting for review. Uh, and he gets the how the review is going to go James. Well, good thing cause we just got an email right before the podcast are recording that I failed certification. I'll write you failed your raw view Frank: 35:38 wall wall. And I hate to say it, but when you told me that it's like, oh that's great for the show. I'm so excited. Good Work James. So tell us Jay, but you're helping the show. You took one for the team. So we're all going to learn an important lesson today because I was telling you that every, I said, even on the show, every time you submit to an a new APP store, you're going to mess something up. So if we go through whatever you messed up, then everyone's going to learn and we're all get denied for different reasons. Yes. So I didn't read. So here's the problem. I did, I did, I did all the things that I tell people not to do. So a, I didn't do the things that I'm supposed to do. Okay. Which is, you know, read about icons and read about distributing your app and learn about provisioning. Frank: 36:25 I didn't read the documentation because I just didn't want to do it. Frank. I was just being lazy. Um, well, you know, I think there's something to be said for lazy, um, in my Uis that you should always make your Uis work for the laziest person. So I think that there should have just been a giant green button and as long as you click that green button long enough, I think the right things just should have happened. So I'm actually gonna defend you here at James. I think you shouldn't have had to read the manual. No one reads the manual. Nice. Well I am happy because um, so far what I can see is that I may be, okay. So, uh, I didn't break it to us. What'd you do? So I broke two guidelines from apple. So specifically to.one which is performance or, so they say, I don't know what that means. Frank: 37:16 Oh, okay. You know, I like talking about performance though, so we'll have to dig into that. So it says, it says we, yeah, we found one or more bug. This is the performance which doesn't really seem like performance, but says when we reviewed your Mac on our Mac App running Mac os 10 14 three fancy specifically, it receives an error when selecting print or help. Oh, that's not performance. Uh, I know what you did here, James. Okay. For everyone out there, here's a little trouble with file new with Mac apps by default, Mac apps have giant filled out new menus. Your main menu bar that unlike in a winforms APP, you hit file noon, you add a main menu to it, it's blank. The opposite happens on Mac. It has pretty much everything you could possibly need and it, and your job as a developer usually is actually just go through every one of those and go delete all the commands that you don't feel like implementing. Otherwise you got to go through and implement all those. And I don't think your APP needs printing support. James, do you? Uh, I don't believe so. Now I will say when I say my stream time or help, it does say that help isn't available. So that's pretty good. Um, is that helpful? I don't know. You're going to have to read the human interface guidelines for that. So I have like, James: 38:38 I'm on my app and I have like font and there's like all sorts of stuff. Baseline show callers. Uh, they delete everything. I'm so confused. This seems to be the only issue by the way, Frank: 38:49 so, right. So let's, let's go this through, this kind of menu by menu and we'll do this quick way. So everyone is entertained. The file menu we all know is where you open documents, close documents, exit the APP, save things and print things. If your APP doesn't do those, yes. Get rid of all that stuff. Okay, that's easy. The edit menu is actually a little bit trickier because the way Mac works in a way, um, commands are bound in everything. When you are editing and say a text box and you want to hit command a to select all the text that can be handled by the responder system and that's reflected in the menu. So you don't want to delete those menu options even though you're not going to implement say delete for yourself. You want to have delete there for the edit boxes. So in general what I'm saying is you can leave the edit menu alone, just don't touch it. Frank: 39:41 Yeah. Then the, the format and view menus, those are hundred percent app dependent. So you can just delete those puppies if you don't want to implement anything in them or add some actual functionality because this is where you can also do hot key binding and Mac. So if you want to have a global key combination, activate a command, this is where you would do it in the menu. Then the window menu basically don't have to touch that one. The help menu you should refine for your app. And then the last menu, and it's actually the first, it's the one farthest to the left is your app menu. And that's where you have to make sure that you give a good app name and like the quick menu says the right thing and you have preferences or you don't have preferences. So it's really just house cleaning you have to do. James: 40:31 Got It. No this makes sense. Yeah it has a bad name. It's my stream timer. All one word. I don't think that's correct. Uh Yeah I, I do see some stuff they, they seem to also have an issue that under file you could hit close and then it goes away but you can't bring it back. So they did not like that. Frank: 40:50 Oh you have to fix that. Yeah there are very specific ways windows are supposed to behave on Mac. You don't mess with that. Yeah but I guess if I'm going to delete the file menu, right, I could just get rid of that and then they can't close it. No, no you'd never delete the file menu. It's always there. Yeah. So just find something you can put on there. Cause we all have clothes on there. At least command W. Yup. Yup. But then when your app gets focused back and that'll be in your APP delegate, you got to show that window again. That's the thing. See this is the, James: 41:21 the part of a window to graphical user interface on a desktop that varies from a mobile device. I think that we just don't, yes, there's no menu system which is so helpful. I don't need a menu system is go away man. You system but Frank: 41:36 well it's menus and it's windows. It's both of those things. They just don't exist on the on mobile. James: 41:44 Yeah and I'm happy for that and that's why I'm a mobile developer first. But I will say frank, hopefully by next week when we record, I will have my first Mac app in the Mac App store and you too can do it. I feel like anyone can be a Mac developer. Even doing what I did, and this is a fully open source app so people can take a look at it, which I think is cool and frank, you can go and make my app look better if you really want to. Frank: 42:08 I think I'll spend time on my apps. I'm not very giving. Oh, okay. Maybe I'll help you James. Well, that's my Mac. Oh, s story. That's my macro story. What do you think? That's awesome. Usually I'm the Mac person, so that's great that I got to pick your brain and see which parts are easy and hard. I have to fully admit I love APP kit. I think Mac programming is wonderful. It's still not as good as visual basic was back in the day, but it's, it's about as good as life gets. There's just so much builtin. If you take the time to learn it. There are so many controls. It's an ancient operating system at this point. I really it, James: 42:45 I think about redoing it in v two right? Maybe v two is a storyboard action. I mean it wouldn't be that bad. And I already have the Ui, Donna just decide if I want to use it or not. And so what kind of see how it goes. But I'm hoping just to get it out there. I'm happy that all the things worked, you know, it's like, oh our protocol handler's going to work. Like I don't know, I don't know anything about Mack and sure enough they do. And, and luckily 95% of the protocol handler part came over from my, my ios knowledge. So I felt really good developing this APP. And I think if you were coming over from a desktop development, like a WPF using the Xamarin forms stuff in this compatibility Shim that I put it in was actually surprisingly pleasant. And I think even designing in the storyboard designer would have been pleasant to and because all the code, the code behind is the same. And I compile the APP and it's only like five megs and I was like, that's crazy. You know, there's like no images. But it was amazing. It's, I have a ma, it's a mind boggling, frank, here's the eye in two hours now enabled all of my [inaudible] friends to be able to use this application and that's just mind blowing to me. Frank: 43:58 That's pretty awesome. Yeah, and when you put it that way, because I can't wait to give you, I assume this APP's going to cost about a hundred dollars when I give you the hundred dollars free. Now I will say I'm the one downside of Africa is it doesn't have XAML like binding, see or view models won't come in super easy, but we should talk about it. Or we could even do a whole episode because there is a way that you can make your view models show up in storyboards and do binding would just drag and drop and make it really easy on yourself. But we'll save that for another time. I guess. I like James: 44:31 that. Well, if anyone else has a macro s story, let me know. There's quite a few people in the stream that we're very interested in doing macro s development. And you know what? I am now too. I mean, I, I use my Mac, it's sitting right here and I know frank bills, beautiful, lovely Mac applications and maybe I want to build those Mac applications and make them run and everywhere. So if you're doing it right into the show, good emerge conflict out of him or hit us up on Twitter at merge conflict at them. That's literally everywhere we're at. I'm matching is mounted Magno he's at prep, Clara, I'm on Twitter right as their show us your fancy Mac application, uh, and then pink David or now and be like, Hey, I'm really building Mac apps was Xamarin. And then you can let him know and that'd be pretty great. Yeah, we'll see how it goes. Yeah. Found Fun Xamarin forms on the Mac, done to thing to send those prs frank make it happen. But I think it's going to do it for this week's merge conflict. Until next time, I'm James Montemagno Frank: 45:27 And I'm Frank Krueger, thanks for listening.