A Best In Class App: Spend Stack Checkup
This post is brought to you by Emerge Tools, the best way to build on mobile.
Update: Spend Stack was acquired, so this list is no longer being updated. But, here’s where I left off!
Previously, I’ve written about this notion of what it looks like to be a best in class iOS app. I wanted a tangible, written down list that I could reference to gauge whether or not I was being a good platform citizen with my own apps.
Now, months later - how am I doing by my own definition? Let’s take a look at where I stand. The grades below have been pulled from the Best in Class post, but some have been altered, added or left out to only include items that can be answered with a yes or no answer as it pertains to Spend Stack.
let concatenatedThoughts = """
With each subsequent release, I'll be updating my progress.
"""
Accessibility
◎ Voice Over fully supported.
◎ Voice Control fully supported.
◎ Voice Over Gestures supported where needed (Magic tap, escape, etc.)
◎ accessibilityIgnoresInvertColors
where needed.
◉ Respects reduced motion and blurring where needed.
◉ Adaptive to all content sizes (i.e. dynamic type).
◉ Uses readableContentGuide
for view that are predominantly text based.
◎ Color contrast is 7:1 or better.
◉ Supported smart color inversion elegantly.
◉ Bar button items supply a crisp landscape and large content size image.
◉ Glyphs have their adjustsImageSizeForAccessibilityContentSizeCategory
set.
◉ Includes closed captions and audio descriptions, all images and icons have alternative text set.
◎ Leading and trailing margins are used for constraints to support left to right languages.
◎ The User Interface appears flawlessly when tested using Double Length Pseudo-languages.
◉ Using NSShowNonLocalizedStrings
yields no results.
◎ If you support drag and drop, UIAccessibilityLocationDescriptors
are all set.
◎ Magic taps are supported for the app’s most common functionality.
◉ It uses CFBundleSpokenName
if the app’s name could potentially be mispronounced by the system (i..e CoolApp23 would be “CoolApp Twenty Three”).
◎ Lastly, running the entire app through Accessibility Inspector produced no warnings and turning on Screen Curtain to navigate the app works flawlessly.
Accessibility: 9/19 - 47%
Platform Technology
◉ Contextual interactions supported (Control previews, home shortcuts, quick actions and interaction delegate for unique experiences).
◎ Spotlight search and indexing support.
◉ Effective energy management (i.e. supports low power mode and reacts to it)
◎ Keyboard shortcuts have been added. The app could be used almost, or completely, with solely the use of a keyboard.
◎ It supports handoff on Mac (if applicable).
◎ Meaningful extensions are included with the app, whether it’s via a share extension, action extension, etc.
◎ Callback urls are supplied and documented so other apps may integrate with it (x-callback-url)/.
◎ Siri Intent support, when plausible:
◎ Siri Shortcuts also include intent phrases to help coach users
◎ Alternate app names are included when appropriate
◎ Watchface support
◎ If it makes sense, document sharing is supported via the file provider.
◉ Drag and drop has first class support:
◎ A fully fleshed out NSItemProvider exists for custom objects.
◉ Purposeful external and internal app drag support.
◉ This is used for reordering, should the app support it.
◎ If it makes sense, data can be shared via AirDrop.
◉ All tab bar images are vector .pdf images or have each corresponding size included to ensure they adapt correctly and are vended to accessibility modals properly.
◎ Any displayed Live Photo will animate when force touched and utilize PHLivePhotoImageView for playback.
◎ Each image also shows their system badge if available (i.e. live photo badges).
◉ Supports printing via UIPrintInteractionController
.
◎ Has Siri Shortcuts supported or donated.
◎ Rich Siri Shortcuts support with parameters.
◎ Running the Analyze function in Xcode yields no errors, warnings or suggestions.
◉ There are no calls to UIGraphicsBeginImageContextWithOptions
, and UIGraphicsImageRenderer
is used instead.
◎ Universal Links are supported, especially if your app’s content is available online.
◉ Modern multitasking is supported (slide over, split view and PiP).
◉ Multiple windows is supported on iPadOS.
◉ If it can be dragged, it can make a new window.
Platform Technology: 11/28 - 39%
User Experience
◉ Supports native “undo” and “redo” actions, typically from shaking or from the iOS 13 gestures.
◉ The content type of all text views and text fields is included, and the correct keyboard type is used for the current context.
◉ The keyboard’s language identifier is integrated correctly.
◎ Handles the keyboard being undocked on the iPad, if views are constrained to it via an inputAccessoryView.
◉ It’s localized and internationalized for all territories it’s released in.
◉ Text tends to not truncate and it never clips but rather it’s always readable.
◉ All tappable interface elements are at least 44 by 44 points.
◉ The entire app binary is under 30 megabytes. (No source here, this is based off a multitude of data points.)
◉ Delete actions always are followed by a confirmation prompt.
◎ If your app stores rich information files like a Keynote presentation, it uses the Quick Look API to preview it.
◎ State restoration is implemented via NSUserActivity
APIs for scenes.
◉ It uses the correct audio settings, if audio can be played at all within it.
◉ Custom edit options are supported when text or an image is selected, if appropriate.
◉ The user is provided ample time to form an opinion about your app before you request a rating for it.
◉ The launch screen is branding free and closely resembles the first screen of the app.
◎ Before opening a link that could lead to another app in a web view or SFSafariViewController
, try calling UIApplication’s openURL:
with the UIApplicationOpenURLOptionUniversalLinksOnlyoption
first.
◉ Table views deselect selected rows in viewDidAppear
when popping back to them.
◎ UITextInputAssistantItem
items are used to support common tasks on iPad that are at home within the shortcuts bar.
◉ When performing CRUD operations on a table or collection view, you opt to use performBatchUpdates:
instead of
reloadData`.
◉ Testing for leaks and freed memory is part of your workflow, as consuming an unnecessary amount of memory and power hampers everyone.
◉ Navigation is clear and foolproof:
- Modality is used sparingly, and clearly brings them back to where they were when dismissed.
User Experience: 16/20 - 74%
Design
◉ Correct system margins are used throughout the app, and no hard coded ones are used (i.e. layoutMarginsGuide, safeAreaLayoutGuide, etc.)
◉ Haptic feedback is used throughout the system to complement user interactions, and they are not overdone.
◉ Controller transitions feel natural and fluid. Great examples are Calendar and Photos.
◉ You opt for vector assets to combat the differing resolutions and avoid any blurry assets.
◉ Your content is always the focus, and you constantly challenge if that’s true throughout the development cycles.
◉ No segment controls are used in toolbars.
◉ There are no toolbars and tab bars in the same screen.
◉ Destructive actions are the last choice in action sheets.
◉ Alerts, if used, ideally have to two choices and titles have no punctuation.
◎ Alerts avoid using Yes and No as choices.
◉ Switches are exclusively used within a table row.
◎ You aspire to ship on all of Apple’s platforms (iOS iPhone + iPad, watchOS, tvOS and macOS).
◎ Lastly, your app is “jank” free. You know what this means for you.
Design: 10/13 - 77%
App Store Presence
◎ An App Store preview video is used.
◎ Its keywords and category were carefully researched.
◉ The app icon follows the golden grid.
◉ The icon follows your brand’s primary color as well.
App Store Presence: 2/4 - 50%
Final Thoughts
No app is perfect, and no app can check off all of the boxes you want. But it’s motivating to have a goal to shoot for, and this list is mine. When it’s all done, I’ll feel extremely proud to have my name behind Spend Stack.
Here’s to creating quality software, and this list being completely checked off sooner rather than later!
Until next time ✌️.