Why my Pokémon Go utility app has a squirrel for it’s icon

Quick vent session turned into a long one:  TL;DR — Apple continues to reject my app because it has an object similar to a pokéball in it, and that it is misrepresenting itself (it’s not) or misleading users (They’re not), despite the PILES of applications doing the same or WORSE, and after 12 days of trying to get them to approve the app, 3 different icons, and no way of knowing whether this next change is good enough, I’m finally throwing up my hands in surrender and using a squirrel.  Full vent session below.

Like many iPhone users and children of the 90’s I was extremely excited for the launch of Pokémon go, applying for the beta, downloading early first day it launched and suffering with all the other players through the early server troubles with an unsinkable enthusiasm.  And when it came out, like many developers I saw a huge market open up, there were a lot of pokémon go players, and there was a lot of things that they wanted to do with the app, that the app just didn’t do.  Enter the complicated world of the App Store companion application market.  I quickly released Pokébelt – My goal to get quickly into the market with minimal but useful functionality (A server status checker / and a tool for seeing which Pokémon types were weak / strong against what other types), and rapidly expand the application quickly releasing new functionality every few days to beta testers, and rolling out production upgrades as fast as the Apple Review process would allow, keeping me on the front of the wave.   My original icon prominently featured a Pokéball over a belt, matching with the Pokébelt brand I was building.  Linking it to Pokémon was important as it IS a companion app.  I was careful to make sure that the graphic I used had no copyright or trademark restrictions and was fair use, and the first version had no issue getting into the store, I saw a high conversion rate, lots of downloads on the first and second days (1000 downloads on my second day) and high reviews (4 1/2 stars) with most of them saying they’re waiting for new features / functionality.  I was quick to market, but I knew that I’d need to get the map and chat features in to be competitive, timing would be everything.

Version1

 

Version 1.0 – Submitted July 12th, Approved July 14th

Here’s where the problems started.  I finished the first version of my crowdsourced map a few days later, and July 16th submitted to testflight for review (Apps going to beta testers need to be reviewed as well) — And for two days it sat there.  No big deal, a couple of days is normal for testflight review, although often they are quite fast.  That was when I got the first rejection:

Design – 4.1

Your app or its metadata contains misleading content. Specifically, your app icon is leveraging Pokemon Go.

Next Steps

Please remove or revise any misleading content in your app and its metadata.

That’s strange I thought, Apple describes this rejection as:

Misleading Users

Your app must perform as advertised and should not give users the impression the app is something it is not. If your app appears to promise certain features and functionalities, it needs to deliver.

Which is strange, because my app promises to be a companion app to pokémon go and it delivers, it makes no promises with it’s app icon other than the obvious relationship it has to Pokémon go.  Here is the PokéBelt on the App Store description:

PokéBelt is a tool belt for the compulsive Pokémon Go Player. Current “Pouches” include:

* Battle Comparison – See what types you should choose to get the best advantage in a fight!
* Server Status – Community reports, know and report when the servers are up / down / unstable

More features incoming!

PokéBelt is an independent application and has not been authorized, sponsored, or otherwise approved by Niantic Inc, Pokémon Company, or Nintendo Inc.

No misleading content there.  I then let them know that the app and icon were fair use, and not misrepresenting themselves or misleading users, that the app reviews stated as much, and the response came:

Hello,

Thank you for your reply. We realize that the Pokeball is depicted on a belt; however, it still creates a misleading association with the game. It would be appropriate to edit the icon so that it does not include Pokemon Go images before resubmitting the app for review.

Best regards,

TestFlight Review Team.

Well shoot.  I used different color schemes and a very obvious description / screenshots to let users know that this is not pokémon go, but IS a pokémon go companion app.  Without the pokémon relationship the app is unmarketable in a field of apps that clearly have that relationship established.   I’m not trying to mislead users with the pokéball, in fact, I used the pokéball so that users would know it’s pokémon related!  At this point I decided to go look at what other apps that were pokémon related were doing so I could figure out a way to keep the relationship without pissing off Apple’s censors, here’s what I saw:

