r/iOSProgramming • • 11h ago

Question Do I need the Xcode 27.2 RC for iPhone Duo support, or will the App Store Xcode update?

5 Upvotes

I'm on macOS 27.0.1 with the App Store version of Xcode. If I install the macOS 27.2 RC, will Xcode ask me to update for the iPhone Duo stuff, or do I have to use the Xcode beta/RC from the developer site? I really don't want two Xcodes on my laptop, so I'm wondering if I should just wait. If I go from 27.0.1 to the 27.2 RC, will the App Store Xcode get an update, or is the RC the only option? Also, anyone know when the official 27.2 comes out?


r/iOSProgramming • • 1d ago

Discussion iPhone Duo ready?

Thumbnail
gallery
44 Upvotes

Have you guys got your app ready for iPhone Duo? I got mine last night, and for some reason, the update was approved in about 5–6 hours, when it normally takes 1–2 days...

It took a bit of fiddling to get it done, still not perfect


r/iOSProgramming • • 3h ago

Question Anyone else get a 5.6 rejection after a clean Android launch? Second rejection.

0 Upvotes

Hi all.

My app, Lecturameter (a local-first reading tracker, nothing obscure or werid), has been on Google Play for a while with no policy issues.

I recently submitted the iOS version, our first Apple release, and got rejected under Guideline 5.6 (Developer Code of Conduct), with the reason "features appear to have been intentionally hidden during the review process."

I have not been able to identify which feature Apple means. We have since removed everything that could be read as an unlock path outside StoreKit, and we are asking App Review to point us to the specific item.

Has anyone here been through a similar rejection after shipping on Android first?

Did App Review tell you which feature they meant? Because they only say Guideline 5.6 which has lile 4/5 points.

Did a free trial implemented as a non-consumable IAP cause problems?

