iOS App Development

Native iOS development at Software Mile is for apps where the iPhone or iPad experience has to be right: performance, device features, and the polish Apple users expect. We build in Swift, ship through the App Store, and keep apps current as iOS moves.

When Native iOS Is Worth It

Native pays off when the app leans on device capabilities – camera, sensors, background processing, offline performance – or when the experience itself is the product. If your app is straightforward and also needs Android, cross-platform may serve you better, and we will say so.

What We Deliver

  • Swift apps built to current iOS and Human Interface Guidelines
  • Device-feature integration: camera, location, notifications, biometrics, offline storage
  • Backend and API integration into your systems
  • App Store submission, review navigation, and ongoing update support

Tell us about your iOS app – features, device requirements, and whether Android is also in scope. We build the app and support it after launch.

What Actually Gets iOS Apps Rejected?

Most rejections are not surprises to anyone who has been through App Store review a few times. They are the same handful of policy items, and almost all of them are easier to design for up front than to retrofit after a rejection has already cost you a release window.

Apple’s guidelines change, so treat the list below as a pattern to watch and check the current guidelines before you build. The practical lesson is to put review time in the launch date instead of assuming approval is instant.

  • Thin functionality. An app that only wraps a website, doing nothing a browser could not, is a recurring rejection reason.
  • Account deletion. If users can create an account inside the app, Apple expects them to be able to delete it there too.
  • Sign in with Apple. Offering third-party social logins generally means offering Apple’s alongside them.
  • Permission purpose strings. Every sensitive permission needs a description that says what you actually do with the data.
  • Privacy details. What you declare on the listing has to match what the app and its embedded SDKs really collect.

Should the App Support iPad, or Just iPhone?

iPad support is not a build setting you switch on. It is a second set of layouts, multitasking behavior in split view, keyboard and pointer input, and a testing pass of its own. A stretched iPhone layout on a large screen reads as unfinished.

Decide by where the work happens. Inspection, clinical, sales, and warehouse workflows where someone fills in a form standing up often benefit from the bigger screen. Consumer and notification-driven apps frequently do not. If you are unsure, ship iPhone first and add iPad once you have evidence people want it.

How Far Back Should You Support Older iOS Versions?

Every additional iOS version you support is another row in the test matrix and sometimes a second code path around an API that did not exist yet. Consumer apps can often track the current release and the one before it, since adoption of new iOS versions tends to move quickly. Managed enterprise fleets are a different case, because devices under an MDM may be held back deliberately.

Get the number instead of guessing it. App Store Connect shows the version spread of your existing users, and for an internal app your device management team already has the inventory. Set the deployment target from that data, then revisit it on a yearly cadence.

Does SwiftUI Versus UIKit Matter to You as a Buyer?

Mostly it should not drive who you hire, but it is worth understanding. SwiftUI describes interfaces declaratively and builds standard screens quickly. UIKit is older and more verbose, and it remains the practical choice for heavily customized controls and some complex list behavior. The two interoperate, so real apps frequently use both.

The question worth asking a developer is why here. A team that can explain where they use each, and how your minimum iOS version constrains that choice, understands the trade-off.

The Annual Release Cycle

Apple ships a major iOS release each year, with developer betas over the preceding months. That cycle sets the rhythm of iOS maintenance: test against the beta through the summer, fix what changed, and have an update ready around the public release. The same annual calendar governs developer program membership and signing certificates, which is reason enough to keep those dates somewhere your team will see them.

What Has to Exist Before Code Starts

Enrollment in the Apple Developer Program should be under your own legal entity, because the account name becomes the developer name on the listing. Organization enrollment requires a registered legal entity and a D-U-N-S number, which is free from Dun and Bradstreet but takes time to obtain if you do not already have one, and the entity name has to match exactly. Individual enrollment is faster and publishes a person's legal name instead of a company. Whoever is named Account Holder accepts Apple's agreements and handles renewal, so it should be someone who will still be with you next year.

