Skip to main content

SBPO Consulting · Mobile

iOS app development that clears review the first time

On iOS the hardware variation is small and the gatekeeping is not. Apple reviews every submission against a published set of guidelines, and most rejections we see were decided months earlier, in a design meeting nobody thought was about App Review. We build with that review in mind from the first sketch.

Where we come in

The ios problems this solves

  • Your submission has been rejected twice and the response cites a guideline number you have to go and look up.
  • The app was built by a contractor under their own Apple Developer account and you are not entirely sure you can get it back.
  • It works, but it feels like an Android app wearing an iPhone costume, and your users have noticed.
  • A new iOS version shipped and half your layouts moved, or a framework you depended on stopped behaving.
  • Your privacy nutrition labels were filled in quickly at submission and you cannot now prove they are accurate.
  • Subscriptions are the business model and the purchase flow is the least reliable part of the product.

The constraint on iOS is not the hardware

Android teams spend their anxiety on devices. iOS teams spend it on review. The device range is narrow and the OS adoption curve is steep, which removes a whole category of problem — and in its place sits a gatekeeper with a published rulebook and the ability to stop your release.

That is the useful frame for iOS app development, because it changes when decisions get made. Most rejections we see were not caused by code. They were caused by a product decision taken months earlier by someone who had no reason to know it mattered: a subscription sold through a payment provider that is not in-app purchase, an account you can create in the app but not delete, an analytics SDK collecting more than the privacy label admits, a build that is essentially the website in a wrapper.

None of that is discovered by testing. It is discovered by reading Apple’s guidelines against your feature list before anyone opens Xcode, which takes an afternoon and is the single highest-return hour in an iOS project.

Swift and SwiftUI as the default

We build in Swift, with SwiftUI as the interface layer and UIKit where a specific control, performance characteristic or legacy integration genuinely calls for it. That is not a purity position: the two interoperate well, and pretending otherwise produces worse apps than mixing them sensibly.

SwiftUI earns its place for the reason declarative interfaces usually do — the interface is a function of state, so an entire class of bug in which the view and the data have quietly diverged stops existing. It also makes the system-level requirements structural rather than optional. Dynamic Type, dark mode, safe area handling and layout adaptation across device sizes come from the framework when you work with it, and have to be fought for when you work around it.

Swift Concurrency handles asynchronous work with structure, which matters more than it sounds: the majority of intermittent, hard-to-reproduce iOS bugs are ordering and threading problems, and code that makes those explicit is code that fails visibly instead of occasionally.

Designing to the Human Interface Guidelines

Apple’s Human Interface Guidelines are not a style guide, they are a description of what your users have already learned. Where a back gesture lives, how a sheet behaves, what a tab bar implies about the structure of the app, when a modal is appropriate — an app that answers these differently feels wrong in a way people describe as “cheap” without being able to say why.

Following the platform is also efficient. System components arrive with accessibility, Dynamic Type support, dark mode and localisation behaviour already correct. Rebuilding them to match a cross-platform design specification means rebuilding those properties too, usually incompletely.

Where the design problem is substantial in its own right — complex flows, dense information, a product people use daily rather than occasionally — we run it as interaction design work with the platform as a constraint, not as a decorating pass over a finished build.

iPhone, iPad and the surfaces beyond

iPad is a separate product decision. Done properly it means adaptive layouts, multitasking and split views, pointer and hardware keyboard support, and content density that suits a screen people use at a desk. Done improperly it means a stretched iPhone layout, which reviewers notice and users resent.

The same is true of a watch app: a different interaction model built around a few seconds of attention, sharing your data layer and business logic but not your interface. Both are worth building when the use case genuinely lives there. Neither is worth building because the app felt incomplete without them.

Architecture, state and the things that decay

The architecture question that matters is whether an engineer who has never met us can open the project and follow it. In practice that means one state management approach applied consistently, a clear boundary between the interface and the data layer, dependencies declared through Swift Package Manager, and no clever indirection that saves fifty lines and costs a day of comprehension.

Persistence is SwiftData or Core Data depending on the minimum OS version and the complexity of the model, network access through URLSession with a typed layer above it, and credentials in the Keychain rather than in user defaults. We review the security surface against the OWASP Mobile Application Security Verification Standard, which covers storage, cryptography, authentication, network and platform interaction — a published document you can hold us to instead of a reassurance you cannot check.

Subscriptions, purchases and StoreKit

If your app sells digital content or subscriptions, in-app purchase is not one integration among many. It is the revenue mechanism, a compliance requirement, and the part of the app most likely to fail quietly.