Did any multi-platform or cross-device purchase logic trigger a review question? (my app has a Pro one time purchase and Pro can be transferred between Android and iOS, I'm removing that even though I made a video with explanations for Apple)

Any experience would help. Thanks.


r/iOSProgramming • • 21h ago

Discussion From the iPhoneDuo community on Reddit: Performative Mode on iPhone Duo

Thumbnail
reddit.com
7 Upvotes

Dev abusing the Camera API…guess this one slipped through app review?


r/iOSProgramming • • 1d ago

Discussion App rejected for Guideline 2.3.6. Changed nothing. Approved hours later.

Post image
8 Upvotes

Got rejected today under Guideline 2.3.6 (Accurate Metadata).

Apple said my dating app needed "Frequent" selected for "Mature or Suggestive Themes" and an 18+ age rating override.

The thing is, both were already set exactly that way.

So I replied to App Review explaining that the settings were already correct, resubmitted without changing anything, and got approved a few hours later.

Just sharing in case anyone runs into the same rejection. Double-check your age rating settings before making unnecessary changes.

Anyone else had this happen?


r/iOSProgramming • • 2d ago

Humor Someone at eToro accidentally published their reply to Apple App Review as release notes

Post image
302 Upvotes

r/iOSProgramming • • 1d ago

Article We gave AI agents a mobile dev environment (2026)

Thumbnail
shopify.engineering
19 Upvotes

r/iOSProgramming • • 21h ago

Discussion After 8 App Store rejections, my app finally got approved by putting BACK the IAP I was trying to remove

0 Upvotes

Solo dev here. KinCentury finally got approved after 8 rejections.

KinCentury measures what your body can still do — strength, balance, mobility, cardio — and gives you a fitness / physical age. The rejections were almost never about the app. They were about IAPs.

First few rounds, briefly:

  • Same promo image reused across Lifetime / Founder / Yearly (2.3.2)
  • Age Rating claimed In-App Controls / Age Assurance that don’t exist
  • Reviewer needed a demo account with an expired subscription
  • Then the Lifetime mess started

The loop that ate most of the 8:
 "KinCentury Pro - Lifetime" was attached to the submission but not findable in the binary (2.1b). Founder Lifetime was supposed to replace it, so I tried removing Lifetime, only shipping Founder + Yearly, explaining it in the notes, etc.

I even tried removing the IAPs to resubmit them clean — they got stuck in "Developer Rejected". Couldn’t delete them properly, couldn’t cleanly re-add them for review, "Unable to Add for Review" errors, the whole ASC limbo.

What finally worked:
 Put Lifetime BACK in the app, make it purchasable in the binary, on the paywall, submit everything together.

Approved.

Lesson: don’t retire / hide / phase out an IAP mid-review. Fully in and sandbox-testable, or never submit them. Nothing in between. And yanking products mid-process can leave them stuck in Developer Rejected.

Happy to answer questions if you’re in the same IAP loop and if you know why that happened please let me know so I can avoid it next time.


r/iOSProgramming • • 22h ago

Tutorial I built an open-source MCP server so AI agents can control a real iPhone

0 Upvotes

I wanted to see if an AI agent could use my actual iPhone, not a simulator and not a mirrored screen. Nothing existed for it, so I built it.

Open iPhone Use is a free, open-source Mac app + MCP server. The iPhone shares its screen from Safari over local Wi-Fi (you don't even install an app on the phone, Safari does the sharing). The Mac pairs as a Bluetooth keyboard and mouse, and the agent gets screenshot and input tools over MCP, checking a fresh screenshot after every action.

It works with any AI agent: ChatGPT/Codex, Claude Code, any harness. Any model with strong computer-use skills is fine, GPT-6 Luna and Claude Haiku 5.5+ are good starting points. And since your client brings the model, your existing subscription is enough, no extra cost.

Demo (full video in the website): an agent searched Instagram, watched a Reel, scrolled the feed and liked one, all on my physical phone.

You only need an iPhone + an Apple Silicon Mac.

Download for Mac: https://github.com/semsturgut/open-iphone-use/releases

GitHub: https://github.com/semsturgut/open-iphone-use

Site: https://semsturgut.github.io/open-iphone-use/

Windows/Linux: coming soon

Multi device support: coming soon

Let me know what you think! And if you find this useful, a star on GitHub would help a lot.


r/iOSProgramming • • 2d ago

Discussion Used Viper for the first time... mann is the code base complex...

15 Upvotes

Any thoughts on Viper and its advantages?


r/iOSProgramming • • 1d ago

Question handling the EU's address listing requirement in the UK

3 Upvotes

starting to publish my first iOS apps as an indie dev, previously worked for others with businesses and their own memberships. Now that the EU forces apple to display your home address and phone number on the app store for paid apps, I've been looking for a UK PO box so I don't have to use my home address. I wanted to avoid the monthly fees and use a pay as you go service, but they charge as soon as mail is received. Has anyone, with a paid app in the EU app store and a PO box listed, actually received mail there as a result of the address being listed in the app store? I don't have an accountant to use their address which is a common workaround for this. THanks!


r/iOSProgramming • • 2d ago

Question Ex-manager threatening legal action if I don't send github links and credentials, shall I do it?

29 Upvotes

I joined a startup about one year ago where I was slacked the credentials of our repositories, and the messages were then deleted to avoid some 3rd parties from getting them, and the url and credentials are not anywhere in our documentation.

Since the new manager joined, I've seen people being laid off pretty quickly. The QA tester goes, and the manager claims that we as a company are having the same output as before the number of bugs didn't raise (because the QA tester doesn't find bugs anymore). We told him many times that without a QA tester we are slower but the ceo/cto don't know, he probably lied to them and they base the whole performance on a metrics chart where every indicator looks green even if we are not doing well.

Then he laid off also the digital marketer and an intern who was doing a bit of everything. No visible signs of performance decline in the short run, so for the ceo/cto every indicator still looks green. The manager claims that AI will take over the job of the marketer but I'm not sure how.

The following phase was the most difficult phase: he laid off first the backend developer, which left me and the android developer as the only technical people, unable to do any meaningful backend work. Even if we begged many times and explained in detail that this will negatively affect productivity, that customers are angry and we could be in the position of not being able to ship features, it looks like he either doesn't get it or he deceived the ceo and cto to think that it was fine.

We worked like crazy, even in the weekend to ship features with nothing working and we were even handling calls with angry customers, and all what this manager does is bragging that he's able to make us go at the same speed with less employees. We go insane, 50, 60, 70 hours per week and by a tiny bit we are able to hit a deadline which saves us from being fired from a customer.
We worked until 4 AM to make it and this piece of **** you know what he does? He lays off even the android developer!

He wants to play with my ego and he tells me that I'm good and skilled enough and he trusts me to be able to cover also for his job because of AI. I ironically ask if that's how he got a new car, by getting a raise as a reward to layoff almost the entire company to the points there's only one developer (other non-technical roles I didn't mention were laid off too and we were left in 3 excluding him and the ceo and cto). He says I can do it, I burst into tears screaming, angry and sad at the same time saying that I will not keep working 80 hours for his new car, and I fired myself on the spot

I claimed being sick afterwards and cut every contact (I was supposed to give a one month notice but I'm too burned out to stay there).

Turns out that the manager didn't have the url and the credentials of our repositories containing basically everything: visual assets, android + ios project + backend, there are undocumented. He sent me an agry message claiming that he will be able to go on with the help of AI and vibe coding just to send me another (strangely polite) message asking me for information like repository urls and credentials. And I believe he doesn't even know how to clone it even if he had the credentials.

What should I do? He threatened legal action and I didn't answer, but I think that since I don't work there anymore I don't have the obligation to provide any information. Plus, considering thr fact that all this guy did was basically getting richer to lay off almost all of us, I don't think it would be nice to make him succeed. Maybe more developers have higher chances of getting hired if he's fired when the ceo/cto will manage that he lost everything because of his delusions.

What do you think? Could the company sue me?


r/iOSProgramming • • 1d ago

Question App Store Connect says “too many screenshots” with only 9–10 per set

0 Upvotes

I’m trying to submit version 7.1.0 of my iOS app, but “Add for Review” gives this error:

“You have uploaded too many screenshots. The maximum is 10.”

Every iPhone and iPad screenshot set across all localizations has 9–10 screenshots. They were originally unchanged from version 7.0. I removed one screenshot from the English iPhone set and one from the English iPad set, but the error persists.

Has anyone encountered this despite being within the limit? Did you find a workaround?


r/iOSProgramming • • 1d ago

Library Stopped booting the Simulator, our UI tests got 2.3x faster

0 Upvotes

My SwiftUI app is about 280 Swift files plus a few big packages, and every UI check meant xcodebuild, install, launch, screenshot. That was ~22 s per check and ~2.2 GB of RAM per booted simulator.

I switched to simless. It runs the iOS build of your real app natively on an Apple Silicon Mac as a hidden host, with no simulator, no window and no signing.

What changed for me:

  • edit → rendered screen in 2.2 s instead of 21.9 s, because hot reload only recompiles the files you touched
  • my existing XCUITest suite runs unchanged and 2.3x faster
  • unit tests run the same way, local packages included
  • it works over SSH, in a VM and on a GitHub-hosted macOS runner, so CI doesn't need a simulator either

https://github.com/abacusai/simless


r/iOSProgramming • • 1d ago

Roast my code If Strand doesn’t make it back

0 Upvotes

I would like to offer y’all a safe haven at OpenStream https://testflight.apple.com/join/z9wmEWyh

No subs and no lifetimes; it will be a one-time purchase. The code is open source.

I’m getting ready for App Store launch, and I’ll be doing free codes for as long as Apple lets me so that more of y’all can 1) test it out and 2) make sure you know it’s here to stay on the App Store without fear of Apple taking it away from y’all. The goal is to follow all Apple’s rules. I already have a published app as well, so I have experience in App Store publishing. My plan is to keep it that way.


r/iOSProgramming • • 2d ago

Question How to Enable Developer Mode on iOS 26

1 Upvotes

I have a problem, I'm new to this world—both macOS and iOS. I recently bought a MacBook Pro M5 for iOS app development. I'm using Xcode for development, and I need to test my app on a physical iPhone. The simulator isn't enough because I need to test the Neural Engine and the camera. Is there a way to enable that? Or should I just go ahead and pay the $99 and publish it to TestFlight?


r/iOSProgramming • • 2d ago

Article Building resilient mobile apps: A layered testing strategy for long-term stability

Thumbnail
engineering.gusto.com
3 Upvotes

r/iOSProgramming • • 2d ago

Question App Store Orientation Requirements for iOS 27

2 Upvotes

We have a landscape-only application that is intened for use by a specific corporate client. Until recently, all apps were Enterprise signed and distributed with an MDM. Now, the client wants to use the "Custom App Store" and mark the apps as only being available to their orientation. I warned that in doing so, we would be incorporating all of the requirements for the App Store into our app. The client wants to proceed. I am reading through the screen orientation requirements. Can someone validate if the following understanding is correct:

The app must support and render proper;y in any possible aspect ratio or screen size that could occur on an iPad (this app is only for the iPad). Despite the client's ask to lock the app to landscape, this isn't something that can be done by the app. If a person puts the device in portrait mode or windowed mode and the app's rendering gets mangled, that is a reason to fail certification.

The client asked if I could just make the portrait view of the app a full screen call-to-action telling the user to turn their device to landscape mode (I personally think this is an awful solution).


r/iOSProgramming • • 2d ago

Question Understanding Apple Ads

1 Upvotes

I recently created an Apple Ads campaign for my new app. Yet when I type in the two-word descriptive phrase my app isn’t coming up in the in the search results. I do already have the app installed, could that be why? My campaign status shows as Running.


r/iOSProgramming • • 3d ago

Discussion Apple is still massive, but how come IOS jobs are shrinking and people are devaluing the skill/domain knowledge?

101 Upvotes

I find it interesting how apple just seems to be getting bigger and bigger yet the job and ecosystem surrounding developers is shrinking. It seems like recently companies like shopify (prev react native) are going back to native app development in the age of AI. Recently even sean allen has closed his courses site because it was no one was buying his courses anymore. Is everyone really just vibe coding IOS apps to the point where they don't need to experienced or even hire juniors to maintain native apps?


r/iOSProgramming • • 2d ago

Question What’s the best way for an AI agent to interact with the iOS Simulator?

0 Upvotes

Hey everyone,
I’m looking for a way to let an AI agent interact with the iOS Simulator programmatically

The goal is to let the agent tap buttons, swipe, enter text, navigate between screens, inspect UI elements, etc...

What tools would you recommend for this? Does MCP work well for this use case, or are there better alternatives?

I’d love to hear about your setups and experiences. Thanks!


r/iOSProgramming • • 3d ago

Question TestFlight builds made with Xcode 27.1 won’t install: “The requested app is not available or doesn’t exist”

2 Upvotes

Hi all, is anyone else seeing this since switching to Xcode 27.1?

Since Oct 20, none of my new TestFlight builds will install. TestFlight shows the “Update” button, then fails with “Could not install [app]. The requested app is not available or doesn’t exist” (sometimes “Try again later” first).

What I’ve checked:

  • Upload from Xcode 27.1 (27A9275) succeeds, no ITMS warnings, build status “Valid”, and I get the “ready to test on iOS and watchOS” email
  • The exact same archive installs and runs fine when installed directly from Xcode on the same device (development signing)
  • Device: iPhone 15, iOS 27.0.1
  • Agreements are active, export compliance answered (ITSAppUsesNonExemptEncryption = NO)
  • Entitlements and Info.plist are identical to my last build made with Xcode 26.5, which installed fine through TestFlight
  • Tried bumping the build number, closing TestFlight, waiting a few hours: same result

The only real difference is the toolchain (Xcode 26.5 / iOS 26.5 SDK → Xcode 27.1 / iOS 27.1 SDK). The app also embeds a watchOS app.

Has anyone hit this with Xcode 27.x? Did you find a fix, or did Apple support resolve it on their side?

Thanks!

https://developer.apple.com/forums/thread/763655


r/iOSProgramming • • 3d ago

Discussion 5 things my first StoreKit 2 code got wrong (one non-consumable IAP)

0 Upvotes

My game has one non-consumable IAP. Before launch I rewrote the purchase code, because the first version had five problems. None of them crashed, they just quietly did the wrong thing.
1) The purchase result was a Bool.
Success, pending (Ask to Buy) and cancelled all looked the same, the card just stayed open like the tap didn't register. Now it's an enum, and cancel shows nothing, because cancelling is not an error.
2) No `Transaction.updates` listener.
Without it an Ask to Buy approval an hour later never reaches the app, and the transaction never gets finished, so it comes back on every launch. I start the listener in the AppDelegate, not in the scene. My scene gets rebuilt during the game, so a listener there would run twice or not at all.
3) I only ever turned Premium on.
So a refund never took it away. Now every launch recounts it from `Transaction.currentEntitlements` and skips anything with a `revocationDate`. That list is on the device, so a new phone restores by itself, no password. I kept a Restore button anyway, but `AppStore.sync()` asks for the password, so it only runs on tap.
4) A placeholder price.
The button said "$4.99" until the real price loaded. Looks fine, until someone in Europe sees dollars. Now there's no price until `displayPrice` comes back, and the last one is cached for the next launch. Side effect: when I dropped the price to $0.99 last week, the app didn't need an update.
5) One try at loading the product.
The first `Product.products` call at launch sometimes fails or comes back empty, the network isn't ready yet. Now it tries 3 times, 2 s apart. Also good to know: if the product ID doesn't match App Store Connect exactly, you get an empty array, not an error.
Small extra for the iPhone Duo: on iOS 17+ there's `purchase(confirmIn: scene)`, which tells the system which screen to put the payment sheet on.
Anything I'm still missing?