Screen Shot 2016-07-27 at 12.07.19 PM

EVERY single app in the top apps category after Pokémon go uses some flavor of Pokéball.  Some by making the red and white iconography a part of their icon square, and the topselling one (the app I wanted to be but got held up by review) Pokéradar features a pokeball over a blue earth, almost exactly like the actual Pokémon go app itself.  Big note here, I took this screenshot today (didn’t grab one on the 19th when I got my first rejection) and much has changed, many of the apps now feature “mutated” but still obvious pokéballs in their icons.

Quick pause here to talk about the ludicrous double standard and highlight a couple of apps that are IN THE STORE and approved right now:

  • Poke Radar for Pokemon GO on the App Store – Released same day as my app, got the map first, more power to them.  Description is clear, lets users know what it does and that it’s not a nintendo product but a tool to help.  Icon looks almost identical to Pokémon go app icon, nice graphic, clearly inspired.
  • XCoins Calculator Cheats for Pokemon Go Edition on the App Store – Only 5 apps in and we start to get to the misleading garbage ripoff apps.  This app makes no clear indication (other then it’s amateurish presentation) that it’s unrelated to Nintendo, implies that it’s a way to get free coins or pokéballs, but is really unclear as to what it actually does.  Made it into the store, tons of downloads.  Misleading Junk.  Apple Approved.
  • Catch Em Go For Pokemon on the App Store — Pokémon go sounding name?  Check.  Pokeball for icon?  Check.  Claims to be a Pokemon game?  Check.  Indicates that it’s unrelated to the trademarks that it uses in it’s description, content?  Nope.  Actually just a flappy bird knock off pretending to be pokemon? Check.  Misleading Junk.  Apple Approved.
  • Pokémon GO : New Version For Free App Game on the App Store – This one is my ABSOLUTE favorite.  It rips of the name , Description (Describes itself using the actual text from Pokémon Go) AND screenshots from Pokémon go as well!  WOW!  Top download on the store indicates THOUSANDS of people have downloaded this piece of obvious rip off junk, but at least it’s icon no longer features a pokéball.  Thank goodness.  Apple Approved (Still in store).

Okay I thought, my icon wasn’t “original” enough, and featured the pokéball to prominently, Apple store has the ability to respond directly to the reviewers and so I made up a new icon, where the “belt” part of Pokébelt is emphasized and the pokéball (still an important part of the branding) was reduced quite a bit and made more obvious that is a belt buckle, and sent it across to the reviewers.  Easy right?  They know what works and what doesn’t and they won’t tell me what the “rules” are, but obviously it’s not “no” pokéball.  Here’s what I sent:

Icon120

Now I’m the first to admit that I’m no artist, but I feel that this made quite clear the belt aspect, and de-emphasized the pokéball at least as much as the other apps in the store.

But it didn’t matter, because the response I got to sending the icon directly was:

Hello Kevin,

Thank you for your follow up message.

Please know that Apple is not able to provide pre-approval to developers for
proposed app submissions or app update submissions.

We ask that you please review the Program License Agreement and iOS App Store Review
Guideline details against your desired changes for your specific application.

Once your app has been updated, submit your update and we will be happy to review the app again.

Best regards,

App Store Review

What a pain in the ass.  For a little background, here’s what you have to do to change your icon in the app and submit again to send it back to the app store for re-review:

  1. Make the new icon
  2. Scale the icon files into icons for every resolution of iPhone, iPad that ever existed, as well as search icons for the same, retina and non retina.  13 resolutions in all, and update your x-code project.
  3. Update the 1024×1024 promotional imagery
  4. Rebuild your application and archive it for delivery to the app store with a new version (this takes about 5 minutes)
  5. Upload to the store (this takes 20-30 minutes)
  6. Resubmit the app for approval
  7. Wait.  This seems to take 2 days right now.