StoreKit’s modern API gives cryptographically signed transaction records and current subscription status directly, with the App Store Server API and server notifications available for the server side of entitlement. The engineering that repays the effort is in the unglamorous cases: a purchase interrupted by a lost connection, a restore on a new device, a family-shared subscription, a refund, a subscription that lapses and resumes, a user who bought on one platform and signed in on another.

Getting entitlement wrong is worse than most bugs because it is a billing problem as well as a technical one. We treat it as its own testable subsystem rather than as a screen.

Privacy is a build-time obligation now

Apple’s privacy requirements have shifted from a disclosure exercise to a supply chain one, and they are worth understanding before you choose your third-party SDKs.

App privacy details — the nutrition labels shown on your listing — must cover not only what you collect but what every third-party SDK embedded in your app collects, whether that data is linked to the user’s identity, and whether it is used for tracking. Alongside that sit privacy manifests and signatures for third-party SDKs, which exist precisely because “we did not know what the analytics library was doing” stopped being an acceptable answer.

App Tracking Transparency is the other half. Tracking a user across apps and websites owned by other companies requires explicit permission before the advertising identifier is available. The product consequence is that attribution and retargeting need designing around first-party and aggregated measurement, and the design consequence is that where and when you ask for permission materially changes whether anyone says yes.

We build the label from an inventory rather than from memory, and where a declaration cannot be evidenced, we remove the collection rather than soften the wording.

Accessibility and profiling

VoiceOver and Dynamic Type are the two tests that find nearly everything. Navigating a screen with VoiceOver running exposes unlabelled controls and nonsensical focus order in seconds. Rendering the app at the largest accessibility text sizes exposes every layout built on the assumption that text has a fixed height — which is most layouts, until someone checks. Apple’s accessibility guidance and the underlying WCAG success criteria give a common vocabulary for that work, including contrast and target size expectations.

Performance follows the same principle of measuring rather than guessing. Instruments shows where time, memory and energy actually go, profiled on the oldest device you have committed to supporting, because launch time and scrolling smoothness on last year’s flagship tell you almost nothing about the phone your customer is holding.

The submission, rehearsed

Before we submit, we run our own review against the guidelines. Metadata matches the app; every link works; the demo account signs in and reaches the functionality being demonstrated; permission prompts carry purpose strings a human wrote; account deletion exists where accounts do; purchase flows use in-app purchase where required; the privacy declarations match the SDK inventory.

TestFlight comes before that, and is more useful than most teams make it. It supports up to 100 internal testers and up to 10,000 external testers, with external builds passing a Beta App Review first — which is, conveniently, a cheap early signal about anything obviously non-compliant. Build notes that say what changed and what to look at turn testers into a source of specific feedback rather than a source of “seems fine”.

Once approved, the listing becomes its own discipline: App Store optimisation determines whether the app is found at all, and it is a different skill from building it.

Testing before the testers

TestFlight is the last line, not the first. Underneath it sit unit tests around the logic that would be expensive to get wrong — pricing, entitlement, date handling, anything with a state machine — and UI tests covering the small number of journeys the business depends on. Exhaustive UI test suites tend to rot faster than they catch things, so we keep them narrow and reliable rather than broad and ignored.

The cases worth writing tests for are usually the ones nobody demonstrates in a review meeting: the app resumed after the system terminated it in the background, a token that expired while the phone was in a pocket, a push notification tapped from a cold start, a form half-completed when a call arrived. On iOS these are the defects that reach production, because the happy path is comfortably covered by the person who built it.

Maintenance runs on Apple’s calendar

An iOS app has an annual fixture whether or not there is a budget line for it. A major OS version arrives each year, and with it behaviour changes, deprecated APIs, altered system control rendering, and third-party SDKs that need updating before they work again.

The sensible response is to treat the beta period as scheduled work. Apple publishes developer betas months before public release, which is the window in which layout regressions and framework changes should be found — on your device, deliberately, rather than on a customer’s device on the day the update lands. Compatibility work goes in first; adopting genuinely new capabilities is a separate decision made on merit rather than on novelty.

The rest of maintenance is unglamorous and predictable: certificate and provisioning renewals, dependency updates, crash triage from the reports that actually arrive, and periodic re-verification that the privacy declarations still match what the app and its SDKs do after a year of changes. None of it produces a feature, which is precisely why it gets dropped from budgets and then reappears as an emergency. We map it against the calendar at the start of an engagement so it stays visible.

Where iOS sits alongside everything else

If both platforms are in scope, the Android side has an entirely different centre of gravity — device fragmentation, store vitals thresholds and target API deadlines — and it deserves its own plan rather than a translation of this one. Where the feature set does not demand platform-specific depth, a shared codebase may be the better commercial answer, and the trade-offs are set out on our mobile app development page.

