Submitting iOS app for preview
Many intricate details required when submitting an app for app store review. This post will touch on privacy terms, app icon, when your app needs to provide user blocking feature, using expo to submit
Money Marshall is an app for tracking shared expenses that I have been working on for the past few months. The first version is designed to emulate features from Splitwise, but my end goal is to have it reminds you of recurring subscriptions and monitoring personal spend budgets as well. To my surprise, a finance app that tracks transactions and i-owe-yous are non-trivial, ensuring transactions are atomic against potential network failure need some careful considerations on the backend. Another surprise is the various hurdles and steps required for app store submission. I am submitting Money Marshall for app store review today and here are the little details of that process that are hard to find information online.
App Icon
The icon and splash screen of the app is managed as part of the total build file. If you are building the app using Expo React Native like I am, look for folder `./assets/`, there are 3 files to replace `icon.png` is for iOS icon, `adaptive-icon.png` for Android icon and `splash.png` for the splash screen. These files are referenced in `app.json` where you could specify which image to use.
{
"expo": {
...
"icon": "src/assets/icon.png",
"splash": {
"image": "src/assets/splash.png",
"resizeMode": "contain"
},
...
"android": {
"adaptiveIcon": {
"foregroundImage": "src/assets/adaptive-icon.png"
},
...
},
Expo provides a helpful video guide for quickly creating icons using Figma.
Screenshots
App Store Connect will require you to submit screenshots of the app for various screen sizes. The best way to generate these is to use the iOS Simulator to open the app, you will need to add at least one device that support that screen size. In Expo, you will need to create a development build for each of the device in iOS Simulator, simply run `eas build —profile development-simulator —platform ios` while having the iOS Simulator open with that particular device. You also need to add development-simulator in eas.json
"build": {
...
"development-simulator": {
"developmentClient": true,
"distribution": "internal",
"ios": {
"simulator": true
}
}
},
Privacy Terms
Apple requires us to declare a privacy policy URL that states the privacy terms and the developer's contact information. I used Claude 3.5 and V0 to build this policy page and then hosted on Vercel. But an even faster way is to use a privacy policy generator like this one: https://www.privacypolicies.com/privacy-policy-generator/
Blocking, Filtering, Reporting
If your app provides features where users interact with each other, it is considered user-generated contents. According to the App Review Guidelines the app must provide functionality to block other users and filter abusive contents. There is no shortcut for this requirement. I hadn’t realized my group shared expenses app is a little social network. You would need to build these features into the app.
Apps with user-generated content present particular challenges, ranging from intellectual property infringement to anonymous bullying. To prevent abuse, apps with user-generated content or social networking services must include:
A method for filtering objectionable material from being posted to the app
A mechanism to report offensive content and timely responses to concerns
The ability to block abusive users from the service
Published contact information so users can easily reach you
Submitting a build from Expo
We need to build the binary for the app for submission, this is easy with Expo Application Service `eas build —platform ios`
Expo makes it simpler to submit a build to App Store for preview. You need to provide your appleId, AppId and Apple Team Id in the project `eas.json`
"submit": {
"production": {
"ios": {
"appleId": "your-apple-id-email-address",
"ascAppId": "look-for-app-id-in-app-store-connect",
"appleTeamId": "look-for-team-id-from-apple-developer-page"
}
}
}
Then Simply run `eas submit -p ios --latest`
Watch this video at 23-25 minutes mark for the step by step guide
Populating data for testing
It is helpful for the review process if you provide a login detail to an account with populated data. I personally use jest library to create scripts for populating the database with data.
That’s all for now. Let’s hope that Money Marshall gets approved 🤞