Post

Replies

Boosts

Views

Activity

Reply to App stuck in "Waiting for Review" since July 14 — reviewer never assigned despite multiple resubmissions since June 
Sadly the review times have spiked immensely due to a huge influx of new app submissions. Every time you cancel and resubmit you end up at the bottom of the queue. It used to be that reviews would happen within 24 hours, but now it's not uncommon for it to take a week with outliers of multiple weeks.
1w
Reply to My payments are on hold
This usually happens when there's a spike in refund requests. If nothing untoward is happening and this is a one off anomaly, things usually return back to normal. If they however find that there are deceptive practices or dark patterns, then they'll either tell you to change things or terminate your account. In either case, there is nothing you can do until they complete their review.
1w
Reply to First-time App Store launch: Is this timeline and cost realistic for an individual developer account?
Normally I'd say that the business side of things takes about a week (in part also depending on how easy it is to register in your jurisdiction). But processing times on Apple's side has apparently skyrocketed due to a huge influx of people struck by a gold rush. So a conservative estimate is a few weeks to a month nowadays. As for the actual app-side of things, it's going to take more than throwing a wrapper around your web app to get through review. Especially now with the huge influx of apps, not only does it take longer to get through review, but App Review is also much more sensitive to poor experiences, things that could've just been a web app or web page, dime a dozen type apps (what they consider spam) and the like. Any "MVP" that doesn't feel like a first-class experience runs the risk of getting scrutinized. 2-3 months could be realistic if it's a rather small project, but I'd expect at least 3-6 months to be more likely for something solid and elaborate provided the backend is in place in a proper way and already suitable to support his app. The fact that a web app version already exists has very little bearing on this. As for the price, honestly it sounds a bit too good to be true. The average iOS engineer makes about ~$10,000 USD/month (actually closer to $70 USD per hour) on a salaried job. A contractor typically starts at around $100 USD per hour because they have some significant self-employment taxes to offset. Instinctively you might feel that these rates aren't relevant to you if you're not in the US, but keep in mind that the contractors in your area can just as easily do jobs for US clients at $100/hr via platforms like Upwork and the like. Besides, wherever you are, there is no way that the going rate is 10% of this. So at this point I'm wondering if they just severely undervalue their work combined with simply extremely lucking out on this quote or if they're quoting you very low to get a foot in the door with the idea of it ballooning once you've got sunk cost. Either way, I'd immediately start to get suspicious of these low numbers. Even if you were to outsource it to extremely cheap overseas labor and it does end up being just 2-3 months, I'd get ready to expect it to cost in the $5,000 USD - $10,000 USD range.
1w
Reply to Pending Termination Notice 4.3 (Spam) – Appeal Submitted 7 days ago but no confirmation or response
It might help to read the specific guidelines in question. Apple is saying that your apps are very similar to others that already exist in the App Store in concept. Say for example your game is a Flappy Bird clone with near identical gameplay, then it doesn't matter if you designed and created all the assets yourself and every single line of code is handwritten by you, the problem would be that it's yet another game with similar gameplay. That's the issue when they refer to spam. I recommend you take the time to be very honest with yourself and figure out if your games are truly unique or something that the App Store already saturated with (could very well be unique, I haven't taken a look), and decide your next steps based on that.
1w
Reply to App Stuck in "Waiting for Review" for Over 48 Hours Despite Expedited Review Request
Sadly the review times lately have sky rocketed in part due to the new influx of vibe coders chasing gold. This includes processing times for expedited reviews. There isn't much you can do about this other than wait it out. But I suppose you could always try to contact dev support via phone to see if they can do anything for you.
1w
Reply to Better alternative to WWDC's `withContinuousObservation` in View initializers for SwiftData?
WWDC sample code and code-alongs aren't meant to be architectural endorsements, just quick and easy ways to introduce new stuff in the shortest, most isolated way possible so you can see how the syntax works in a brief video. Your proposed workaround has a couple of key flaws and risks: It will silently fail during CloudKit Sync and database loads. When SwiftData pulls an item from the SQLite database into memory or when CK downloads a remote sync change, it will bypass computed properties entirely, and instead directly populate the underlying stored backing field (_title) using the internal BackingData engine. So if a user modifies an item's title on their iPad, CK will sync that change down to their iPhone. The iPhone will directly apply the update to _title and as a result, because the custom setter for title is completely bypassed updatedAt will never be updated. So now you're dealing with permanent data drift and desync across user devices. It also breaks the context transaction and undo engine. The transaction engine can't track the dirty state and is unable to handle undo/redo operations because it'll roll back _title but the custom setter won't execute and now updatedAt is stuck in the future. I think it's also risky for predicate evaluation and KeyPath tracking. When a SwiftUI view evaluates item.title it goes through a computed gateway to read _title, and while basic observation might still find the dependency, once we get to deeply nested filtering, sectioned fetches or complex data graph evaluations things might fail because the public title property doesn't directly map to a verified storage index. And like you already noted, it forces the underlying database columns to be saved as _TITLE instead of TITLE, so now your database schema is permanently polluted with implementation details because there is no custom columnName modifier. CK console debugging will become very confusing if you ever share the database with a non-SwiftData client and it will make future lightweight schema migrations a nightmare. I recommend either putting withContinousObservation in a .task modifier if the side effects is strictly for the UI, or using a coordinator and ModelActor if the side effect is for the data. .task example: import SwiftUI import Observation import SwiftData struct ActivityDetailView: View { let activity: Activity // 1. A stable place to store the token for the lifetime of this view @State private var observationToken: ObservationTracking.Token? var body: some View { Form { TextField("Activity Name", text: Bindable(activity).name) LabeledContent("Last Updated") { Text(activity.updatedAt.formatted(date: .omitted, time: .standard)) } } // 2. The task modifier manages the lifecycle safely .task { // Cancel any old token just in case of unexpected task restarts observationToken?.cancel() // 3. Initialize the loop once when the view appears observationToken = withContinuousObservation(options: .didSet) { event in // 4. Check if the mutation matches the property we care about if event.matches(\Activity.name) { // Because .task defaults to the @MainActor, this inline write // runs safely within the main rendering loop activity.updatedAt = .now } } } // 5. Automatic cleanup! The second the user leaves this screen, // the task scope cancels, tearing down the token automatically. } } There is zero init overhead, if the parent view reevaluates this view 100 times due to an animation or structural layout change the code in .task is completely skipped, it executes exactly once when the view physically takes up space on the screen Because the .task modifier inherits @MainActor isolation by default the code block is guaranteed to run on the main thread, so you avoid cross thread data races You don't have to worry about accidentally leaking memory or creating zombie looks because SwiftUI handles tearing down the async environment the moment the view is removed from the hierarchy That said, the boundary is visibility, so if that's a deal breaker or you need to avoid blocking the main thread then I'd recommend a different approach. Coordinator + ModelActor example: import Observation import SwiftData import Foundation // 1. The model remains clean and free of custom setters @Model class Activity { var name: String var updatedAt: Date var token: ObservationTracking.Token? // Kept here if you want it model-scoped init(name: String) { self.name = name self.updatedAt = .now } } // 2. The Background Actor handles the actual database write transaction @ModelActor actor ActivityDataEngine { func applyTimestampSideEffect(for identifier: PersistentIdentifier) { guard let activity = modelContext.model(for: identifier) as? Activity else { return } // This is where our actual business logic side-effect lives activity.updatedAt = .now // Save the transaction safely off the main thread try? modelContext.save() } } // 3. The Coordinator Service provides the "stable home" for the continuous observation @MainActor class ActivityCoordinator { private let dataEngine: ActivityDataEngine private var observationToken: ObservationTracking.Token? init(container: ModelContainer) { self.dataEngine = ActivityDataEngine(container: container) } func registerPersistentObservation(on activity: Activity) { // Discard any existing token to prevent duplicates observationToken?.cancel() let activityID = activity.id // This loop is initialized ONCE. It survives view teardowns entirely. observationToken = withContinuousObservation(options: .didSet) { [weak self] event in guard let self else { return } // The moment ANY property changes on this activity, the observation fires. // We hand the persistent ID over to our background actor to do the heavy lifting. Task { await self.dataEngine.applyTimestampSideEffect(for: activityID) } } } } The view layer simply displays the data, when it appears it calls coordinator.registerPersistentObservation(on: activity) inside a .task, the coordinator holds the single active observation token By passing the PersistentIdentifier down to the ActivityDataEngine actor the main thread is instantly freed up, preventing UI stutters
Jun ’26
Reply to Auto Renewable Subscription Localization Rejected Repeatedly Without Explanation
It's hard to say without more information. Are you sure that the red banner on your product page doesn't contain a link with an explanation? Usually when you get localization rejection its due to potentially confusing strings between products. Is there a chance that in a list your localization strings wouldn't make clear which one is your 6 months and which one is your annual product? It also helps if you don't have a build in review at the same time, sometimes the review team will otherwise assume they should be able to find the products in question without hassle (i.e. even though you might have these to test pricing).
Jun ’26
Reply to macOS 27 Beta 1 Install Failure
Boot into Recovery Mode and make sure the Security Policy is set to Full Security in the Startup Security Utility. The current beta seems to ignore it when it's not set to Full Security and still tries to create a personalization ticket (i.e. follow the Full Security protocol) and fail in attempting to do so.
Topic: Community SubTopic: Apple Developers Tags:
Jun ’26
Reply to Subscription must be submitted with new app version.
"Prepare for submission" usually means you need to click the save button at the top first, that should change it to "Ready to submit" and at that point you should be able to add it to your submission draft. Just keep in mind that the Subscription Group itself also needs to be added to the draft (to review the localized user facing subcription group name).
Replies
Boosts
Views
Activity
1w
Reply to App stuck in "Waiting for Review" since July 14 — reviewer never assigned despite multiple resubmissions since June 
Sadly the review times have spiked immensely due to a huge influx of new app submissions. Every time you cancel and resubmit you end up at the bottom of the queue. It used to be that reviews would happen within 24 hours, but now it's not uncommon for it to take a week with outliers of multiple weeks.
Replies
Boosts
Views
Activity
1w
Reply to STATE_ERROR.SUBSCRIPTION_SUBMISSION_REQUIRES_GROUP_VERSION blocking first subscription submission
Did you add the build, the subscription group and the individual subscription products to the submission?
Replies
Boosts
Views
Activity
1w
Reply to My payments are on hold
This usually happens when there's a spike in refund requests. If nothing untoward is happening and this is a one off anomaly, things usually return back to normal. If they however find that there are deceptive practices or dark patterns, then they'll either tell you to change things or terminate your account. In either case, there is nothing you can do until they complete their review.
Replies
Boosts
Views
Activity
1w
Reply to First-time App Store launch: Is this timeline and cost realistic for an individual developer account?
Normally I'd say that the business side of things takes about a week (in part also depending on how easy it is to register in your jurisdiction). But processing times on Apple's side has apparently skyrocketed due to a huge influx of people struck by a gold rush. So a conservative estimate is a few weeks to a month nowadays. As for the actual app-side of things, it's going to take more than throwing a wrapper around your web app to get through review. Especially now with the huge influx of apps, not only does it take longer to get through review, but App Review is also much more sensitive to poor experiences, things that could've just been a web app or web page, dime a dozen type apps (what they consider spam) and the like. Any "MVP" that doesn't feel like a first-class experience runs the risk of getting scrutinized. 2-3 months could be realistic if it's a rather small project, but I'd expect at least 3-6 months to be more likely for something solid and elaborate provided the backend is in place in a proper way and already suitable to support his app. The fact that a web app version already exists has very little bearing on this. As for the price, honestly it sounds a bit too good to be true. The average iOS engineer makes about ~$10,000 USD/month (actually closer to $70 USD per hour) on a salaried job. A contractor typically starts at around $100 USD per hour because they have some significant self-employment taxes to offset. Instinctively you might feel that these rates aren't relevant to you if you're not in the US, but keep in mind that the contractors in your area can just as easily do jobs for US clients at $100/hr via platforms like Upwork and the like. Besides, wherever you are, there is no way that the going rate is 10% of this. So at this point I'm wondering if they just severely undervalue their work combined with simply extremely lucking out on this quote or if they're quoting you very low to get a foot in the door with the idea of it ballooning once you've got sunk cost. Either way, I'd immediately start to get suspicious of these low numbers. Even if you were to outsource it to extremely cheap overseas labor and it does end up being just 2-3 months, I'd get ready to expect it to cost in the $5,000 USD - $10,000 USD range.
Replies
Boosts
Views
Activity
1w
Reply to Pending Termination Notice 4.3 (Spam) – Appeal Submitted 7 days ago but no confirmation or response
It might help to read the specific guidelines in question. Apple is saying that your apps are very similar to others that already exist in the App Store in concept. Say for example your game is a Flappy Bird clone with near identical gameplay, then it doesn't matter if you designed and created all the assets yourself and every single line of code is handwritten by you, the problem would be that it's yet another game with similar gameplay. That's the issue when they refer to spam. I recommend you take the time to be very honest with yourself and figure out if your games are truly unique or something that the App Store already saturated with (could very well be unique, I haven't taken a look), and decide your next steps based on that.
Replies
Boosts
Views
Activity
1w
Reply to My subscription is stuck in "Waiting for review" Since weeks
Apple sent out an email earlier this week about a change in App Store Connect causing subscriptions and in-app purchases to be get stuck in review. I would recommend creating new ones and submitting those.
Replies
Boosts
Views
Activity
1w
Reply to From an Uber driver to a solo app founder, and losing it all overnight
I'm sorry but your posts read like ChatGPT output. The same rhythm, the same "-isms", the same emoji use. Perhaps it would come across better if you just use your own words. I can't imagine it would've helped if you used the same output in your communication with Apple.
Replies
Boosts
Views
Activity
1w
Reply to Organization enrollment (US LLC) in processing for 10 days — Enrollment ID BH7HZA7Z9B, no contact from Developer Support
Processing times have significantly increased with the influx of new developers. You can wait it out or contact developer support to see if you can provide anything to expedite the process.
Replies
Boosts
Views
Activity
1w
Reply to Repeated Guideline 4.3(a) rejection for an original Unity game — no actionable clarification after 3 months
Could it be that your account or that of another developer in the organization is affiliated with a terminated developer account? I think your best bet in this instance to request a call in your reply to App Review to see if you can find out what exactly is causing the rejection.
Replies
Boosts
Views
Activity
1w
Reply to Subscription must be submitted with new app version.
Have you uploaded a new build to attach the subscription products to?
Replies
Boosts
Views
Activity
1w
Reply to App Stuck in "Waiting for Review" for Over 48 Hours Despite Expedited Review Request
Sadly the review times lately have sky rocketed in part due to the new influx of vibe coders chasing gold. This includes processing times for expedited reviews. There isn't much you can do about this other than wait it out. But I suppose you could always try to contact dev support via phone to see if they can do anything for you.
Replies
Boosts
Views
Activity
1w
Reply to Better alternative to WWDC's `withContinuousObservation` in View initializers for SwiftData?
WWDC sample code and code-alongs aren't meant to be architectural endorsements, just quick and easy ways to introduce new stuff in the shortest, most isolated way possible so you can see how the syntax works in a brief video. Your proposed workaround has a couple of key flaws and risks: It will silently fail during CloudKit Sync and database loads. When SwiftData pulls an item from the SQLite database into memory or when CK downloads a remote sync change, it will bypass computed properties entirely, and instead directly populate the underlying stored backing field (_title) using the internal BackingData engine. So if a user modifies an item's title on their iPad, CK will sync that change down to their iPhone. The iPhone will directly apply the update to _title and as a result, because the custom setter for title is completely bypassed updatedAt will never be updated. So now you're dealing with permanent data drift and desync across user devices. It also breaks the context transaction and undo engine. The transaction engine can't track the dirty state and is unable to handle undo/redo operations because it'll roll back _title but the custom setter won't execute and now updatedAt is stuck in the future. I think it's also risky for predicate evaluation and KeyPath tracking. When a SwiftUI view evaluates item.title it goes through a computed gateway to read _title, and while basic observation might still find the dependency, once we get to deeply nested filtering, sectioned fetches or complex data graph evaluations things might fail because the public title property doesn't directly map to a verified storage index. And like you already noted, it forces the underlying database columns to be saved as _TITLE instead of TITLE, so now your database schema is permanently polluted with implementation details because there is no custom columnName modifier. CK console debugging will become very confusing if you ever share the database with a non-SwiftData client and it will make future lightweight schema migrations a nightmare. I recommend either putting withContinousObservation in a .task modifier if the side effects is strictly for the UI, or using a coordinator and ModelActor if the side effect is for the data. .task example: import SwiftUI import Observation import SwiftData struct ActivityDetailView: View { let activity: Activity // 1. A stable place to store the token for the lifetime of this view @State private var observationToken: ObservationTracking.Token? var body: some View { Form { TextField("Activity Name", text: Bindable(activity).name) LabeledContent("Last Updated") { Text(activity.updatedAt.formatted(date: .omitted, time: .standard)) } } // 2. The task modifier manages the lifecycle safely .task { // Cancel any old token just in case of unexpected task restarts observationToken?.cancel() // 3. Initialize the loop once when the view appears observationToken = withContinuousObservation(options: .didSet) { event in // 4. Check if the mutation matches the property we care about if event.matches(\Activity.name) { // Because .task defaults to the @MainActor, this inline write // runs safely within the main rendering loop activity.updatedAt = .now } } } // 5. Automatic cleanup! The second the user leaves this screen, // the task scope cancels, tearing down the token automatically. } } There is zero init overhead, if the parent view reevaluates this view 100 times due to an animation or structural layout change the code in .task is completely skipped, it executes exactly once when the view physically takes up space on the screen Because the .task modifier inherits @MainActor isolation by default the code block is guaranteed to run on the main thread, so you avoid cross thread data races You don't have to worry about accidentally leaking memory or creating zombie looks because SwiftUI handles tearing down the async environment the moment the view is removed from the hierarchy That said, the boundary is visibility, so if that's a deal breaker or you need to avoid blocking the main thread then I'd recommend a different approach. Coordinator + ModelActor example: import Observation import SwiftData import Foundation // 1. The model remains clean and free of custom setters @Model class Activity { var name: String var updatedAt: Date var token: ObservationTracking.Token? // Kept here if you want it model-scoped init(name: String) { self.name = name self.updatedAt = .now } } // 2. The Background Actor handles the actual database write transaction @ModelActor actor ActivityDataEngine { func applyTimestampSideEffect(for identifier: PersistentIdentifier) { guard let activity = modelContext.model(for: identifier) as? Activity else { return } // This is where our actual business logic side-effect lives activity.updatedAt = .now // Save the transaction safely off the main thread try? modelContext.save() } } // 3. The Coordinator Service provides the "stable home" for the continuous observation @MainActor class ActivityCoordinator { private let dataEngine: ActivityDataEngine private var observationToken: ObservationTracking.Token? init(container: ModelContainer) { self.dataEngine = ActivityDataEngine(container: container) } func registerPersistentObservation(on activity: Activity) { // Discard any existing token to prevent duplicates observationToken?.cancel() let activityID = activity.id // This loop is initialized ONCE. It survives view teardowns entirely. observationToken = withContinuousObservation(options: .didSet) { [weak self] event in guard let self else { return } // The moment ANY property changes on this activity, the observation fires. // We hand the persistent ID over to our background actor to do the heavy lifting. Task { await self.dataEngine.applyTimestampSideEffect(for: activityID) } } } } The view layer simply displays the data, when it appears it calls coordinator.registerPersistentObservation(on: activity) inside a .task, the coordinator holds the single active observation token By passing the PersistentIdentifier down to the ActivityDataEngine actor the main thread is instantly freed up, preventing UI stutters
Replies
Boosts
Views
Activity
Jun ’26
Reply to Auto Renewable Subscription Localization Rejected Repeatedly Without Explanation
It's hard to say without more information. Are you sure that the red banner on your product page doesn't contain a link with an explanation? Usually when you get localization rejection its due to potentially confusing strings between products. Is there a chance that in a list your localization strings wouldn't make clear which one is your 6 months and which one is your annual product? It also helps if you don't have a build in review at the same time, sometimes the review team will otherwise assume they should be able to find the products in question without hassle (i.e. even though you might have these to test pricing).
Replies
Boosts
Views
Activity
Jun ’26
Reply to macOS 27 Beta 1 Install Failure
Boot into Recovery Mode and make sure the Security Policy is set to Full Security in the Startup Security Utility. The current beta seems to ignore it when it's not set to Full Security and still tries to create a personalization ticket (i.e. follow the Full Security protocol) and fail in attempting to do so.
Topic: Community SubTopic: Apple Developers Tags:
Replies
Boosts
Views
Activity
Jun ’26