If you have an app already and mostly want to know whether it will survive the next iOS release, an audit is a sensible first conversation and does not commit you to anything further.

Scope

What our ios app development services include

Every engagement is scoped in writing before it starts. These are the artefacts that leave our hands and become yours.

  1. A production iOS app in a repository you own

    Swift source, an Xcode project that builds from a clean checkout, dependency configuration through Swift Package Manager, and documentation clear enough for an engineer who has never seen it to produce a signed archive.

  2. Screen designs built to Apple conventions

    Navigation, typography, motion and control behaviour drawn from the Human Interface Guidelines rather than translated from another platform, with dark mode and Dynamic Type treated as requirements rather than as later additions.

  3. Certificates, profiles and account control in your name

    The Apple Developer Program membership belongs to your organisation, with signing certificates and provisioning profiles documented and your team holding the Account Holder role. We work inside your account, never in place of it.

  4. A TestFlight programme, not just a build upload

    Internal and external tester groups configured, build notes written so testers know what changed and what to look at, and feedback routed somewhere a human reads it rather than into an unattended inbox.

  5. Privacy declarations you can defend

    App privacy details on the App Store mapped from an actual inventory of what the app and its third-party SDKs collect, alongside the privacy manifest work that supply chain now requires. Accurate first time is cheaper than corrected later.

  6. App Store Connect listing and submission

    Listing copy, screenshots at required device sizes, age rating, App Review Information with demo credentials and reviewer notes, and the submission itself managed through to approval.

  7. Crash reporting and release monitoring

    Crash and error reporting configured before launch with a named recipient, plus a monitored window after release where regressions are found in the data rather than in the reviews.

  8. An annual upgrade plan

    A written view of what the next iOS release changes for your app, which deprecated APIs need attention, and when the work should happen — so the September release is a scheduled task rather than a fire.

How it runs

How SBPO Consulting delivers ios

  1. Read the guidelines before designing the app

    Certain features carry review consequences that are much cheaper to know about at the start: account creation obliges you to offer account deletion, digital goods must use in-app purchase, and an app that is essentially a website will be rejected under minimum functionality. We flag these against your feature list before design begins.

  2. Design to the platform

    Structure, navigation and gesture behaviour follow the Apple Human Interface Guidelines, with Dynamic Type, dark mode and safe areas as constraints on the design rather than as engineering problems inherited from it.

  3. Build in Swift with SwiftUI as the default

    SwiftUI for interface, with UIKit where a specific control or performance characteristic genuinely requires it. State handling is decided once and applied consistently, because inconsistent state management is the single most common source of odd, hard-to-reproduce bugs on iOS.

  4. Profile before optimising

    Instruments is used to find where time, memory and energy actually go, rather than optimising by intuition. Launch time, scrolling performance and battery impact are measured on the oldest device in your support matrix, not on the newest one on the desk.

  5. Rehearse the review

    Before submission we run our own pass against the App Review Guidelines: metadata accuracy, privacy declarations against actual SDK behaviour, permission prompts with meaningful purpose strings, account deletion, purchase flows, and a demo account that a reviewer can actually sign into.

  6. Ship, monitor, and plan for September

    Phased release with crash rates watched, then a maintenance rhythm built around Apple's annual cycle: beta OS testing during the summer, compatibility work before the public release, and adoption of new capabilities when they are worth it rather than because they are new.

Tooling

Tools and platforms we use for ios

We pick tools for the problem, not for the résumé. Where a platform is a poor fit we will say so before you have paid for it.

Language and UI

  • Swift
  • SwiftUI
  • UIKit
  • Swift Concurrency
  • Combine

Data and services

  • SwiftData
  • Core Data
  • URLSession
  • Keychain Services
  • Apple Push Notification service

Commerce and identity

  • StoreKit 2
  • Sign in with Apple
  • App Store Server API

Tooling

  • Xcode
  • Swift Package Manager
  • Instruments
  • Fastlane

Quality and release

  • XCTest
  • XCUITest
  • TestFlight
  • App Store Connect
  • Firebase Crashlytics

Non-negotiables

The standards SBPO Consulting works to