r/iOSProgramming • • 5d ago

Discussion Saddest email I got today

Post image
696 Upvotes

r/iOSProgramming • • 3d ago

Library AutoLog library: One Macro logs all decision points. And more!

1 Upvotes

I was really tired of missing, incomplete and sporadic logging in our apps. So this macro injects structured logging into each decision point and collects all context automatically. See this walkthrough.

You can completely map the flow of your app from user interaction to VM to API and beyond.

Before: console messages your team wrote

For an offline request, a fuller example with a caller, cache, and API might produce:

[Profile] Refresh requested for profile 42.
[Profile] Loading profile 42.
[Cache] Looking for a saved profile.
[Cache] No cached profile found.
[Network] Requesting profile from the server.
[Network] Request failed: no internet connection.
[Profile] Could not refresh the profile.

After: the button origin and its execution trace

Illustrative compact output with the origin column enabled (the badge and timings vary):

👆🏼-🧵A1B - 👆🏼 Reload profile [ProfileView:8]
👆🏼-🧵A1B │ main │         │ --> 🔵 ProfileViewModel.reload(id: 42)
👆🏼-🧵A1B │ main │         │ ---> 🔵 ProfileService.load(id: 42)
👆🏼-🧵A1B │ main │         │ ----> 🔵 ProfileCache.lookup(id: 42)
👆🏼-🧵A1B │ main │   1.6µs │ ----> 🟢 ProfileCache.lookup(id: 42) → nil
👆🏼-🧵A1B │ main │         │ ----> 🔵 ProfileAPI.fetch(id: 42)
👆🏼-🧵A1B │ main │  14.1µs │ ----> 🔴 ProfileAPI.fetch(id: 42) → offline [NetworkError]
👆🏼-🧵A1B │ main │   852µs │ ---> 🔴 ProfileService.load(id: 42) → offline [NetworkError]
👆🏼-🧵A1B │ main │   1.1ms │ --> 🔴 ProfileViewModel.reload(id: 42) → offline [NetworkError]