Once the account exists, grant people roles rather than sharing a login. Two-factor authentication is required on the Apple Account, so a shared credential means verification codes go to whoever holds the trusted device. The Developer role is enough to build and upload; submitting a build for review and managing the release requires App Manager or above, and only the Account Holder can accept legal agreements. Access granted this way is revocable immediately. The rest of the prerequisites are things only you can supply.

  • A stable API to build against, with a non-production environment and someone who owns it available for questions.
  • A working test account with realistic data, since App Review cannot get past a login screen without one.
  • A privacy policy at a public URL, because a listing cannot be published without one.
  • Icon source art at 1024 by 1024 pixels with no transparency and no rounded corners, since Apple applies the mask itself.
  • If the app sells anything digital, the paid applications agreement plus banking and tax details, which only the Account Holder can complete and which have to be in effect before in-app purchases work even in the sandbox.

The Order the Work Usually Happens In

A common sequence front-loads the decisions that are expensive to reverse: the bundle identifier, whether data has to be usable with no network, and which device capabilities are in scope. Visual detail and copy can move late at little cost. Getting that order backwards is how a project ends up rebuilding its data layer in the last month because offline turned out to be a requirement rather than a preference.

Provisioning is usually settled before feature work, because parts of it are permanent or slow. A bundle identifier cannot be changed once a build has been uploaded under it, and it cannot be reused by a different app afterward. Capabilities such as push, App Groups, iCloud, HealthKit and Sign in with Apple are entitlements attached to the App ID, so adding one later means regenerating provisioning profiles. A few entitlements, CarPlay among them, are granted only after a request to Apple, and that wait is an unpleasant thing to discover in submission week.

Distribution to testers runs through TestFlight. Internal testers are people with App Store Connect access, capped at 100. External groups take up to 10,000 testers by email invitation or public link, and the first external build of a version goes through Beta App Review, which is lighter than App Review but not instant. Builds expire 90 days after upload, so a test group that goes quiet for three months needs a fresh build before it can test anything.

Simulator testing is not device testing. The simulator has no camera, no real motion sensors, no cellular radio and no Secure Enclave, and it runs on the Mac's processor and memory, so it will not show you thermal throttling, battery drain or memory pressure. Hardware age and iOS version are also separate questions: a phone several years old often runs the current iOS while having a fraction of the memory and a much slower chip, and that gap shows up only on the physical device.

Privacy Manifests and Embedded SDKs

Since 2024 the privacy declaration also has to exist inside the build. A privacy manifest, PrivacyInfo.xcprivacy, lists the data types the app collects and, for a short list of API categories, the approved reason for calling them. Apple publishes the allowed reasons, and the notable part is that ordinary system calls now need a stated justification, not only the obviously sensitive ones.

Enforcement happens at upload. App Store Connect sends an email naming the missing declaration, ITMS-91053, and a submission that calls a required-reason API without declaring a reason is rejected. Commonly used third-party SDKs on Apple's list have to ship their own manifest and a signature, which turns every dependency into a maintenance question: an abandoned SDK that never added one becomes a reason to replace it rather than a warning you can defer.

  • File timestamp APIs, including the creation and modification dates returned by ordinary file attribute calls
  • System boot time APIs, often used to measure elapsed time across app launches
  • Disk space APIs, used by anything that checks free space before a download or an export
  • Active keyboard APIs, which reveal the keyboards a user has installed
  • User defaults APIs, meaning UserDefaults itself, which almost every app touches

If the App Is Only for Your Own Staff

The public App Store is not the only way to install an app, and for an employee-facing tool it is frequently the wrong one. Custom apps distributed through Apple Business Manager go to named organizations rather than the public store: still reviewed by Apple, but not listed, not searchable, and not available to anyone you did not specify. Unlisted distribution is the middle option, a normal App Store listing that does not appear in search or browse and is reachable only by direct link, granted by request to Apple.

The Apple Developer Enterprise Program allows in-house distribution with no App Review, hosting the build yourself or pushing it through an MDM, but eligibility is restricted, it covers only apps used by your own employees, and Apple can revoke the signing certificate. Ad Hoc distribution is the small-scale option: up to 100 devices per device type per membership year, each registered by its UDID, which suits a pilot and does not scale past one.

