Everyone thinks that having an app in the AppStore makes you a millionaire, but it's not true. Most developers make less than $500/mo on their own apps. You will learn how you can control your success in the AppStore, how to monetize your apps successfully and the things you need to do to make your apps successful.
My first experiment under Apple's new price scheduling changes just completed and I have some good results. For those of you who didn't notice this, Apple has updated their interface for scheduling pricing changes in a way that the shortest pricing change must be two days. So I used to schedule a paid day beginning on Monday and Tuesday being free, but now it has to be Monday to Wednesday.
Because of this my apps are spending more time in the paid category so my total downloads for the month are down from 16k to 14k. My total paid downloads however doubled. My sales went from $600 to $1040 which is amazing but also somewhat expected. (Remember I am tracking gross sales in the AppStore so this includes the 30% Apple Tax)
This proves two things to me: 1) I was totally wrong in thinking people wouldn't pay for apps 2) Cycling your pricing is a requirement for an independent app developer with zero marketing dollars.
I was also on track to have my biggest AdMob month ever but then my Android app was demonetized for some navigation issue that I can't find and of course AdMob/Google will not explain. So I wrapped up the month $40 lower than last month for ads ending at $167.
In an effort to see how I could improve my user interaction and generate more ad revenue I have been experimenting with chat bots. Initially I created one script for a bot, then expanded to have the bot leave and come back as a 'new' person. It says general things and responds from time to time as well. So far I have seen some success.
I then decided that it would be a good idea to add some mystery to these new users by having a few cryptic messages mixed in with the goal or trying to bring back a rock star chat user that seems to have left. If that user does come back there will be a buzz from the other users to greet them.
This has since evolved. I have been doing some research on augmented reality games (ARGs) and they are fascinating. I'm now working on a script for my new chat characters that I will release all at once on my users hopefully triggering a rabbit hole effect that will help drive the game and the user's interacting in the chat. I'm building this in a way that will allow me to revise and reuse this in the future if this becomes popular. So far in my testing the chat bots are driving my ad revenue up as much as $6/day.
One of my recent experiments was to try to determine if a specific day of the week being a paid day for my apps would produce better results overall. As it turns out I have some results and proof of how important it is to cycle your pricing in the AppStore.
At the end of 2019 I was setting one paid day per week and moving that day across the days of the week every few weeks to see how things changed. In January I resumed my cycle of Mondays and Thursdays being paid. Given that information, take a look at this chart:
You can see how fast my downloads were growing prior to the single day per week experiments and how fast they spiked again once I resumed the two paid days per week cycle. I would suggest that you spike your pricing as often as possible to get the greatest growth in your audience that you can.
Another thing that has changed is the way Apple allows you to set your pricing changes. I've noticed that I can no longer set Tier 1 for Monday and Tier 0 for Tuesday. Now you have to have a full day of a Tier before you can switch back. This should be interesting and I'm thinking that this has to do with others figuring out this pattern of behavior as well.
My new pricing cycle is to set Sunday as the beginning of my paid day, Tuesday as the end (covering Monday), then Wednesday as another beginning and Friday as an end (covering Thursday). I don't know if this change in scheduling is simply cosmetic, meaning that it is more reflective of the behavior in the store itself, or if this change will cause my app to appear in each tier for more than a single day. I will give more details as my results come back.
As you know I've been cycling my pricing for the AppStore (Apple's, Google Play doesn't allow this) and my results are showing that my paid downloads are out-pacing my ad revenue by almost 300%.
June was a record ad-revenue month for me. I earned $208 on the month in ad-revenue which is a HUGE win given that I've spent probably 30 min on a simple upgrade on a single app this month. My paid downloads however generated $594, bringing my monthly total to $802. (Keep in mind that I'm tracking 'sales' not 'revenue' so Apple is still going to grab 30% of the sales total but 'sales' is a better measure for my analysis.)
In all of the experiments that I've done, price cycling has produced the best results by far. Second in importance has been strategic review requests followed closely by scheduled push notifications. You just can't expect an app to do well if you aren't participating in it's AppStore experience.
If you are not doing these things yet, go schedule some price changes now. Set your cycles for one or two weeks so you can see how things behave. Once you have that set, find one or more notifications that you can schedule for the same period of time. If you aren't pushing the buttons the income from your apps just won't happen at all.
A few years ago when I really stared focusing on how to monetize my apps I ran with the idea that only 20% of users would pay for an ad-free version. This came from an article in Forbes that found that roughly 14% of users were willing to pay to remove ads. (link) So with that in mind I decided to focus on the 80% that were willing to put up with ads and so far that strategy has done fairly well.
Now two months into my experiment with a "Free" Ad-Free model I have discovered a very different picture. From my analytics I can tell the total number of users across a month and how many are my reward (or ad-free) users. Here are my results:
I want to point out that in both Ghost SLS and Ghost Chat the feature if extremely prominent while in GhostTalk the feature is hidden in the 'info' section of the app with the dependency credits.
In all three cases I am seeing roughly 2% of users that are willing to go ad-free. I know from watching my users interact that they are probably 15-30 years old but I don't have any hard evidence for their ages because I don't ask for or track that information.
Keeping in mind that the feature is actually 'free' I would estimate that very few users would opt out after learning the details of the feature. This isn't something I am going to spend any time to discover though because it's not really the goal.
Realizing that around 2% of my users take the ad-free option and the other 98% either don't care or avoid it assuming it's a paid feature, I am fairly confident now that I am maximizing my ad monetization for these apps. Remember that reward ads pay roughly 4x what a normal banner ad pays, so the users that get ad-free are delivering the equivalent of 4 ad taps for the ad-free benefits.
I really thought this percentage would be much higher and would lead to the app being primarily ad-free for the active users because they would spend 30 seconds every X days to hide the other ads.
It's also curious that the users have never mentioned this feature to other users in the chat. It's almost like an advanced form of ad-blindness where users instinctively avoid tapping ads, but if it happens they also instinctively close the ads and return to the app.
This is interesting, I'll let you know if my numbers change over time.
I have been running a test of an Ad Free feature in my Ghost apps for the past two months and the results are very interesting. First of all I bypassed Apple's 30% fee by not using an in-app purchase model. Instead users qualify for AdFree by watching a 30 second Reward Ad.
This resulted in a rejection of one of my apps for not submitting the in-app purchase, which proves that the reviewer didn't really look at the feature at all. (I save all of my conversations about app rejections now because I think they may come in handy down the road, and because most are so absurd that I don't think people would believe me.) This one was resolved by pointing out that the feature was not an in-app purchase.
The reason for the 30 second Reward Ad is simple, it pays at least 4x what a normal ad pays and the user doesn't have to leave the app. So instead of $0.002 per add tap, I get $0.008 and the user gets ad-free for one month. I did this because I get a few hundred downloads per day so if all of my users did this we would all be happy.
Oddly enough, even with the feature being free, I still only get a small number of users taking advantage of it. In fact, for Ghost SLS, I made it a prominent button on the screen and it still is a feature that most users avoid. The other thing I found odd was that none of the users that do discover this feature tell the other users about it.
I may add a value to my web socket so I can see if a user is running ad-free or not. I'm curious to see if my power users are the ones that discovered it or if it is a different set of users.
Not long ago I decided to switch all of my chat platforms over to a simple web socket setup and away from Google's real time database. The reason was that the 'real time' part actually wasn't and there was no way to get an accurate count of users on the system.
Now it's simple, when someone connects or disconnects to my socket I send out the user count to everyone subscribed. Messages are filtered and relayed instantly, I can let people know that someone is typing and on and on. Web sockets are amazing!
But even better, I want to share what I put together for myself so I could moderate the chats and notify myself of events like 'user clicked on ad'. This is my AppleTV (below)
Rogue Traveler is not yet set up on the web socket which is why it doesn't have a count but the other 5 are. From here I can pick a user's name with my remote and warn, reward or ban them from the chat. I can also delete messages. So basically I can moderate all of my chats from my couch.
The chats themselves are more active at night but as you can see the ad clicks are coming through nicely. This happens to be just after a scheduled notification was sent out inviting all of my users to join the chat while watching a hyped ghost show on the Travel Channel.
Notifications are POWER! It's worth your time to research and come up with a notification strategy for the next month and schedule those things at the same time you schedule your pricing cycle.
My goal for this simple app is to have my TV sound like a Vegas casino! So this week I am going to refine my notification plan for all of my apps for the next month, add the web socket to more apps even if they don't include a chat and build out the schedules for next month.
I had to share this with you guys. It's a result of my quarantine 'cabin fever' and I hope you will find it as funny as I do, but I released my first album. It's what I call "Coder Rap" and it's available on all of your favorite music platforms. (Apple Music, Spotify, etc.)
After spending the past two years trying to figure this out I have finally come to the conclusion that you can fully manipulate the AppStore and your success in it. What you have to realize is that some of the moving parts are not in the AppStore itself but within your app.
This is what I found in my research:
Factors for ranking in the AppStore are
Things you can control
I know you want to stop me right there and say, "Wait, I have no control over my downloads and sales. And reviews are fully in the hands of the users." Yeah, but I showed you last week how you can manipulate your sales and downloads. Reviews are easy too, let me explain.
If you are using Firebase in your apps, and you should, you can see the average amount of time a user spends in your app. Assuming that this is a factor that is related to how much your users like your app, doesn't it make sense to request reviews from the group that spends the most time in your app? So requesting reviews at a time greater than the average time spend in the app means that you are requesting reviews from users that are happier with your app. Therefore you can manipulate the app reviews in the AppStore.
You can change this at any time
You can schedule changes
You can be expensive or even free
People use apps that they like
People use apps that are engaging
Push notifications bring people back to your app
Engaging with push notifications increases your usage
People respond to the in-app reviews
People think their opinion must be heard
If you ask for reviews you will get them and it will make a difference in your AppStore success
most people download free apps
when apps go free they get a spike in downloads
you control your app’s pricing therefore you control your downloads
People will pay for apps that their friends use
People will buy apps with convincing reviews
People are more likely to buy apps that they hear about more than once
You control these three parts (Usage, Reviews, Downloads)
You also control the price, so therefore you also control your sales
Those are the factors involved. You control all five of them. In theory you only have to do three things to get things moving.
1. Set your price cycle 2. Schedule some notifications 3. Set your review request to appear after the average time spent in app
Hopefully this gives you some work to do over the weekend. Print this out and stick it to your wall if you need to, and if you know any developers who could use some help please send them over. My goal is to support the Independent Developers who are not enjoying the freedom they expected from having apps in the AppStore.
Recently I abandoned some of my pricing experiments and just decided that a single paid day every few days was the pattern I was going to set for all of my apps. My paid days are Monday and Thursday.
I chose Monday because I want my users to tell their friends about the app over the weekend and possibly get a sale on Monday. Thursdays were simply because I know the download spike ends after 3 days so being paid on Thursday will give me a spike just before the weekend.
I've actually been doing this now for two months and this is what my download chart looks like each month:
This is the corresponding sales chart from the app store:
So I think I have now proven that you need to cycle your pricing in the store. Also, notice in the original chart how I have 13k downloads in May. When I started tracking all of this data, GhostTalk had 500 downloads. Currently GhostTalk has over 93k downloads.
When I launched my second ghost app, Ghost SLS, I used Push Notifications to notify all of my current GhostTalk users and after two and a half months in the store Ghost SLS has a total of 15.9k downloads. That's a nice kickstart!
The shocking thing to me is that this generated paid downloads. I still can't really believe it, but you can clearly see that it works. Even my less popular apps benefit from this and have seen some slow growth.
So the key takeaway this week is that you need to cycle your pricing. Schedule it at the end of each month for the upcoming month. It's a simple thing to do and it's a 'fire and forget' type of process.
Given the tools that Firebase and AdMob provide it looks like for now the only solution for generating money with Apps is price fluctuation in the AppStore and Google’s ad platform. That being said, I just bookmarked 4 more platforms that I am going to try in my apps that are not performing as well. StartApp, ChartBoost, AdColony and Media.net. Probably in that order based on the initial pitch of their websites.
I looked at a few more but was unable to determine if they had a publisher platform or I just didn’t care to try to decode their cryptic product names to find it. This is the same reason that I won’t use AWS for anything.
Quick SEO tip for AdPlatforms. If you have a publisher platform, the link text should be “Publisher” or at least “Developers”. Capitalize it because it’s easier to read. By doing this simple thing you will see your traffic to that section of your site go WAY up. Trying to be cute by calling it ‘Encapsulate’ or whatever other clever thing you think of is like putting a “Closed” sign on your business. If you don’t agree you are probably the type of person who has a sign that says “Eat” in your kitchen.
Funny enough in exploring StartApp I discovered that they have an affiliate program. So if you join use this link: https://ourbigadventure.com/startapp and after you earn $250 through them you get a bonus $50 and I get some money too. We both win. :) Then you can refer your friends and we can get the MLM model working for us.
Ok, backing out on the promise to test AdColony and Media.net and I want to explain why. AdColony requires me to ‘contact them’ to get started as a publisher. That suggests to me that they either have a fee or want to review my platforms first and we already covered how well that goes with the affiliate reviews. So no thanks. Media.net wants my website, email and phone number to “Get Started Today”. Why do they need my phone number? I’m assuming there is a sales call in involved so no thanks. That leaves me with StartApp and ChartBoost.
The thing about apps that are no good is that they won’t generate much ad revenue anyway. Especially at less than a cent per click. So why bother filtering them when they will filter themselves. And I’m spending enough time on my apps, time is money, and I shouldn’t have to pay to show ads to my users. Honestly I think those ad platforms should pay me a base fee to be on my app and also pay me the per click fee.
So here’s the plan. I’m going to test the reward ad model first. Then I’m going to use the reward model on Animal Analysis with all three platforms in the app. I’ll use the Firebase remote config to allow me to switch reward platforms without sending a new build. Then for the next three months I will keep everything about Animal Analysis the same except the reward ad network. That will give me a full month on each platform so I can determine which one generates the most income. Of course I’ll report on the results.
* When I wrote this I had no idea that I had already tested StartApp and Media.net. After I tested them again, I abandoned them again for the same reasons, they were cumbersome to set up and their dashboards offered very little value.
Affiliate marketing also seems to be a complete fail. Nearly all of my affiliate programs from Fast Fashion dropped me without any notice so my links to their products were no longer working. Because of that I pulled the app from the store. I may reuse the interface at some point but for now it’s scrapped.
For the GhostStop I have delivered 14,254 visitors and earned $1 in commission. I’ll put that on them for not closing the deal when I send someone over, but I’m still leaving their content in my apps because I think it is relevant to what my users are interested in, and they haven’t dropped me from the program.
I’m still disappointed that I couldn’t make the eBay app work, that would have been a nice idea. Generating thousands of apps for eBay categories would have been nice. I don’t think it would have become a massive sales generator but it would have been nice to see how that idea performed. It’s irritating when AppStore Review shuts you down without giving you a chance. It’s even more irritating that you have to put in some time and effort to get to the point of App Review before they notify you that you’ve wasted your time.
I released my new app to the store and used push notifications to my GhostTalk users to promote it. Within a week it was seeing the same traffic as GhostTalk and was out performing it for ad revenue. The new app is Ghost SLS and uses Machine Learning to identify humanoid figures on the camera feed. It’s similar to what a Kinect camera can do but without the laser grid.
After nearly a month in the store I wanted to see my stats and this is what I found:
The first thing I noticed is that I’m displaying 90k ads to my users but I’m only earning $163. That’s 1/10 of a cent per ad display. If I was getting $0.02/display I would be making $1800 and that seems much more fair to me. So maybe I can optimize the ads a bit.
My idea is to try an ad-free model. But instead of asking users to pay $0.99 for that, I’m going to show them a ‘reward’ ad instead and let them earn a month of no other ads. This is a test though so I’m only doing it with one app, GhostTalk.
The reward ads are a full 30 seconds and you have to watch the entire thing to get the reward. I’m hoping that by doing this my earnings per ad display will go way up. I’m also hoping that those reward ads pay much more and that makes my earnings improve as well.
Looking at my RPM (Revenue per 1000 impressions) on GhostTalk only, my highest earning app, I can see that AdMob estimates $2.11 earned. That’s $0.002 per user which is horrible. So far without promotion I have 3 reward users which are people who have watched the 30 second video to get ad free in the app. The Observed eCPM (Effective earnings per 1000 impressions) is $16.61. That’s $0.016 per user which is 8x the earnings for ads only.
So less than a week into this experiment I may have some evidence that using reward ads to enable ad free is a good option. If that’s the case after some good traffic and promotion of the feature then it may be worth promoting the feature more prominently in the app and possibly playing with the duration of the ad-free period. If the app is making $60/month now in ad revenue then with the reward model it should jump to $480/month and I already know that two paid days a week in the AppStore generates about $200/month so expecting $600/month on this one app doesn’t seem unreasonable. Now I just need about 100 more apps like this.
I created a new app, this one is basically a clone of GhostTalk but instead of speech to text I am using CoreML to draw human figures over a camera feed to emulate the Kinect SLS cameras that are the new thing in Ghost Hunting. It’s called Ghost SLS. It got rejected on first submission and for the same reason that the ghost overlays were rejected for GhostTalk in the past. Section 1.1.6: “Trick or joke functionality” and the screenshot was this:
So my scene setter into the app is an issue but it wasn’t for the other two apps that use the same screen. My response was this:
“I’m confused about 1.1.6. The screenshot provided shows the ‘liability screen’ which is intended to define the ‘horror theme’ of the app. Can you explain what part of the app is considered a trick or a joke?”
And just like that, the 1.1.6 issue was resolved. Weird right? So from now on my reaction to getting rejected is just to realize that it may be subjective and if it seems ridiculous, it’s best to just ask for clarification.
I am going to set up quick application for my phone (because that’s what I do) to allow me to schedule notifications to be sent to each of my apps. The reason I am creating my own is so I can repeat notifications at intervals. I also want to create a set of ‘stock notifications’ that can be used randomly at intervals.
The reason behind this new tool is to allow me to set up experiments that run against my user engagement variable. By testing how often I interact with users and watching my advertising revenue as a measure, I should be able to determine a range of contact that impacts my revenue from advertising. So now I will have two test platforms to use. If there was an API for the AppStore to allow me to update my pricing I could build that into this application as well. For now I’ll stick with the only option, Apple’s web interface.
To build this new tool I have two options. I can build my own REST API to allow me to store and send push notifications with a simple script and a crontab, or I can use the Firebase Management API. Because all of my apps use Firebase, I am going to store and manage my notifications on my device and use the Firebase Management API to handle the delivery. I’m basically building a much simpler UI that will allow me to handle push notifications for all of my apps at once.
Before I start this new project I want to try to create an Android version of one of my apps. In theory this will allow me to double my ad income for that app, and to be honest I don’t expect it to happen right away because the app will have to gain an audience first. The good news here is that I know how to generate an audience in the AppStore so it’s possible that Google Play will behave similarly. Let’s all cross our fingers.
The end of the year is approaching and I’ve had some crazy results in my pricing experiment. I already told you that I was getting paid downloads, but check out these graphs:
The first one is the number of downloads per day, the second is paid downloads. Notice the spikes in downloads when the app goes free, and the smaller spikes in paid downloads when the app is not free. This date range represents 2.19k downloads total and $101 in paid downloads across all of my apps in the App Store.
I’m going to increase the frequency of my price changes after the new year to see how it affects this pattern. I would expect more downloads overall but I’m now not sure what will happen to the paid downloads. For this experiment I am setting the paid days to Mondays and Thursdays only. It should be interesting.
As you probably guessed in the last section, I have been slacking off on my push notifications and badging for my apps. I believe that if I had kept that going my paid downloads may have increased simply because it would have kept more users engaged.
If I had to guess why the paid downloads are happening, I would say it is due to the number of recent “free download” users telling their friends about the app when it is no longer free. So switching to a pricing cycle that takes into account the three day spike for free downloads as well as the spike for paid downloads could increase the paid downloads.
Keep in mind that I’m making Monday and Thursday my paid days for this next experiment. It’s very possible that rotating the days, while keeping the same interval, could produce much different results. There are seven days in a week, so this could run as a seven month experiment. For now I’m going to see how the first two weeks go before committing to something that long term.
Remember, at this point in time I’m putting $100 per month at risk because that is what my apps are earning in paid downloads with the current pricing cycle. The advertising income is not at risk because it is not going to change.
I want to jump off track here and talk to you about finding a job. Trying to earn a living on your own apps is hard and it’s ok to take on a development job while you are trying to build your portfolio. I’ve had this experience and I want to tell you more about what I’ve been through so you won’t feel alone because I know I’m not the only one with some of these stories.
I was informed that my current position would be ending in six months, at the end of the year. No problem, six months should give me plenty of time to find something new right? After all, I have a proven portfolio of 12 apps in the store right now, all of the experience I’ve been describing to you and my resume of successful projects and connections.
I have two more weeks until Christmas and I still have no offers.
I have no trouble getting call screens, I’ve had several second calls, I’ve done sample projects for multiple companies, I’ve done a two week trial, I’ve done live coding, etc. and all of it resulted in no offer over something trivial every time.
Before I get into the stories I want to make sure to warn you about recruiters. Do not trust them, do not sign anything they give you until you have an offer from the company they are trying to place you with. Do not trust them if they say they will reimburse you for travel, because they won’t.
Diversent was one of the recruiting companies that did this to me. I talked to them every day for a week while they set me up with an interview in Denver. They were on top of everything. This was a direct hire position, I did a phone screen and they asked me to come in for an interview. I was 8 hours away in Salt Lake City at the time. They told me that if I got the job they would reimburse me 100% of my expenses for the interview. If not, 50%. So I rented a car, drove 8 hours to Denver, stayed in the hotel they recommended, did the interview and drove 8 hours back. I never heard from them again.
How did the interview go? At the time I was confident but it was actually a waste of time. They were looking for someone with a lot of experience with multi-threading, memory management and knowledge of the inner workings of Swift. Things that I tend to manage with server side updates so my apps do more display and less data management. We weren’t a fit, it happens. They still owe me money that I plan to collect.
Job hunting sucks. When I was right out of college I emailed my resume to three offices, I didn’t even look for job listings. All three gave me interviews and job offers. You know how much free work I had to do for each? None.
Now, you go on LinkedIn and apply to everything in your search results. You hear back from maybe 20% of them. 15% are rejections because someone was ‘more qualified’ whatever that means. Then you talk to a ‘recruiter’ wether it’s internal or not, who asks you a bunch of questions they don’t know the answers to about the language you program in. Then you may hear back based on the notes they took. If you know how to be really personable over the phone, your callbacks will go way up. This part I’m good at, so I often get the second round call.
Next they ask you to do a sample project. This takes time, sometimes days. The simplest is to fix some bugs in an app they send over, the worst is a ‘start from scratch and be creative’ type of project.
Sometimes you do these, send them in and never hear back, other times you get the honor of a video call from their lead developer who doesn’t take the time to understand what you did a week ago while telling you that you are updating the UI from the background thread. Explaining to you that you did everything wrong while you do your best to be polite about their choice of framework, because anything negative from you and you won’t have the job for sure.
If you don’t get the ‘free project’ type of treatment you may get the ‘live coding’ challenge type of video call. These are the worst because they don’t give you anything that you would ever do on the job, instead they give you ‘algorithms’ to solve. I’m sure you could do this any other time, especially because no developer works in a vacuum with no access to documentation or Stack Overflow. Not to mention the added pressure of two or more people who know the answer already watching impatiently and calling out ‘hints’ that constantly derail your concentration.
I don’t know how much video calling you do where you share your screen, and I don’t know how much you use Swift Playgrounds but I never do either. So when I have to deal with getting all of that working and coding in a different interface, all while my machine is processing the video stream and not autocompleting for me as I code it’s just a horrible experience. This isn’t a good measure of my skills and it isn’t taking into account any of my 20 years of coding and on the job education.
I guess the thing that irritates me most about the free work and live coding is that it’s a sideshow. They just want to make the ‘new guy’ dance for everyone. It’s similar to hazing and ensures that each new hire is always considered beneath the ones before. It’s not a two way review, it’s unidirectional. There is no taking into account the fact that this person is smart, has created working projects and can be taught any business specific things they need to know for the job.
And the last bit of sneakiness that I’ve encountered is the ‘trial period’, mine specifically with Automattic, the makers of Wordpress, WooCommerce and other things. After completing the hour long live chat interview and being invited to do a code test where I fixed then updated a feature in an app, I had the typical code review.
The review was a chat of all of the issues they had with my code test. There was apparently a crash if the app ran in iOS 12 but not 13. I didn’t test in 12 because my recent update of Xcode which took a day removed my iOS 12 simulator which was going to take another day to download. In the interest of keeping up with my current job and getting the code test done in a reasonable amount of time I felt this was the best course of action.
I also had a delay in items showing in my tableview because I made the decision that it was better to load each cell after it’s assets were available rather than haphazardly as they came in. The delay was minor. I was invited to do a trial with them at which point I received a copy of their Conflict of Interest document.
I’ll get into the conflict of interest topic in a bit but it took me over a week to clear everything I do outside of Automattic with their HR and Legal team. This blog was on the chopping block in that process because their rules do not allow any outside income unless it is approved. I had to tell them how much I made from my personal apps, why I had my own LLC, etc. More on that later.
I received the details of the trial and a Trial Contract where I would be paid $25/hr for 40 hours of work on a schedule that I could define. I would be assigned a project and a ‘trial buddy’ to answer any questions I had. I now had two jobs, 40 hours full time and another 20 hours part time per week.
I asked for feedback from my first commit. I was trying to commit my changes daily, complete or not and it was my first time working with GitHub as my remote repository. My feedback request was answered a day or so later with issues being flagged on things that were not yet complete. I was concerned with the overall animation, they were concerned with the details of it. I had to deal with code oddities between the parent view controllers for my animation, the fact that I was completely new to the code base and the added challenge of trying to finish the feature with very little breaks from programming in my 60 hour week. I was getting forearm cramps from typing so much, I was spending time on the weekends to try to get ahead and the feedback was coming in very slow.
As I wrapped up the ninth day of my trial, I let my trial buddy know that the next day was my last day. I was told they would review my work and get back to me Monday. I was now over a month in dealing with Automattic and had moved forward every time. I had taken all of the feedback that I did receive and resolved all of the issues that were brought up. I was expecting an offer, instead I was told that my trial was ending because I had a bug in my initial code test, they didn’t like my initial animation of the new feature and I didn’t fill out my pull request to their standards. (A business rule that can be easily learned.) And I thought the trial was ending because it was for forty hours. Apparently they keep you on trial until they are ready to bring you on full time, so they apparently keep an endless $25/hour queue of developers who are worth far more.
I don’t have much nice to say about Automattic after that experience, but I will say that it was the most pleasant of all of my interviews so far other than the long drawn out tease with no result. If you asked me if you should do a trial with Automattic, I would tell you not to waste your time.
Let’s get back to the more asinine calls I’ve had because they are funny now that I look back on them. To date I’ve had 25 calls after submitting hundreds of applications. I probably submitted 30 the other day alone. The first call I had was three days after I learned that I needed to start looking for a job. The first call to go sideways was two days later. Let’s talk about that one because I think there are some important lessons in it and they relate back to the Automattic Conflict of Interest policy.
I had a call with Los Alamos National Laboratory. I found the job posting on their website and thought it would be amazing to work there. I met some people who had retired from there last summer and they told me I should apply. They seemed to love working there so I started watching the site from time to time to see what turned up.
The call started off well enough, we talked about Swift and Objective-C, normal code type things until they asked me if I had any experience with Search Engines. Of course, I use Google and Duck Duck Go all the time.
“You have experience with programming Google?”
Now I’m confused. Technically I have experience ‘hacking’ Google to achieve a #1 ranking for ten years straight and breaking their search display that had the map with the local listings marked on it. (That was fun 😜)
“Have you worked with SOLR?”
OH, why didn’t you say that to begin with. Seriously, I’ve been asked some very vague questions that could have really used some clarification. SOLR is the preferred in house search system for government (and government related) systems. They used this when I worked in the Museum in DC and the only time I ever interacted with it was when it broke.
There were a few questions that I thought were odd on that call but the most bizarre thing was when I was able to ask a question. Of course my question was, “Would there be any issues with me having projects outside of Los Alamos if I was to work there?”
I expected a ‘No, of course not’ but instead I got, “Yes, once you start at Los Alamos, anything you do outside of work belongs to Los Alamos.” WHAT?! How do they legally justify that?
Even better, one of the developers on the phone says, “What? We need to reconsider that policy.”
LOL, so now I’ve kicked off some internal struggle. The guy in charge then responds, “It’s a slippery slope.”
So then the worst part of the call. They asked me, “Why should we hire you?” And now after that last exchange I am completely lost for words. I need the job and I really want to work there but there is no way I’m giving up my freedom to make apps for myself. It’s what I do for fun, I really enjoy it! So my answer was a very sheepish, “Well … I’m funny?” to which they responded, “Great answer.”
You know what, it was a great answer. It’s much nicer than what was going through my head at the time. Think about this:
the job is to develop apps that are mostly for internal or government use that you can never disclose to people.
any fun apps that you do outside of work become theirs even though you are not compensated for the work.
I’m assuming that after you leave the job and go somewhere else the same thing applies because you can’t use what you learned at Los Alamos outside of Los Alamos.
in my mind they need to compensate you for that loss of income potential but they don’t.
There is no pension plan for Los Alamos anymore. I learned that from the people I met the year before who were happily living on their pension plans.
So yeah, that was a great answer. It’s much nicer than what I should have responded with. You belong to the job but there is no compensation for what you have to give up. Automattic’s document was almost as bad, but once they learned that I wasn’t making much from my apps (yet) they said it was ok for me to have them.
I have a fundamental belief that a job is a job. That’s it, you don’t belong to who you work for and they do not have any ownership over what you do outside of work. These weren’t the only companies I talked to that suggested this would be a problem, but these two were the worst.
The next set of calls were the trolls. The guys who ask what they think is a clever question but in reality it makes no sense. They then get upset when you ask them to clarify. I had a call the next week with USAA bank. My bank in fact, and I thought this would be cool because I could work on an app that I actually use regularly. After introductions and greetings one of the managers asks me, “How do you make an abstract class in Swift?”
Now sure, if you just came out of college learning iOS development and Swift you are probably familiar with the term ‘abstract class’ but in my case I’m entirely self taught. So I said, “I’m not familiar with the term, can you rephrase the question?” to which I got, “How do you make an ABSTRACT CLASS in Swift?”
This is when you know that there is no point in continuing, but of course I’m trying to be polite. He then drops the bomb, “Have you heard of a protocol?” Seriously, nearly everything in Swift has a protocol. I have 12 apps in the store of my own and 5 more for my full time job. But apparently my vocabulary is what disqualified me from this position. Again I was too polite but the call ended soon enough and I’ve moved on.
Oddly enough, doing a search in Google for ‘abstract class in swift’ brings up the highlighted result:
The other troll was the one in Denver that Diversent still owes me money for. The question was, “How do you make two things act the same?” Yes, that’s the actual question. Do you know what the answer was? Protocols. No kidding. Of course at the time I’m thinking, why would you want two things to act the same? Why not just have one thing? What’s the purpose of making things be the same?
I’ve thought about this one and I think the proper way to ask this question would have been, “How would you provide the same behaviors to multiple classes?”
It got worse though, these guys were very into their queues, both serial and concurrent. They mainly focused on that, throwing in cryptic questions like the first one about delegates and callbacks. I know they all thought their questions were clear but seriously they should do some focus group testing around the office before their next interview.
When I initially gave my background and said I started programming with PHP 4, the troll said, “I thought PHP was cool until I saw my first real language.” He was probably in Middle School when I built my first cart system and earned a pretty good living off of it. I asked them for feedback at the end of the interview and was told that I had spent too much time as an independent developer.
If you are going through the job hunt like this, just realize you are not alone. This isn’t an easy thing, it takes many months. You have to have personal projects in the stores before anyone will consider you at all. You have to do some sort of Open Source to show them what your code looks like. You have to shake your little ass when they ask you too, and take all of the insults without defending yourself or your work.
You have to spend full days spamming the job boards and answering questions in applications like, “Tell the team why you would be a great fit for the job!” which is stupid because you don’t even know anything about the job yet.
Here are the dummest questions I’ve seen on applications lately:
Why are you applying for this job?
If you were announced into a room. What would your theme song be?
What is the most challenging thing you have accomplished?
What question do you wish they would ask you in an interview?
Your response rate for applications that will give you an interview (not a screen) is going to be 2% or less. Applications that ask you questions like these are in the 98% that you will never hear from. If they ask something like this, just move on to the next.
The next set of issues I ran into from a conversation I was having in an initial phone screen. Two things happened in this call that made me decide that I had a new rule for phone screens. First, I gave my elevator pitch and some background. I was cut short by the interviewer who then told me his background. That was odd to me because it should have been about the company, not this guy. Until he dropped the, “I used to work at Google” line. Then I got why he was so eager to jump in. I was out at that point because I didn’t want to work for someone who was so self centered. I never did hear anything about the company from him.
The second thing that was odd in that call was that he asked my personality score, if I knew it. I have two problems with this:
1. I consider this a psychology related value. Meaning it’s medically related.
2. This pokes at untested HIPAA issues if we are going to take psychological evaluations into account in job interviews.
Traeger Grills in Salt Lake City actually required an online evaluation by predictiveindex.com as part of their application. There was no indication that the results would not be made available to me prior to them being complete so I did the evaluation. Instead of showing me the results it simply said that they would be delivered to Traeger and if I had any questions to email them. I will be following up to obtain a copy of the results for my records. Especially given that I applied and never heard back from them. I should have applied the above rule, the one concerning stupid questions in applications.
So far in the past few months I’ve had my past twenty years of experience disrespected, my time taken for granted, I’ve been cheated, tricked, taken advantage of and been evaluated both professionally and medically. And it’s not over yet. I have an interview at Google in a few days, the 5 hour kind in person at their HQ. So they are flying me out, putting me in a hotel, running me through all of the above in a single stretch in person and flying me back again.
At least this time I am prepared for just about anything and I’ve been using algoexpert.io to prep for the bizarre technical questions that I now fully expect. If you are running into these algorithm questions as well I recommend prepping with this site. It’s about $80 for a full year’s access but the information is really good. You can use my affiliate code “nlncx-50” to get 15% off. Once you sign up you can get your own affiliate code to pass around as well.
I’ll get back to you about the Google interview, if anything I will at least have the experience. Wish me luck. In the mean time go ask your lawyer friends if they have to write sample briefs for job interviews, or if you know a doctor do they have to do a demo surgery. My brother owns a construction company, you think he has to do sample work before picking up a contract? I’ll ask.
I also interviewed with DJI, the Chinese company. Their technical interview was basically a bunch of questions with their lead developer about Swift and Objective C. If you are anything like me you know the language just fine but you may not know all of the technical titles to each of the features. That’s my drawback. So having 12 apps in the App Store isn’t enough proof, you have to also know algorithms, terminology and basically everything about everything. While talking to the DJI lead developer I learned that he has never actually flown a drone. So apparently you don’t have to know that.
Interviewing with Walmart was interesting as well. I got through the recruiter and the tech interview and was asked to complete a sample project. This is one of the ‘from scratch’ projects that takes WAY longer than they tell you it will. It’s also the one that requires you to give your name, address and email in order to get an API key which I think is just uncool because requiring delivery of personal information to a third party as a requirement for an interview is just bad.
I was told that the team at Walmart determined that a senior level developer could do their code challenge in three hours. Maybe so, but the problem is that you and I both know that if you do the project in three hours they will ghost you for sure because you didn’t include an icon, you were not caching images, etc. So I spent 18 hours on my version. I added the two developers as collaborators to my private gitHub repository and emailed to let them know it was done. I never heard from them again and they haven’t opened the project. I know because I added firebase to protect my API credentials and it includes some basic analytics.
They asked me not to make the sample project public because they wanted it to be fair for all of the people they interview in the future. But seriously, they didn’t bother to review it so I made it available publicly so I can share it with other companies that may want to see a sample project so I won’t have to waste another 18 hours for them.
My favorite role so far has been the one that I applied for with CVS. The best part is that the job doesn’t require any coding. That’s right, developer skills without having to develop anything. It’s a Developer Architect role where you basically make sure that everything the product team wants is feasible, and everything the design team wants is doable. You also communicate to the development team to suggest how features should be developed to ensure that future features will not be a large burden to the team. Basically an in house platform expert to attend all of the meetings and protect the developers from any chaos.
The reason that one is so awesome is that there isn’t any stupidity in the interview process and there won’t be as much stress in the actual job. To be honest with you, doing all of these interviews and coding tests has made me enjoy coding much less. The measurement of your skills is not your accomplishments but all of the BS the team can make you do on demand. It’s insulting and exhausting. The good news is that the Walmart code test is done and that’s the one I’m going to pass around to anyone else who wants a demo project from now on. I’m not spending 20 hours per application to get an offer, they can take that 20 hour project and judge me on that. At least it won’t waste any more of my time and it will finally give me time back to work on my own projects.
Also, good news on the five hour Google interview. Honestly it wasn’t so bad, I actually had fun. I learned a lot about Google, met a bunch of their team and the white board sessions were challenging and interesting. If you get the chance to interview with Google be sure to prepare but don’t be afraid, this one was the best experience so far and they reimbursed me for my expenses within a week. I will say that their overall process is much slower than everyone else. I started talking to them October 17th, I was onsite December 4th and it is now December 25th… I had good feedback and have talked with a team but I still don’t have an offer or a conclusion at this time.
I finally heard back from Traeger Grills after only 26 days. They sent me a robo-interview email via HireVue. Basically you sit in front of your webcam and answer questions on camera. This is bizarre, I don’t even get to see and ask them any questions. It’s very impersonal and probably the most awkward thing I’ve been asked to do this entire time. Oh, and this is delivered to my inbox at noon on December 23rd. Shouldn’t spending time with family at the holidays be important to a company that sells high end grills.
I did the robo-interivew. It doesn’t work with AirPods which is annoying because I prefer them over the wired version. The robo-interview was just as bad as it sounds like it would be.
• You don’t get to ask any questions
• You don’t get to interact with a human
• You are the only one on camera … uncomfortable
They asked me why I wanted to work for them. I don’t know, because I really don’t know anything about them. I’ve never talked to anyone on their team. It seems to me that they are working on creating a toxic environment, simply because their current team is unwilling to have any human interaction with the people they may be hiring. They can’t possibly be interested in their customer experience if they are this bad at their hiring experience.
There was a survey at the end. I’m not sure if it was for the HireVue or Traeger Grills. … I was honest.
I also had a second technical interview with CVS, but this time I was the only one with the video enabled. That and I was asked pretty much the same questions as the first technical interview. I guess it’s not much different than a robo-interview, if you are going to be the only one with the camera on. From now on I’m always starting with mine off and playing it by ear. If anything it saves my bandwidth. I was really hoping for a different conversation as well. Strange that they had a script, I’m not sure what you can really learn from that kind of setup.
In general I have an opinion about interview questions. I think all of the questions that focus on negative things are horrible things to ask.
• “What is your biggest failure?”
• “Tell me about a conflict you had and how you handled it.”
• “Describe a time when you were unable to deliver a product on time.”
I’m not a negative person, and I don’t believe there is any positive information you can learn from asking a negative question.
Anyone who has ever had any experience in sales, knows that anything negative that happens during the sales experience reflects negatively on the seller. Even if the seller isn’t at fault.
If you are hiring, you are selling your business to potential employees at the same time. Introducing negativity into the discussion at all will reflect negatively on your business. In the end it may have the result of making your cost to hire new employees go up. Take my advice and remove the negativity. If you don’t believe me, re-read this section and tell me if you see anything negative about Google, they didn’t ask any negative questions.
This has been my last six months. I have had almost no time for my own projects, my family or anything else due to the unpaid extra work required as part of job interviews. I read on LinkedIn yesterday where some career coach said it will take one month, per $10k that you are asking for, to find a job. That’s stupid, so a CFO that makes $2M spent 200 months looking for the job? I don’t think so.
Ten days after completing the robo-interview for Traeger Grills, I got an email saying that they wanted me to do an on-site interview. I still haven’t talked to anyone or been able to ask any questions about the company, it is all very one-sided. They sent me an empty calendar to select my availability, but keep in mind that I would have to fly to Salt Lake City for this, so it’s not like marking out an hour of my day, everything on my end has to stop.
It’s been over two months since I applied, and I’ve picked up a several month gig in the mean time so I let them know that I wouldn’t be available for four months. They responded by telling me they needed someone immediately so “All the best in your search!”. In the two months since I applied for the position, that was the first time I was able to ask a question.
In the mean time I heard back from Google, I can expect an offer, then I just need to find a team. I know all of the ‘sample projects’ and stupid questions that everyone has been asking comes from what they think Google does. I remember when I read about Google’s interview process years ago and it wasn’t long after, that the UX Designer I was working with started giving ‘homework’ to job applicants to test their abilities. In reality it was establishing her as the ‘expert’ to any new hires, they wouldn’t have made it past our HR if they didn’t have the skills or experience to interview for the job.
Every single company that I have interviewed with so far simply has it all wrong. The wrong people doing the interviews, the wrong questions, the wrong process.
This is the point where I start to equate the hiring process for tech to the professional equivalent of hazing. Because if a developer has even a single app in the App Store or a College Degree, or code on GitHub they are qualified to do the job. If they need some on the job training to get up to speed with your team, or your business rules, that is entirely normal. So the only purpose of having someone ‘live code’ in front of your team, or put together a rushed demo project, is to allow your existing team to publicly judge the new hire and assert themselves as superior.
You can spare me the argument that you need to see someone write code in order to determine if they are qualified, unless you are the type of company that requires your new hires in accounting to ‘live audit’ some sample books or fill out some demo tax forms to prove their skills. There is no argument to be made that the work the accounting team does is less crucial to your business than the work the developers do. You can patch software, but ‘patching’ your books is a much more sinister practice.
Your codebase is probably above the beginner level, but if you are bringing in interns or your developers are any good at all, they should have no trouble helping a new team member get up to speed. When it’s my turn to hire, I’m looking for the scrappy self taught developers who are not afraid to learn and can get things done just to conquer the challenge. I don’t care if you can solve some algorithm, I want to ask you for a feature that initially scares you. Then I want to see you gloat as you demo that new feature to the rest of the office. The only two things I care about are:
1. you are not a jerk
2. you believe in your abilities
Things will work themselves out after that. As long as you are willing to learn and are interested in the job, everything will be fine. There is no developer that I have ever met that was unable to learn a new skill. Our jobs, our languages and our architectures change almost constantly. If you have been a developer for any period of time, all of the above experiences should be insulting to you. Just know that you are not alone if you have had or are having experiences like this.
Another update from my affiliate news, I finally made my first $1 with an affiliate link in an app. I have sent over 7500 clicks to GhostStop and earned a $1 commission on a $20 sale. I may revise my app to show a GhostStop banner instead of the AdMob banner to try to increase this. It’s a good commission for little work but it’s not a good return on the amount of traffic I’ve sent. I’ve scheduled another Black Friday notification that is going to hit 67k users so hopefully I can update you with some results soon.
To be honest I feel that it is on them to close the sale once I’ve delivered the customer but that’s an entirely different book and is WAY off target here.
Hurray! $1 :]
And just because I was suspicious about the total in app time for Flight Alert I gave it some time and went back to check again. Now Apple is showing around 3 sessions per month per active device for the past month. Firebase is showing 1 minute 20 seconds on average per day for about 10 devices a day. That is more in line with what I would expect for an app that is this new. Firebase is telling me that I’ve had 375 installs in the past 4 months (which is not bad for zero advertising) compared to 404 from Apple. Without having exact date ranges from Firebase I think these numbers are probably close enough.
OK, so maybe I’ll approach the SkyScanner affiliate deal after I get my user numbers up. These new stats don’t sound so impressive anymore which is why I have always hated statistics. Given the right data you can lie about anything!
My pricing experiment continues to run, I’m through the first month now and I’ve noticed some odd things. My paid settings are Monday through Thursday of every week, but I’m showing paid downloads in Apple’s Trends for Sundays. Maybe it’s a timezone thing on their end but you would think that a big company like Apple could handle something like that. Obviously the price is being set/unset somehow.
Another odd thing is that the spike on my free days seems to have leveled out. Basically it looks like I got a bump after the first paid cycle and it has leveled out since. It also looks like my paid downloads have increased in an inverse pattern. GhostTalk is now bringing in about $200/month in paid downloads on top of the ad revenue. In fact, that is almost 4 times the ad revenue which makes me think that at some point it might be worth scrapping the ads because they are not growing as fast as the paid downloads. For now I am just going to watch how things progress.
I also noticed that Flight Alert is my second most used application. I have 14.7k impressions (with an average of 6 minutes) in the past 30 days which is amazing given that there are only 470 total installs at this point. I went soft on the ads in this app because I wanted to see how users behaved before trying to decide how to approach advertising. Basically there are banner ads as every fourth item in the list of flights being observed. AdMob is showing 6 requests for ad displays for the past month with zero interaction. Banner ads just don’t work unless you place them where they may accidentally be tapped which is the same trick you have to use for the web. In the mean time paid downloads have generated $13 over the past 90 days. Nothing to retire on but the app is less than 90 days old so it is impressive that users are willing to pay for it at all.
For this one I may look into my first direct affiliate deal to be able to link users directly to the flights they are interested in. I think that being able to show 1,470 hours of use from 470 users in a month (3.1 hours per user) is a great sales pitch. But the one thing that all of these numbers confirm is that Push Notifications work! This entire app is push notification based and right now it’s every 6 hours. I could simply update my crontab and send the notifications more often to generate more impressions.
I have started to build my own services to replace Google’s Firebase in my applications. There is just so much Open Source out there that it only makes sense to not contribute to the collection of people’s personal data. And there’s the fact that for 99% of my tasks I really don’t need to know anything about a user and they certainly don’t need a login.
The first thing I have done is to create a simple web socket service using Ratchet and PHP. It’s REALLY simple, basically it replaces the chat in my GhostTalk app. The device connects to the web socket, increments the user count. The user sends a message which contains their app generated ID (Apple requires that users have the ability to block each other) and the web socket sends the message to all connected devices. The device disconnects when the app goes to the background or exits and the service decrements the user count.
Another tool I’m thinking about replacing with my own version is Firebase Remote Config. In reality all it does is store a dictionary of values for your app to fetch and your app connects to it with a web socket. If the dictionary gets an update any app connected updates right away, or at least that’s the theory. In reality would it really that important for a config to be that responsive? Wouldn’t a single request to your own server, delivering a JSON payload on app launch solve the same problem? For my purposes, yes.
I’ve also been having trouble with Firebase real time data options because they don’t always behave like I expect them to. I may spend some time putting together a quick Vapor web socket server to replace that as well. Then I can have a little more control over my data, I can add image sharing capabilities as well without worrying about running over some small cap of data. For $35/month I have a nice DigitalOcean server with unlimited subdomains, 2GB to play with and an additional 100GB of storage attached. I can do a lot on my own with that.
One thing I think I need to set up is a simple group of extensions that I can drop into every project that contains all of my tricks. I already know I plan to add Firebase to each app, reviews on a timer and push notifications so why not create a Swift file containing an extension for each with a function to trigger any of it that doesn’t happen on it’s own?
I also need to configure some automated updates. Because Firebase updates fairly often and it would be nice to keep up with those updates even if I don’t need to change anything on my end. The way to approach this would be to set up Fastlane for each application and set a cron job to update Firebase and call Fastlane to submit a new build to the app store. The automated updates would of course all have the same lame update info, “Maintenance Update”.
BuddyBuild also looks like a great tool for automated updates, it is a cloud based CI tool that connects to the top three git platforms. I told you that using git to keep a backup of your projects would come in handy some day didn’t I?
Ok then, screw BuddyBuild. I went to their login and tried to login using BitBucket because that’s what I use. Well first I get a screen with a list of all of the access BuddyBuild will get to my BitBucket account and I say ‘yes’ because I’m trying to set this thing up and so far I’m impressed that this much of it is automated, then I’m taken to a screen with an overly wordy message about how they are closed to new users. But I just approved access to my remote repository for their platform. They could have provided that message MUCH sooner in the process. Don’t get tricked like I did. Now I have to go make sure their access is removed from BitBucket.
Just like I suspected. Under the OAuth tab in my BitBucket user settings, BuddyBuild was listed as having all kinds of access. That’s unacceptable in my opinion, possibly even criminal. But I’m not a lawyer, it’s better for everyone that I’m not because I would be a mean one.
Websites are just so bad. They don’t tell you anything about their product except the vague sales pitch ipsum that every site now uses and they usually don’t give you pricing up front either. This is why I tend to build my own backend tools. I may end up doing that in this case but I have a few more options that I’m going to investigate first. One that could also handle CI for the web would be handy for any updates I needed to make on my subdomains.
Yeah, I may end up doing this myself. CircleCI could be used for my web content, but adding app deployment to the AppStore is $50/month. DeployHQ would cost me about $40/month just for the subdomains and they don’t deploy to the AppStore either. So the problem with a cloud solution is that it’s too expensive for what it’s worth.
If someone want’s to compete with these services, I’d pay $1-$2 per run. Just let me send code to DigitalOcean and also to the AppStore and pay as I go. I’d probably even forget I was signed up, but for this round of updates on all 12 of my apps and a few of the subdomains as well that would get you between $15 and $30 for an automated process that you don’t even have to interact with and I would otherwise have to configure.
With auto-update nobody reads the update messages, I know I never have. For Animal Analysis I did my best to follow a storyline in my updates with characters, scientists and their crazy antics. If someone gave a bad review, my reply would talk about how one of the characters was fired for, “saying gerbils were not animals” or some other goofy reason. It was an attempt at adding humor to a silly application in a serious AppStore.
Like I said earlier, the review section is the User’s space and you shouldn’t try to interact, just read and update as needed. I got a review today for Animal Analysis along with an email from the same user saying that they downloaded the app and got nothing but a black screen. It never asked for camera permissions according to them and there was no way for them to enable camera permissions. Clearly you can’t get approval to release an app in the App Store if you have any of those issues in your app.
Speaking of Animal Analysis, I’m going to go set up that update and add a humorous line to the update info box from my characters and request that users please give a review saying “Hi” to … “Bridget” because she’s new to the team. This is a humorous test because I’m almost 100% sure that nobody will do this, but if they do I may need to rethink my entire approach to that update info box.
Another way to save yourself some time is to not add any localizations to your app until you actually need to. In updating PuppyCam this time around I hit a roadblock because my privacy URL was no longer valid so I set up a subdomain specifically for the app just as I had for my more recent apps. I use a three page template to cover support requests, my cookie and privacy policies. Upon providing that new url to Apple and hitting the submit button I got an error indicating that I had to provide a privacy URL for every localized language. Nope, that’s a serious load of work when 90% of my users are in English speaking countries according to Firebase. So those languages are now removed.
Don’t worry about those non-English speaking users though, the app’s functionality didn’t change and there is no text in the app that isn’t localized for them already.
Sitemap Plus is taking much longer to update than anticipated. First, the project was broken because it’s Objective C, I haven’t touched it since 2016 and whatever I was doing with my CoreData versioning was just not good. I was able to recover the project by checking out my last good commit, fixing the CoreData issue and then doing some cleanup to git. I also had not saved to my remote repository since 2013 which could have been bad if I had lost my local copy.
If you aren’t using git on your personal projects you should, even if you never edit anything but the master branch. Just commit each time you are done for the day, and push it up to BitBucket or whatever your favorite is. Not having backups, or a way to reverse bad things just leads to more work. Save yourself the time now and just git started.
I will say that updating 12 apps like this is taking a LONG time, specifically because the versioning and uploading through the Xcode Organizer is such a pain. Once this is complete I’m going to spend some time setting up Fastlane for each app so I can just start a command line process once my update is complete. If you haven’t used Fastlane you should look into it, it's a nice tool. I’m also tempted to set up Jenkins so I can just commit my code in git and have everything else just happen.
The missing piece in the entire CI process for the Apple eco system is the ability to set pricing, create versions and submit builds from the AppStore mobile app. If that was available you could set up some tools like Jenkins, Fastlane, some command line scripts to push your code to a remote backup, and simply open up the app to tap out the rest.
Not to mention that the only thing slowing me down in adding all of these tools is the fact that the 50 GB left in my 500 GB drive can vanish quickly and unexpectedly, and often does. I believe the issue is related to TimeMachine but adding in new automated tools should probably be done on a Mac Mini that I can hide in a closet or something. Otherwise I risk filling up my drive without knowing why, which is entirely frustrating.
Ha ha ha, I just searched ‘reduce storage in git’ just to see if I could gain more space and Safari crashed. My machine is determined to stop me from solving this issue.