 Jojo. Take out of the family name Bokira and it's not something you come across. So you can reach me at Gmail. Okay, my Twitter, LinkedIn account will be the same, Jojo Bokira. So you can just search me. Okay, brief back on myself. Can you hear me at the back? Good. Okay, brief back on myself. Okay, I've been doing IT for the past 30 years. 2016, I left IT. I started to become an independent iOS developer because that's one of my dreams for the past 10, 15 years. Okay, so what I'd like to do is share with you my painful experiences and how I've gone through the past really just six to nine months from the idea and into finally launching in the app store. Okay, how do I move to the... Huh? Yeah, doesn't work. Let's say it's from the left palm to the right one. From the left panel. Let's say I'll go to the left panel. Let's say I'll stay at zero. Exit, yeah? Okay. Left panel, just scroll back to the left side. Percent, yeah? No, the left panel. The left panel is right now. Scroll while you're on the left side. Scroll to your first slide from the left panel. No, scroll to your first slide. Yep. Okay. Okay, okay. Scroll, just scroll. Ah, the other way around, sorry. Okay. My apologies. Okay. Before we start, let me... I want to learn more about who you are. Okay. How many of you are developing on the Android platform? Quite significant number. How many are independent app developers, meaning you're a slave to no one? Good. A few. Okay. How many of you have submitted an app in the app store and it's actually live? Wow. That's good news then. Okay. So, a lot of these things, okay, bear with me. How many of you aspire to become an independent app developer? Okay. To be free of the boss? To be financially independent and... Oops. Okay. How many of you are non-technical, are in non-technical roles who are BAs or doing maybe QA, business development? Okay. Okay. So, for this session, what I want to share are what topics and subject areas I had to learn to build my app. Okay. I'm going to share with you some code snippets. Hopefully the code snippets are something you haven't come across in your day-to-day development of iOS apps. Okay. Of course, I've had a lot of headaches and heartaches and next steps in terms of what I plan to do. Okay. Now, let me give you a brief demo of the app that I did and this is not meant to sell. Okay. But just to share with you the... Give you a background, okay, on the app that I did. Okay. It's a sales pipeline tracker. Okay. So, sales pipeline, okay, you can have four stages, ten stages, depending on the sales organization. So, I've simplified it to just four. Okay. So, you have a lead prospect, one, and then lost. Okay. It's tightly integrated with contacts. So, the names that you see here, okay, are from the contacts, device contacts database. Okay. On the top left corner, you can see that I've actually have more than 10,000 records and contacts. Okay. So, you have the contacts view. Okay. Clicking on the segmented control. Okay. You can see who your leads are, the one, okay, who the pin contacts are. Okay. Activities, of course, sales is all about doing activities. So, you can keep track of activities at specific to a stage. Okay. The other main module is what I call the dashboards. Okay. So, given the contacts, it tells you, okay, how many contacts you have in the value stages. It shows you the aging of the contacts. For example, if a contact has been in the prospect stage for 60 days, might as well call him or delete him or perch him from that stage. Okay. You can have a list of activities. Okay. As many of the activities. And, of course, you can have the revenues as well. Meaning, how much have you earned for the values of sales opportunities. Okay. So, given that, okay, let me switch back to the slide. So, first is we got to start with an idea. Okay. Now, if you look around you, there's actually a lot of ideas. Okay. For example, okay. Okay. My target market are SMEs. Why? Because SMEs are underserved. Okay. Many, let's say, retail small shop. Okay. And then just observe the cashier. Okay. Or the help person there. Okay. How do they normally order their supplies from the supplier? They probably call. They probably SMS. They text. Okay. They vibrate. What's up. They email. They probably even fax. Right now. Imagine you're the supplier. You're getting various orders from different channels. Okay. So, observe around you. Ideas will come up. Okay. That's just one example. Okay. You have to think, okay, what is the pain point? Okay. Will this up? Solve. Okay. What are the functions? Okay. Going back to my example. Okay. So, at the end of the day. Okay. All those, imagine that the shop has an app to capture all the orders. So, at the end of the day. Okay. They can be consolidated. They can be consolidated. And then maybe an approval process to go by. Okay. Now, everyone has a device. The point is, okay, what else can we use a device for? Now, you're all in IT, right? Okay. Who uses the app? Who uses their device to fill up a timesheet? Timesheet. You feel timesheets? No one fills timesheets. Okay, fine. Okay. Okay. So, you have to think about what does the app actually do. Okay. Now, does the app complement the existing business model? Now, if you look at Uber and those sharing ride services. Okay. I mean, the app is critical. Okay. To the business model. Without the app, then they die. Okay. One recent app I came across is O-Bike. O that bike. Okay. So, I saw a few bikes in one of the bus stops. And then I went by and see. And then I saw that it's a bike for hire. Okay. So, you ride, you download the app. Okay. You scan the QR code and then it'll open up and then you use it. And then I think it's so many dollars per minute. Okay. I don't think it's on a per distance basis. Okay. Now, you have to to define who your target audience is. Okay. And why is this important? Okay. Now, if your app is targeted toward companies. Okay. It's much more difficult to sell things to big companies if you're an independent. Why? Because as an independent, you're small. You cannot scale. Okay. Your quality, reliability of the product might be might be questioned. Okay. And then, how do you monetize it? Meaning, how do you earn money? Is it one-time download? Okay. Or is it a free app wherein you earn via ads? Okay. Is it a will you follow a subscription model? Okay. Good news since September. Okay. Apple has relaxed subscription subscription guidelines. Before subscription, you can only do subscription if you're offering a recurring monthly service. For example, you have a cloud. Okay. You have a back-end service. Okay. The client needs to connect to it. Nowadays, even if your app is purely local to the device, I mean, Apple will still grant you that subscription option. Okay. Is it on a per user, per user, per transaction basis? I mean, you have to figure this out at the start. I mean, while thinking of what that app idea is. You don't have to decide because you would want to get feedback on all these ideas. But at least jack them down so that you know that these are the options that I'm considering. Okay. Think local. Think global. Why? Okay. We're all in Singapore. Okay. So in Singapore, we know or we feel what's being needed. Okay. But then, whatever app you put in the app store, that's worldwide. Okay. Meaning, okay, internationalization. Okay. That becomes very, very critical. Okay. Okay. Next, next set of slides. Okay. So I'll walk you through the areas that I had to teach myself. Yeah. Okay. First one is SWIFT. When I started out, so I found out that you have all these options to develop an iOS app. Okay. Now, I was fortunate enough last year that SWIFT SWIFT was in 2.0, 2.2, and eventually 2.3. So it was stable at that point. Okay. Now, of course, from 2.3 to 3, it's become unstable in a way because of code breaking, source code breaking changes. Okay. Now, why am I thankful about SWIFT? Okay. One, it's type safe. Okay. Meaning, okay, if you're using other languages, okay, it'll be such hours are very difficult to find. Okay. It's a very safe language that you have to use in that regard. Okay. It's easy to learn. Okay. There are simple programming constructs that you learn that you can use, that you can apply, but then as you get to get to build experience, you can go, you can go on to the more esoteric programming constructs. Okay. Reaching programming constructs, okay, you must read the human interface guidelines. Okay. When I was thinking about the user interface, okay, I finally decided or it dawned on me what a navigation bar is, what a tool bar is, what a tab bar is, after I've read the Higgs several times. Okay. There are simple programming constructs that you can okay. There are subtle differences between certain controls, for example, when they use the slider, the stepper, or even the switch. Okay. But then again, okay, if you read the Higgs, okay, it'll tell you, it'll give you guidelines on which one to use. Okay. Dynamic type. Dynamic type is, instead of using the system font, I suggest you use dynamic type. What this means is that in the settings accessibility, okay, if let's say I'm a poor eyesight 10, 20 years from now, okay, then I can enlarge the fonts, okay, from the settings, then therefore, my app, okay, the fonts will automatically change. Okay, but if you use the non-dynamic type, I mean, if you set it as 10, 12, 14, I mean, it'll stay that way. Okay. Okay. Mobile UI is not the same as the desktop UI, it's not the same as any web-based application. Okay. So this was hard for me because this was my first time doing an app. Okay. Now, my first test device was an iPad. Okay. So, so things were working in the iPad, but when I switched to iPhone as my test device, certain views were misbehaving. Okay. So there are differences between the two devices. Okay. Programming paradigms. Okay. You have protocol-oriented programming. Okay. You have protocol-oriented programming which is really interfaces if you come from the Java world. Okay. It's programming by contract. Okay. Functional okay. Programming is coming into play which and the main benefit is things become declarative rather than specifying the steps to execute, to accomplish the computation. Okay. You declare how it's gonna be done. Okay. Lately it's reactive. It's been gaining ground. Okay. And the main problem reactive attempts to solve this if you have MVC, okay. If the UI change, it goes to the controller, it goes to the model. Right. I mean, that's pretty much standard. The problem is, okay, what if the model change? How do you propagate the changes to the front end? Okay. So that's reactive programming attempts to address. Okay. Of course, if you have services behind on the server, okay. Currently, okay, the main approach is to define web services and communication is primarily JSON. Okay. Then again, that's another thing you have to consider if you are building services on the back end. Okay. Of course, patterns. You have MVC genetics. Okay. Genetics is simple. I mean, when you read it, it's easy. The concept is easy, but how to implement it can be complicated. Okay. In fact, in my code, okay, I know certain things could have been implemented using genetics, but I wasn't able to. So, okay, fine. I'll implement it the brute force way. Okay. I have several versions of the same thing for different data types. I'll fix it later. A very elegant way to add functionality to existing classes. And in my app, I've used it in a lot of ways. Okay. Now, what I learned, okay, be practical. Okay. Do not do something or implement something until you think, you believe, you understand it and you know it very well. Okay. For example, in certain areas I did and I know, I'm not. I mean, I made explicit the decision, okay, not to do functional approach in certain areas. Okay. What you haven't done will haunt, will burn you later on. Okay. For example, there was one, one section in the app put in, I was holding off on displaying a progress indicator because in all my test, even with 10,000 records, thousands of activities, I mean, I didn't need, I didn't need a progress indicator. Okay. But then, but then someone when I did my beta test, okay, someone had 10,000, someone had this test case and then he showed me, Joe, it's taking some time. So I had to put it in. Okay. Okay. iOS frameworks, code patterns. What I have to learn from my apps are contacts and the event kit, which is for the calendar. Okay. So if, if, for example, although the app can update, allow you to update contacts, you can also update contacts using the iOS contacts facility. So if the contacts, if the device contacts change, therefore, it must be synced. Okay. So that's one of the things that I had to understand in the contacts framework. Message, okay. This app allows you to do mail and send SMS. One of the more difficult things in iOS development is target and receipt validation. Who has done receipt validation? Okay. So, okay. So I read about target and receipt validation and the underpinings of it. Okay. To read the data, to read the receipt. Okay. You have to, you have this ASN1 format. Okay. But to get to that ASN format, you have to go through hoops to read it. Okay. Now, the sample or the articles I've had were in objective C or C++ or C. Okay. And I really couldn't, I couldn't understand what was happening. Okay. Now, fortunately about a month later, okay, there was an article that I read, okay, which offered an open source library that encapsulates all these receipt validation. Okay. Checking whether the subscription given the date is valid and so on and so forth. Okay. So, just to warn you, okay, if you go, get into in-app purchases, when you offer subscriptions, okay, receipt validation and providing the in-app products, okay, those are two things that are, I mean, at least for me, much more difficult to look at. Okay. Dispatch queues and background processing, one of the crashes I had after I submitted the app for review is that they told me that, okay, your app is crashing when we switch over to an IPv6 network. And I said, can't be. I mean, my app, everything is local to the device. Only when you're accessing apps or maybe when you're renewing subscription, maybe that's the only time. Okay, but they just said, sorry, I mean, IPv6 is, but I'm not coded anything on the network. Okay. So, so they said, okay, give us three days we'll call you back. I mean, the usual response, and I said, man, if I wait three days, okay, then I lose three days. So what I did, okay, I, let me go through that, yeah. What I did was, okay, I researched again, Google, whatever, okay, and I found out that, okay, it's IPv6 or whatever reason they give you is not really the real cost, root cost. Okay, now, you see this address? 8BAD, F00D, you read it as 8 bad food. And Apple apparently has a lot of those. If you Google, Apple has, has those mnemonics, okay, that indicate, okay, you an idea of what the root cost is. And what I found out was, okay, these are the possible errors. Okay, now, they sent me four crash logs, okay, and the interval between the crash logs was less than a minute. Okay, so they couldn't have, I mean, even an automated testing, I mean, I'm sorry, couldn't have done four, four rounds of tests in such a short time, yeah, okay. So I looked at the gold in, I was hitting, I was doing a lengthy processing using the main UI thread. Okay. And again, in my tests, okay, even I have so much data, I wasn't hitting any performance issues. Okay, so the moral there was, okay, if you're going to do, if you have any lengthy operation, okay, make sure you do it on a background thread. Okay. Go back. Localization. Okay. As I said, yes. Sure. Referring to the... One of those four causes. Yeah. But it doesn't mean that it's always the code. Correct. Correct. You really have to figure out. You really have to look at your code and exactly where. And in some cases, project, okay, what's really happening behind the scenes. Okay. And if you, if you write, I mean, another incident related to that. When I did my beta, okay, one of my, one of my beta testers, fortunately, he's in Singapore. Okay, he said, Joe, I've downloaded it. It's crashing. Okay, so I said, fine, okay, I'll see you. Okay, so I saw him the next day. Okay, so what happens is the first time you run the app, okay, it reads all the contacts, okay, to be able to display 2000. Okay, so around the 2005 mark, okay, the app was being terminated by iOS. So iOS has a watchdog that I believe it's 90 seconds. Okay, if an app is hogging the CPU in 90 seconds, you'll trash it. So two things I learned, okay, don't have the CPU in second is any lengthy operation, do it in the background. Don't wait for apps or to tell you that it's crashing. Okay, now from a learning perspective again, okay, I had to take the time and the patience to learn, okay, contacts framework, for example, okay, now contacts if you know, you can synchronize with Yahoo, Google, iCloud, whatever, okay, now, one question I had this, okay, so how do I uniquely identify a contact? I know, okay, but what I'm saying is you have to test this to be comfortable, to be confident that whatever use case or test cases you have moving forward, you would have taken care of. Okay, and I had to resign if it takes me 10 times longer, so be it. Okay, third-party libraries, okay, I primarily use three libraries, realm for the database, iOS charts and presenter, iOS charts for the charts that you show, the dashboard, okay, now, okay, if you haven't, I suggest you go to the realm that IO website, okay, it's probably the, if not yet, okay, it's gonna, I think it's gonna be the most dominant mobile database, okay, last year, okay, I started studying core data because if you want to do iOS programming, I mean, database can only be okay, SKLI or core data as the ORF, yeah. After two weeks of learning it, reading, okay, I wasn't, I wasn't even able to put code, to write any code to understand what is it. I watched online tutorials, I gave up, okay, I was just fortunate that realm, I mean, to come across realm, okay, and the beauty of realm, at least for my part are two things, okay, the object is the data. Whatever changes automatically on the data, it is zero copy, okay, the normal way we're in from the UI we store into host variables and then we write into the database, okay, you don't need host variables, okay, so you write directly, you update the object directly, the database gets updated. Now, from a, in a benefit, from a benefit's perspective, suddenly, database side, the coding for database side, ceases could be an issue for me. Okay, in fact, it's probably the least amount of, I mean, one of the areas where I spent less amount of time, okay, but we have to stress test, okay, so what I did was I created a million activities, okay, and then I tried summarizing a million activities because it's not SQL, okay, there's no group by, activities, a million records, group by, by date, by type, okay, by status, okay, all three took about a second. So I said what I did that, okay, should be okay. Okay, X coding its tools, okay, of course IDE interface builder, okay, I prefer drawing the interface rather than coding the interface, especially the constraints, okay, although interface builder has quirks, okay, there was a long time Marine, I had a navigation controller so a navigation controller is actually blank, empty, okay, kept telling me warning, kept giving me warning and I said I didn't do anything on that navigation controller, just paste that in, but it was giving me warning, okay, finally I did something that I can't figure out right now pinpoint and disappeared, of course git, okay, on the X code, okay, you really can't use the full, all of git's features functionality, so in that way you're Hubble, but you can go to the command line, okay, to do whatever git commands that you need to do, instruments, okay, just one area in case you're having performance problems, battery problems, okay, okay, build settings, the reason why I pointed this out is when I was so the CP wasn't lighting up, okay, I mean it was just it won't even hit one bar, okay, and I found a story we're in, okay, there seems to be a bug in the Swift part of X code, or LLVM, we're in, even though you have so many cores, okay, it just uses one, okay, so I did my benchmark and rightly so, okay, it got to one minute, 20 seconds, okay, learn to use what is required and necessary at that stage in time, I mean, I mentioned instruments but I have not had the urgency to use instruments, okay, one part, another part is creative, what is creative important, okay, when your potential customers are in the app store, what's the first thing they see? The app icon. After they see the app icon, they see? Screenshots and then they probably expand the description. If they don't expand the description, that means you only have four, they probably see four or five lines. So what that means is, okay, these things, okay, that are part, that are inherent to your application, okay, you must focus attention on, okay, somebody said that, okay fine, I mean, you've got to market it now. I believe you are all technical people here, but there's one who believes in business development, but I mean, marketing is in our, we don't do it, okay, okay, be prepared to learn tools if necessary, let's say you don't have enough funding. So I had to cover up my own app icon, okay, generate my icons using the correct dimensions, okay, I had to find a site, I mean, I'm using FreePick right now, I mean, no plugging here, but that's the provider I'm using right now, okay, I had to learn Camtasia to record videos, okay, copywriting, so this is where writing the description is. Now, privacy statement is required. And again, oh yeah, yeah, okay, so these are some of the things on copywriting, this yourself, although you have lots of templates, okay, marketing, okay, app store optimization, this is a combination of keywords, okay, the app icon on how you make a potential customer download your app, okay, if you want to push customers to your app, okay, then you probably have your own website, yeah, okay, now, find the audience for your app. If for example, okay, download your app, do not be disheartened, okay, you thought of it, okay, I mean, that idea, you know, causes pain to someone, will be there, yeah, okay, I was planning to share some of these snippets with you, okay, but one thing I'd like to, I guess highlight this, this static table view, okay, I have several forms, okay, and I used static table views for the UI of those forms. Instead of using a blank page, okay, it'll be part of the presentation that I have, okay, heart x, okay, I guess plan for at least a month for app store review. I mean, that's one thing you can't control, okay, do better testing because if you read the blogs, okay, a crash will cause a rejection, okay, it's very, very important to identify the crash, okay, okay, obey app store in the interest of time, do not argue with them, most likely you will lose, okay, I mean, I tried, okay, one thing here is you thought of an app, but iPhone is such a small segment of the universal devices. If you really want to, if you want to be more successful and you would have to tackle the Android platform, okay, my next steps, okay, my first version of my app is local to the device, okay, I need to learn the mobile platform, okay, mob kit geolocation, I guess one thing I haven't done is analytics, okay, so meaning keeping track of what the user, keeping track of what the user is doing, is he on this function, is he, is he taking him 10 minutes on one particular page, so on and so forth. Okay, so that's one thing I haven't done yet. Okay, I've exceeded my time. Okay, any question? I mean, I'll say around after the, yep, okay, my, when I started this, okay, one thing I didn't want to do is upload to the app store and pray all day. So, so what I did was I had a few ideas, okay, for this, for this app, I actually met around eight salesman, okay. A few of them are sales agents, financial advisors, three real estate agents and then two or three of them doing direct marketing. I mean, again, not to plug, but USANA, those things, okay. And two questions I asked them at the end of the concept, presenting the concept. Okay, are you using anything? What do you use right now? And, and the answer they gave me was, I use Excel and notes, notebook. Of course, and then the second question was, okay, then do you think an app that has this functions, okay, would be a benefit to you? And of course, the answer was just because I mean, anything, I mean, if you, if you keep, if you've experienced keeping track of data in Excel, okay, once you get to 100 clients, I mean, you're dead. Okay, I mean, he has maybe, what, tons of columns because he was keeping track of all columns of all product, of all products, of all funds that his customers invested in. And you can't do any analysis on that. Okay, so at least I know I have a potential market. Now, of course, whatever they buy it or not, I mean, that's a different issue. Okay, so that's, that's maybe the question to ask, okay, the potential market, okay, what are they using right now? Are they happy with what they're using right now? How much of a pain is it? Okay, any next question? But do you have prepared any analytics for you? Not yet, but I mean, that's, that's going to be the next step. I mean, again, I had to, in one of the slides, okay, it says, be practical, release first. Okay, if, I mean, you know, when you talk to the users, I mean, they have, they never run out of requirements, but what do we have to do? We have a baseline. So that's, that's what I have to tell myself as much as I want this because I know the value of this feature, but I got to control myself and stop. Okay. Anything else? Good. Thank you very much. You've been a very kind.