So I submitted the app with my new fancy icon and this time I got rejected again ( and a phone call from the dev relation group who told me quite clearly that my app icon was misleading, that I was in fact allowed to use a pokeball because it is fair use, and that I would just have to change my icon to not be misleading, and that no, she couldn’t tell me what that meant.  It’s July 21st now, and my app has dropped from the top ranks of pokémon companion apps to the abysmal end because of lack of features (Features which are available in the new version) and any chance I had of being the premier pokémon companion app is now fading as my frustration grows.

Screen Shot 2016-07-27 at 12.44.34 PM

I decide to give it one more go, this time breaking the Pokéball into two halves so that it doesn’t look much like a pokéball at all anymore and resubmit.  Surely they can’t think I’m trying to mislead by using two colored semi-circles in my icon.

Icon120

But no.  Today I was rejected again.  They told me to call them and resolve the issue but I can’t get through (number rings through to voice mail) and I’ve had it.  So I’m going through one last process of icon revision and hoping that I can drive my way back despite having a totally unrelated icon through having the best feature set possible.  I present to you, the new icon for Pokébelt utility app:

Icon180

Thanks and credit goes to http://crockerj.com/2011/08/04/squirrel-photos/ – for his wonderful royalty and copyright free squirrel imagery.

5.0 Is Pending, 5.1 Beta already available!

Alright!  With 5.0 locked and pending Apple Review (thanks testers!) I couldn’t just sit idle and have been working on a 5.1 beta as well, that means new features!

New Features:

  • Pickup for mix – If there are items that you can mix to make items that you are missing then they will show up in a new section!
  • Pouch – If there are items you can mix in your pouch to make an item you are missing, the recipe will appear in it’s own section (How convenient!)
  • SD / DD / TD / 1xxx Searching – You can now enable / disable searching for items with issue numbers less than 10, 100, 1000 or 2000! (Good way to find trading or market fodder!)

Fixes:

  • Typos
  • Crash bug
  • Stall when sorting market items

Known Issues:

  • Haven’t tested it yet, but I think the recipe maker might be a little goofy if you have to mix more than one of the same type of item (sorry about that)

Feature Requests — Upcoming builds:

  • Pouch / User / Locked item searching
  • Automatic searching and background notifications when items are discovered as you move!
  • Favorite Number setting – Only show improvements if you don’t already have your favorite number, highlight any favorites found nearby or in pouches

Click here if you’d like to be a beta tester.

Email me if you are a tester and have found any undiscovered bug or would like to request a non-listed feature.

Beta 4

Okay, thinking this one might be the 5.0 GM:

New Features:

  • Disable market searching – For those of you who want to stumble upon your sets the usual way

Fixes:

  • Sped up market searching – Still a little slow if you are missing lots and have a really broad filter set
  • Unique items aren’t goofy!
  • If there are too many items to show, it will show a few, rotating to landscape or using iPad will still show more.
  • Grayed rows indicate how far away you are in order to pick up items

Known Issues:

  • Initial market searches are still a little slow, especially if you have lots of results
  • Tapping on Helicarrier rows / Market Rows don’t jump you right to the screen you need to be on — Limitation of the Wallab.ee API — I’m requesting an update
  • Some users with Emoji in their user name are unable to search :(

Feature Requests (these won’t come in this version but I’ve got it on the boiler):

  • Pouch / User / Locked item searching
  • Automatic searching and background notifications when items are discovered as you move!
  • Item mixes for missing items (both in your pouch and ingredient pickup)
  • TD and DD searching
  • Favorite Number setting – Only show improvements if you don’t already have your favorite number, highlight any favorites found nearby or in pouches

Click here if you’d like to be a beta tester.

Email me if you are a tester and have found any undiscovered bug or would like to request a non-listed feature.

Beta 3

New Features:

  • Disable nearby searching — Disables searching nearby locations (good for if you already know that they’re a bust)

Fixes:

  • Crash when you open settings on iPad
  • Sporadic crashing (some)
  • All pages of market load (previously just the first 1000 market items were loading)
  • Faster market item loading (Caching item type and set information in iCloud, we’ll see how this works out)
  • Branded items shouldn’t be goofy anymore in list

Known Issues:

  • Initial market searches are still a little slow, especially if you have lots of results
  • Unique items sets are goofy in the market search
  • When there are lots of item in the row they get too squished – Workaround, flip to landscape or use iPad — This is a real pain as I want to make all that information visible.. might end up limiting the amount of squish that can be done.
  • Grayed rows should be more clear that the issue is the user is too far away
  • Tapping on Helicarrier rows / Market Rows don’t jump you right to the screen you need to be on — Limitation of the Wallab.ee API — I’m requesting an update

Feature Requests (these won’t come in this version but I’ve got it on the boiler):

  • Pouch / User / Locked item searching
  • Automatic searching and background notifications when items are discovered as you move!
  • Item mixes for missing items (both in your pouch and ingredient pickup)
  • TD and DD searching
  • Favorite Number setting – Only show improvements if you don’t already have your favorite number, highlight any favorites found nearby or in pouches

Click here if you’d like to be a beta tester.

Email me if you are a tester and have found any undiscovered bug or would like to request a non-listed feature.

Build 2

New Features:

  • Market Search – Searches all markets for missing / improved items
  • Market Max – Set a max price you are willing to spend on any market item
  • Helicarrier Search – Searches the helicarrier for missing / improved items
  • Improvement Min – Lets you set a minimum improvement threshold for the improvements section

Known Issues:

  • Initial market search takes a LONG time (additional searches are much faster) – Improving this mechanism with better shared caching
  • Unique / Branded items sets are goofy in the market search – Will fix this with next beta build
  • When there are lots of item in the row they get too squished – Workaround, flip to landscape or use iPad — This is a real pain as I want to make all that information visible.. might end up limiting the amount of squish that can be done.
  • Grayed rows should be more clear that the issue is the user is too far away
  • Tapping on Helicarrier rows / Market Rows don’t jump you right to the screen you need to be on — Limitation of the Wallab.ee API — I’m requesting an update

Feature Requests (these won’t come in this version but I’ve got it on the boiler):

  • Pouch / User / Locked item searching
  • Automatic searching and background notifications when items are discovered as you move!
  • Item mixes for missing items (both in your pouch and ingredient pickup)
  • TD and DD searching
  • Favorite Number setting – Only show improvements if you don’t already have your favorite number, highlight any favorites found nearby or in pouches

Click here if you’d like to be a beta tester.

Email me if you are a tester and have found any undiscovered bug or would like to request a non-listed feature.

PirateWalla Beta Testing

Hi, my name is Kevin, creator of PirateWalla and I’m a Walla addict.

I’d kicked the habit by deleting WallaBee from my phone and trying to get back to my regular life, and had been clean for more than a year.  Then someone sent me an email asking for a couple of TD items that I had, as their wife was collecting the set, and I thought, “Sure, no problem, I’ll just get in and out real quick, and delete the app once more”.

As such, I’d like to announce that I’ve rebuilt PirateWalla a fine tool for searching and completing the sets in WallaBee from the ground up using swift and it is now open for beta.

Sign up here

Current features are a short set, designed to help find missing items and improve existing ones quickly as possible, but more will surely be coming soon as I catch up on all the easy to find items :)

  • Find nearby missing items (including missing Unique items)
  • Find nearby improved items
  • Quick jump – Items you are missing are shown in the same row as the place you need to go to pick them up, and tapping the row jumps you right to the place page in WallaBee!

Agario Portal — Now in Apple Store

agario_3

Agar.io is a fun, multiplayer, online game which you can play at http://agar.io

It has some mobile functionality, but for playing on the iPhone or iPad there are few glaring issues:

  1. To control, you must tap in the direction you want to go; this behavior is laggy and overall unplayable
  2. There is a button to split, however there is no button to eject mass, an important behavior for playing the game
  3. There is no ability to bring up the menu and change options
  4. On the iPhone, the main menu is hard to use because it’s sizing seems to be “not quite right” making it impossible in some resolutions to set your name.

There are also other “Agar.io” style games in the App store, but none of them have the full features, multiplayer aspects, or mechanics that we love about the real deal.

To solve these things, I wrote Agario Portal – Currently available in the App Store which solves these problems – a custom “browser” for playing Agar.io with a few benefits:

  • A joystick for better control
  • Buttons for both split and eject mass
  • Button to bring up main menu
  • Better format for main menu allowing user to see the whole thing.

Screenshots:

iPad Screenshot

iPhone Screenshot

Stupid bot creatures

Turned on image captcha.  I apologize to real people.  I do not apologize to the bots.

Script to get errors and logs out of xCode prebuild action

In response to an issue that came up on stack overflow – http://stackoverflow.com/a/18477820/285694

log_prebuild.sh

Run your script in your prebuild action using this script.

#!/bin/sh

# log_prebuild.sh
#
# Created by Kevin Lohman on 8/27/13.
#

#### Default Setup
scriptName=${BASH_SOURCE[0]##*/}
echoerr() { echo "Error - $scriptName - $@" 1>&2; exit 1; }
if [ -z $SOURCE_ROOT ]; then
outputFolder="$( cd "$( dirname "${SOURCE_ROOT}" )"/build && pwd )"
else
outputFolder="${SOURCE_ROOT}/build"
fi
stopOnError=""
unset scriptPath

##### Parse Parameters
while true ; do
case "$1" in
-v) echo "### Verbose mode enabled -v"; set -x; shift;;
--output) outputFolder=`python -c 'import os,sys;print os.path.realpath(sys.argv[1])' $2`; shift 2;;
"") break;;
*) if [ -z scriptPath ]; then
echo "Unknown flag: $1"; echoerr "usage: $scriptName [-v] [--output destinationFolder] scriptPath"
else
scriptPath=`python -c 'import os,sys;print os.path.realpath(sys.argv[1])' $1`
fi; shift;;
esac
done