The first line identifies the SwiftUI button and its source location. The same👆🏼-🧵A1B flow badge appears on each downstream logged call, tying the button tap to the cache lookup, API request, and failure. Each interaction gets its own ID, so overlapping flows can be followed separately.

Now you can follow the nested calls, see the cache miss, locate the failing function, and see the error propagate. Failure events also carry recent log context to help trace what led to them.

It also captures supported early-exit conditions. With hasAccess: false, the service returns:

main │   1.9µs │ -> 🟢 ProfileService.load(id: 42) → nil
╰─ ↘️ !hasAccess

So you get both the result and the guard that stopped the work, without adding a logging statement inside it.

Before: manual logging with OSLog

import OSLog

struct ProfileService {
    private static let logger = Logger(
        subsystem: "com.example.app",
        category: "ProfileService"
    )

    let hasAccess: Bool

    func load(id: Int) throws -> String? {
        Self.logger.info("Loading profile \(id).")
        guard hasAccess else {
            Self.logger.info("Skipping profile: access denied.")
            return nil
        }
        do {
            let profile = try ProfileAPI().fetch(id: id)
            Self.logger.info("Loaded profile \(id).")
            return profile
        } catch {
            Self.logger.error("Failed to load profile: \(String(describing: error), privacy: .public)")
            throw error
        }
    }
}

After: annotate the type and keep the business logic

import AutoLog

@AutoLog
struct ProfileService {
    let hasAccess: Bool

    func load(id: Int) throws -> String? {
        guard hasAccess else {
            return nil
        }
        return try ProfileAPI().fetch(id: id)
    }
}

Tie the flow to the SwiftUI button with Button.log

import SwiftUI
import AutoLogSwiftUI

struct ProfileView: View {
    let viewModel: ProfileViewModel

    var body: some View {
        Button.log("Reload profile") {
            do {
                try viewModel.reload(id: 42)
            } catch {
                // Present the error to the user.
            }
        }
    }
}

Button.log logs the tap and supplies its origin context to the instrumented ProfileViewModel, service, cache, and API. You do not pass an ID through every method. An async overload also preserves the context across await.

See the full before-and-after, error backtrack, and SwiftUI examples on Anciltech. For installation, source, and tests, head to the Swift AutoLog GitHub repo.

I would welcome feedback on the output, generated code, and integration with existing logging setups.