These are checkable. Ask us to demonstrate any of them on your own project before you sign anything.

  1. Your Apple Developer account, always

    The Apple Developer Program membership is registered to your organisation and your team holds the Account Holder role. An app published under an agency account is a dependency you should never accept, and we will not ask you to.

  2. A guideline review before every submission

    We check the build and its metadata against the App Review Guidelines ourselves before sending it, because a rejection costs a review cycle and the fix is nearly always something we could have caught in an hour.

  3. Privacy declarations built from an inventory

    Nutrition labels are compiled from a list of what the app and each third-party SDK actually collects, not from memory at submission time. If a declaration cannot be evidenced, the collection gets removed rather than the declaration softened.

  4. VoiceOver and Dynamic Type tested, not assumed

    Every screen is navigated with VoiceOver running and rendered at the largest accessibility text sizes. Layouts that clip or become unreachable at those sizes are treated as defects rather than as edge cases.

Questions

ios app development services — questions we get asked

Which iOS versions should my app support?

iOS adoption moves quickly compared with Android, so supporting the current version and the one before it covers the large majority of active devices for most consumer products. The decision is still commercial rather than technical: each older version you support constrains which APIs you can use without fallback code, and adds testing. There are exceptions worth checking, particularly enterprise fleets and education deployments where devices are updated on a managed schedule. We look at your own analytics if the app already exists, and at your market if it does not, then write the supported range into the scope so it is a decision rather than a default.

How long does Apple App Store review usually take?

Review is generally short relative to the project, but it is not the only variable and it is not something you should plan tightly around. App Store Connect allows one app version submission under review at a time per platform, so a rejection means a fix, a resubmission and another wait rather than a parallel attempt. That is why preparation matters more than speed: complete metadata, working links, a demo account that actually signs in, and reviewer notes explaining anything non-obvious. Apple also offers expedited review requests for genuine emergencies, which are best kept in reserve rather than used as a scheduling tool.

What are the most common reasons apps get rejected?

The App Review Guidelines are organised into five sections — Safety, Performance, Business, Design and Legal — and rejections cluster in a small number of places within them. Guideline 2.1, App Completeness, covers submissions with placeholder content, broken links, unreachable backends or demo accounts that do not work. Guideline 4.2, Minimum Functionality, catches apps that are essentially a repackaged website or a marketing brochure. Beyond those, the recurring causes are inaccurate privacy declarations, payment flows for digital goods that route around in-app purchase, permission requests without a clear purpose string, and missing account deletion where an account can be created. Nearly all of them are decided at design time rather than in code.

Do I need an Apple Developer Program account of my own?

Yes, and we insist on it. The App Store listing, the app identifier, the signing certificates and the customer relationship all live inside that account, and an app published under a developer's account is a dependency you cannot easily unwind. We work as members of your team inside your organisation's account, with our access removable at any point. If you have inherited an app that sits inside someone else's account, transferring it is possible but has conditions, and that is worth resolving before further money is spent on it.

Can you build an iPad or Apple Watch version too?

Yes, but they should be scoped as their own products rather than as checkboxes. iPad is not a large iPhone: it brings multitasking, split views, pointer and keyboard support, and layouts that have to adapt to genuinely different proportions. A watch app is a different design problem again, built around glanceable interactions measured in seconds. Both share your data layer and business logic, which is where the reuse actually is, but the interface work is new. We will tell you honestly when a second surface is unlikely to earn its keep.

What does App Tracking Transparency mean for my analytics?

App Tracking Transparency requires an app to obtain explicit permission before accessing the advertising identifier to track a user across apps and websites owned by other companies. It does not prevent you from understanding your own product. First-party analytics about how people use your app, measured without cross-company tracking identifiers, remain available and are usually more useful for product decisions anyway. The practical implications are for attribution and retargeting, which need to be designed around aggregated and first-party measurement. It also means the permission prompt itself deserves design attention, since the context you show it in materially affects whether anyone agrees.

What happens to my app when a new iOS version ships?

Something, almost every year. A new release can change layout behaviour, alter how system controls render, deprecate APIs you depend on, and occasionally break a third-party SDK until its maintainer catches up. Apple publishes betas over the summer, which is the window in which this should be found — testing an existing app against the beta and fixing what moves before the public release, rather than after your users have installed it. We plan that work into the maintenance schedule as an annual fixture, separately from any new features, because it happens whether or not there is a budget line for it.

Adjacent work

Android

Kotlin and Jetpack Compose Android apps, built for the real spread of devices and OS versions your users carry, and kept inside Google Play policy long after launch.

Cross-platform

Flutter and React Native apps built from a single codebase, with the framework chosen on your constraints and the cases where cross-platform is the wrong answer named before you commit.

App store optimization

Keyword strategy, listing copy, creative testing and store analytics for the App Store and Google Play — measured on installs and retained users, not on ranking screenshots.

Part of our mobile apps practice.

Mobile

Let's talk about your ios work.

Send us the problem, the constraint and the deadline. You will get a considered reply from someone who would actually do the work — not a templated proposal.