if [ -z scriptPath ]; then
echoerr "Script path parameter needs to be set" > "$outputFolder/prebuild_error.log"
fi

if [ -f "$outputFolder"/prebuild_error.log ]; then
rm "$outputFolder"/prebuild_error.log
fi

echo "### Prebuild Logging Script Launching - $scriptPath" > "$outputFolder"/prebuild.log

$scriptPath >> "$outputFolder"/prebuild.log 2> "$outputFolder"/prebuild_error.log

enforcePrebuildFailures.sh

This script should be placed in a Run Script build phase for your target (ideally before compile)

#!/bin/sh

# enforcePrebuildFailures.sh
#
#
# Created by Kevin Lohman on 8/27/13.
#

prebuildLog="$SOURCE_ROOT"/build/prebuild.log
errorLog="$SOURCE_ROOT"/build/prebuild_error.log

if [ -s $prebuildLog ]; then echo "#### PRE-BUILD Output"; cat $prebuildLog; rm $prebuildLog; fi
if [ -s $errorLog ]; then echo "#### PRE-BUILD Error" 1>&2; cat $errorLog; rm $errorLog exit 1; fi

Support iOS 4 devices while building with the iOS 6 SDK

Apple has released iOS 6.0 SDK alongside the iPhone 5.  It comes with a number of changes (and deprecations) from previous SDK’s.  We still needed to support iOS 4 in our product (backwards compatibility), but had a large number of customers clamoring for iPhone 5 support (full screen).  Apple rejects any applications that are submitted with support for iPhone 5 that aren’t built with the iOS 6 SDK, so it was necessary to do a few tricks to support both iOS 4 and the new iPhone 5.