The failure mode with in-house distribution is expiry rather than rejection. In-house provisioning profiles are valid for a year and the distribution certificate for three, and when a profile expires the installed app stops launching for everyone at once. There is no App Store update to push a fix through, so recovery means a re-signed build redistributed by whatever channel you were already using.

There Is No Rollback After Release

Once a version is live on the App Store you cannot put the previous one back. The only correction is a new build with a higher version number, and that build goes through review like any other. Expedited review exists but is granted at Apple's discretion and is not something to plan around. Pulling the app from sale does not help either, since it does not touch the copies already installed.

Two things reduce the damage a bad build can do. Phased release rolls an automatic update out over seven days in increasing percentages and can be paused at any point, though users who open the App Store and update by hand get the new build regardless. Anything you might need to switch off in a hurry belongs behind a server-side flag, because a flag changes behavior without a submission.

Crash reports are useful only if you can read them. A report arrives as memory addresses and is symbolicated into function names and line numbers only if the matching debug symbols were uploaded for that exact build, and a dSYM produced by rebuilding the same source will not match. Xcode Organizer shows only the users who agreed to share analytics with developers, so treat the counts as a sample rather than a total, and a third-party crash reporter needs its own symbol upload on top of that.

Frequently Asked Questions

Does the Apple Developer Program account have to be ours?

Yes, because the account is where the app permanently lives. The app record, its ratings and reviews, and its App Store URL belong to the account that published it. Apple has a transfer process, but it carries conditions, and apps using certain capabilities such as iCloud containers are not eligible. When a transfer is blocked, the alternative is publishing a new listing and starting the reviews and rankings from zero.

What do our testers actually have to do?

Install Apple's free TestFlight app from the App Store, then accept an emailed invitation or open a public link. Feedback goes back through TestFlight rather than through you: a tester can take a screenshot inside the app and annotate it, and after a crash TestFlight offers to send the report with a note attached. Updates arrive through TestFlight rather than the App Store, so testers need to keep it installed for the length of the test.

What does the app need from our backend?

Token-based authentication rather than server-side session cookies. A mobile app sits in the background for weeks and gets terminated by the system without warning, so a scheme with a refresh token the app holds in the Keychain survives that, while a session cookie designed for a browser tab does not. If the endpoints belong to a vendor rather than to you, the constraint is usually contractual: request quotas, a second environment, and a named contact who can raise a limit when testing generates traffic your production plan did not anticipate.

Can an iOS app be built without a Mac?

No. Xcode runs only on macOS, and archiving and code signing a build for submission require it. Continuous integration services and Xcode Cloud remove the need for a Mac on someone's desk, but they are running macOS machines on your behalf rather than replacing the requirement. This mainly matters if you intend to take maintenance in-house later, since that decision comes with hardware.

Is push notification support automatic?

No. Notifications reach devices through Apple Push Notification service, which needs an APNs authentication key generated in your developer account and a server of your own to send from. The token-based key covers every app on the team and does not expire, unlike the older per-app certificates. On the device the permission prompt appears once, and if the user declines, nothing the app does will show it again; only Settings reverses that. Provisional authorization is the alternative, delivering quietly to Notification Center with no prompt so the user decides after seeing what you send.

What do we have to decide, rather than just supply?

The listing text and the legal answers. The App Store name is capped at 30 characters and has to be unique across the store, which is a naming decision that sometimes has to be made twice because the obvious choice is taken. The age rating comes from a questionnaire about the app's content, and every submission answers an export compliance question about encryption. That encryption answer is a statement about your product and belongs to you rather than to whoever writes the code, though it can be recorded once as ITSAppUsesNonExemptEncryption in the Info.plist instead of answered at every upload.

If we build iOS first, does any of it help with Android later?

Not the app code. Swift with UIKit or SwiftUI does not port to Android, so a later Android app is a second build rather than a translation. What does carry over is everything around it: the API, the data model, the permission and authentication decisions, and design work already tested against real users. Shared-logic approaches such as Kotlin Multiplatform exist, but committing to one is a decision made before the first iOS screen is written, not after.