First our product has “Treat all errors as warnings” enabled, this meant that a number of deprecated functions that have been used all over the place (dismissModal, presentModal, etc…) are now throwing warnings and those warnings are treated as errors.  So it was necessary to add a build flag to the build settings in X-Code to not warn about deprecations (Under build settings change “Warn about Deprecated Functions” to no), this ignored all the errors that were related.  This was necessary because we couldn’t remove these errors from the code, as for most of the deprecated functions, there are no replacements until iOS 5, so if iOS 4 support is desired, we have to continue to use the old deprecated methods.

Next, the minimum target had to be changed to iOS 4.3 (Goodbye iPhone 3G support) but we still have support for other devices running 4.3 =< and iPhone 3GS > (Here is a matrix).

Finally, apple changed the way rotation works, and it was necessary to “hotwire” all of our existing rotation code into the new code.  shouldAutorotateToInterfaceOrientation: is the old way of checking rotation, and would be called (even when compiled with iOS 6 SDK) on any device that was running iOS < 6.  However this method would not be called for iOS 6 devices, instead it would look for the shouldAutorotate and supportedInterfaceOrientations methods, and extract it from there.  Rather then go through the 100+ view controllers we have with custom implementations for shouldAutorotateToInterfaceOrientation: I created a #define that would insert itself into the code for shouldAutorotateToInterfaceOrientation, and define the two new methods (should Autorotate and supportedInterfaceOrientations) so that they would query the old method and return an updated result.

I placed the following code in our Prefix file:

#ifdef __IPHONE_6_0 // Only do the rotation fix if we are building with iOS 6 API
@protocol DeprecatedRotationSupported
@optional
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toOrientation;
- (BOOL)shouldAutorotate;
- (NSUInteger)supportedInterfaceOrientations;
@end

#define shouldAutorotateToInterface_fixed shouldAutorotate \
{ \
    UIViewController  *selfTyped = (UIViewController  *) self; \
\
    if(![self respondsToSelector:@selector(shouldAutorotateToInterfaceOrientation:)]) \
        return NO; \
    int optionCount = 0; \
    for(UIInterfaceOrientation orientation = UIInterfaceOrientationPortrait; orientation <= UIDeviceOrientationLandscapeLeft; orientation++) \
    { \
        if(![selfTyped shouldAutorotateToInterfaceOrientation:orientation]) continue; \
        if(optionCount==1) return YES; \
        optionCount++; \
    } \
    return NO; \
} \
\
- (NSUInteger)supportedInterfaceOrientations \
{ \
    UIViewController  *selfTyped = (UIViewController  *) self; \
\
    if(![self respondsToSelector:@selector(shouldAutorotateToInterfaceOrientation:)]) return UIInterfaceOrientationMaskPortrait; \
    \
    NSUInteger supported = 0; \
    \
    if([selfTyped shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationPortrait]) supported |= UIInterfaceOrientationMaskPortrait; \
    if([selfTyped shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeLeft]) supported |= UIInterfaceOrientationMaskLandscapeLeft; \
    if([selfTyped shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationLandscapeRight]) supported |= UIInterfaceOrientationMaskLandscapeRight; \
    if([selfTyped shouldAutorotateToInterfaceOrientation:UIInterfaceOrientationPortraitUpsideDown]) supported |= UIInterfaceOrientationMaskPortraitUpsideDown; \
    return supported;  \
} \
\
- (BOOL)shouldAutorotateToInterfaceOrientation
#else // We are building with the older API, leave shouldAutorotateToInterfaceOrientation alone.
#define shouldAutorotateToInterface_fixed shouldAutorotateToInterfaceOrientation
#endif // __IPHONE_6_0

Then, I did a replace all for shouldAutorotateToInterfaceOrientation: with shouldAutorotateToInterface_fixed: like below:

- (BOOL)shouldAutorotateToInterface_fixed:(UIInterfaceOrientation)toInterfaceOrientation

Also, make sure if you are using addSubview to add your main view to the window that you use setRootViewController instead.

WordPress Themes