Overview
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
We have an application which keeps throwing the error "application is damaged and cannot be opened. You should move it to Trash"
I have already referred to the documentation: https://developer.apple.com/forums/thread/706379 and https://developer.apple.com/forums/thread/706442
I have checked the following possible root causes:
Codesign of the application using the codesign command
Notarization of the application using the spctl command
Executable permissions
Checked for the presence of "com.apple.quarantine" flag for the application using xattr -l <path to executables"
Checked the bundle structure
None of the above listed items seemed to be a problem and are as expected.
Can you please help us understand what could cause this issue and how to resolve this without recommending an uninstall/reinstall of the application?
I downloaded package, I can see it in Package Dependencies tab, [swift-collections | https://github.com/apple/swift-collections.git | Up to Next Major Version] — looks OK.
But (quite strange):
import Collections //🛑 No such module 'Collections'
typealias Objects = OrderedSet<anyHashable> // No error
I took Collection word from a list or typed — no difference.
if I remove import Collections there is no OrderedSet anymore (of course)
Can't compile. Cleaned build folder, restarted Xcode...
What could be wrong with it? Any ideas?
Even the best apps struggle to get noticed—over 5 million apps compete in stores, and most never hit 1,000 downloads. Visibility, not quality, is the real challenge.
App Store Optimization (ASO) is the key to breaking through. Optimizing your app’s title, keywords, visuals, and description, combined with ongoing testing and competitor analysis, can drastically improve discoverability and downloads in 2025.
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
App Store
App Review
App Store Connect
I’ve been building iOS apps since 2011 and have worked on hundreds along the way. Recently, I started a series on App Store Optimization (ASO) to share tips, strategies, and lessons learned.
In this first post, I dive into how responding to customer reviews can directly influence ASO performance and App Store ranking - covering timing, response style, and best practices to turn negative reviews into positive ones.
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
App Store
App Review
App Store Connect
When creating a new App Store version to update ASO keywords and metadata, I notice that elements like the app icon and other details are missing and I am looking for a way to copy the existing metadata from the previous version.
Also, is it possible to submit a new App Store version solely for ASO improvements without uploading a new build and still have the changes applied successfully.
Topic:
App Store Distribution & Marketing
SubTopic:
App Store Connect
Tags:
App Store
App Review
App Store Connect
The ASk is used by the KSM to derive the dASk, which is then used to decrypt the SK...R1.
If the only thing we give the client is the certificate, how does it encrypt the SK...R1 so the server is able to process it.
Would be nice to know it it works generally, because I've been getting questions about it and can't provide a helpful answer.
Thanks in advance.
Hello, our application is unable to HDMI output FairPlay protected content to TV via official Lightning HDMI AV Adapter, by checking the console log on mediaplayerd it is found that a CoreMediaErrorDomain Code=-19156 is raised, but we are unable to know what this error code means.
default 11:18:15.121584+0800 mediaplaybackd keyboss ckb_customURLReadCallback: 0x7fa62f800 60/0 customURLReqID 4 isComplete 1 err -19156 error <private> (0) dokeyCallbacksExist 0
default 11:18:15.121670+0800 mediaplaybackd keyboss ckb_processErrorForRequest: 0x7fa62f800 60/0 handler 4 err 0
default 11:18:15.121752+0800 mediaplaybackd <<<< FigCustomURLHandling >>>> curll_cancelRequestOnQueue: 0x7fa031360: requestID: 4
default 11:18:15.121932+0800 mediaplaybackd keyboss ckb_transitionRequestToTerminalState: 0x7fa62f800 60/0 reqFin err Error Domain=CoreMediaErrorDomain Code=-19156 (-19156) dokeyCallbacksExist 0
default 11:18:15.122025+0800 mediaplaybackd keyboss ckb_transitionRequestToTerminalState: 0x7fa62f800 60/0 retry
default 11:18:15.123195+0800 mediaplaybackd <<<< FigCPECryptorPKD >>>> PostKeyRequestErrorOccurred: 0x7fab7be80 029592C2-093D-400D-B57F-7AB06CC292D1 key request error: Error Domain=CoreMediaErrorDomain Code=-19160 (-19160)
Hi there,
We're working on offline playback of DRM tracks. The persistent keys (also known as track licenses) for offline playback are stored locally on the device and are served from cache when a user initiates playback of a downloaded track.
Our persistent keys have a limited validity time and need to be refreshed when they expire. To prevent a situation where a persistent key expires while the user is offline, we've decided to eagerly refresh these keys one week before their expiration date. To make that happen we need to be able to obtain the expiration date of the given track license.
We've been attempting to use the makeSecureTokenForExpirationDateOfPersistableContentKey API to facilitate this process. The documentation states that this API returns a secret token representing the persistent key, which we can then exchange with our license server for the expiration date: https://developer.apple.com/documentation/avfoundation/avcontentkeysession/makesecuretokenforexpirationdate(ofpersistablecontentkey:completionhandler:)?language=objc
However, every time we call makeSecureTokenForExpirationDateOfPersistableContentKey, we receive an error with code -46250. We haven't been able to find any public references or documentation for this specific error code, which is preventing us from troubleshooting the issue. We are conducting our tests on a physical device, as the simulator does not support FairPlay playback. We don't use dual expiry approach.
Is our understanding of how to obtain the expiration timestamp correct? Are we using the makeSecureTokenForExpirationDateOfPersistableContentKey API as it was intended? What does the -46250 error code mean, and what steps should we take to fix our FairPlay implementation to make this work?
Thanks in advance for your assistance.
Hello everyone,
I’m looking for advice from anyone who has gone through a similar experience with Apple Developer Program enrollment.
I initially enrolled as an individual and submitted a request to migrate the account to an organization under Thriveage Wellness Private Limited on Monday, January 15, 2026. After a few follow-ups, I was informed that I needed to submit documents linking my individual account to the company account. I provided the requested documents within 30 minutes of that communication.
Since then, the enrollment status has remained stuck in “Processing” with no further updates. Support has informed me that they cannot provide any timeline for completion.
Over the past several days, I’ve contacted Apple Developer Support 3–4 times but have not received any response.
At this point:
It has been over 12 days since enrolment, and more than 3 business days since the last support update or email.
There have been:
No requests for additional documents
No phone call for identity verification
No explanation for the delay
This situation is blocking our ability to publish apps and move forward with business commitments.
Has anyone recently experienced an enrolment delay of this length?Is there a specific escalation path that helped resolve the issue? Should I expect a phone verification call, or is there something I should proactively request from Apple?
Any guidance from Apple staff or developers who have resolved a similar case would be greatly appreciated.
Thank you in advance.
Summary
There is a critical synchronization issue within the App Store Connect dashboard affecting the management of Game Center Leaderboards. The web interface attempts to perform administrative tasks (such as listing player entries or moderating scores) by calling deprecated or mismatched API endpoints across different versions of the Iris API (v1 and v2), leading to a complete failure of the management UI. I have tried it with multiple browsers (Safari, Mozilla, Chrome, Opera) with same results.
Observed Behavior
Management UI Failure: The "Manage Scores and Players" section fails to load, often showing "Blocked" status in the browser's Network tab or remaining stuck on a loading spinner.
API Version Conflict: While some parts of the dashboard successfully fetch app data via /iris/v1/, the leaderboard management logic appears to have been partially migrated to /iris/v2/. This results in the UI making calls to /v1/ resources that return 403 FORBIDDEN (GET_COLLECTION not allowed) or calling /v2/ paths that return 404 PATH_ERROR (The resource does not exist).
Broken Relationships: Peticions to endpoints like /iris/v1/gameCenterDetails/{id}/gameCenterLeaderboards frequently return 404 errors stating that the relationship does not exist, even when the Leaderboard is "Live" and correctly configured.
Moderation Inaccessibility: Attempting to delete or hide a score is impossible because the "Search" functionality fails to return Player IDs. The backend rejects GET requests on moderation endpoints, only allowing PATCH or UPDATE, but without a functioning search UI to retrieve the necessary Player IDs, the management loop is broken.
Conclusion
The Game Center management dashboard is currently unusable for certain apps due to these internal API inconsistencies. Developers are unable to moderate their leaderboards or remove suspicious scores because the UI cannot resolve the correct API path to fetch player data.
Could you fix this as soon as possible, please?
Thank you,
JM.
I configured my app to show a Live Activity when an alarm rings using AlarmKit. However, if I dismiss the Live Activity by tapping somewhere other than the X button, and then long-press the Dynamic Island, a new Live Activity appears that is long but contains no information.
Currently, the only way I can remove this empty Live Activity is to press the X button while the alarm is in the snooze state. Pressing the X button on the initial alarm does not remove it.
Is there any way to prevent this behavior or properly handle / clean up this empty Live Activity?
I have noticed race conditions on macOS when tearing down and re-configuring an NEPacketTunnelProvider.
My goal is to handle switching out one VPN profile for another identical/near identical one (I'll add some context for this below).
The flow that I have tested was to wait for the NEVPNStatusDidChange notification to report a NEVPNStatus.disconnected state, and then start the process of re-configuring the VPN with a new profile.
In practice however, I have noticed that I must wait a couple of seconds between NEVPNStatus.disconnected state being reported and setting up a new tunnel. Otherwise, the system routing table gets messed up but the VPN reports being in NEVPNStatus.connected state, resulting in a tunnel that appears healthy but can't be accessed.
With this, I wanted to ask if you have any suggestions on any OS items I can observer, in order to deterministically know that the system has fully cleaned up my packet tunnel, and that I am safe to configure another? This would be much more optimal than a hard-coded delay.
Additional context:
Jamf is a common solution for deploying MDM configuration profiles. However, in my tests, it doesn't support Apple's recommended approach of using the PayloadIdentifier to mark profiles for replacement, as PayloadIdentifiers are automatically updated to match the PayloadUUID of that same profile on upload. Although given what I've observed, I'm not sure the Apple recommended approach would work here in any case.
Additionally, it would be nice to transition from non-MDM to MDM cleanly, however, this also requires an indeterminate wait time between the non-MDM configuration being disconnected and subsequently removed, and the MDM one being configured.
With these scenarios, we need to be able to add a second configuration, with possibly identical VPN settings, then remove the old one, allowing the system to transition to the new configuration.
For the MDM case, the pattern I've noticed on the system is that when the current profile is suddenly deleted, the connection will go into disconnected state, then NEVPNConfigurationChange will fire. The new profile can be configured from NEVPNConfigurationChange, however some time is needed to avoid races.
For non-MDM, I had experimented with an approach of polling for MDM configurations appearing. When they do, I'd remove my previous notification observers, and set up a new NEVPNStatusDidChange notification observer, to remove the non-MDM VPN configuration after. it enters a disconnected state. Following the removal, I would call a function to reconfigure the VPN with new configuration. When this logic is in place, the call to stopVPNTunnel() is made. Again, a hardcoded delay is required between stopping and removing the old configuration and setting up a new one.
Thanks!
In a class, I call the following (edited to simplify, but it matches the real case).
If I do this:
func getData() -> someClass? {
_ = someURL.startAccessingSecurityScopedResource()
if let data = NSData(contentsOf: someURL as URL) {
do {
let unarchiver = try NSKeyedUnarchiver(forReadingFrom: data as Data)
print((unarchiver.decodeObject(of: [NSArray.self, someClass.self /* and few others*/], forKey: oneKey) as? someClass)?.aProperty)
if let result = unarchiver.decodeObject(of: [NSArray.self, someClass.self /* same other types*/], forKey: oneKey) as? someClass {
unarchiver.finishDecoding()
print("unarchived success")
return result
} else {
unarchiver.finishDecoding()
print("unarchiving failed")
return someClass()
}
}
catch {
return nil
}
}
I get a failure on log : unarchiving failed
But if I comment out the print(unarchiver.decodeObject) - line 8, it works and I get unarchived success
// print((unarchiver.decodeObject(of: [NSArray.self, someClass.self /* and few others*/], forKey: oneKey) as? someClass)?.aProperty)
However, when I do exactly the same for another class (I've compared line by line to be sure), it works even with the print statement.
What could be happening here ?
I've suddenly started seeing hundreds of the same block of four error messages (see attached image) when running my app on my iOS device through Xcode. I've tried Cleaning the Build folder, but I keep seeing these messages in the console but can't find anything about them.
Phone is running iOS 26.1. Xcode is at 16.4. Mac is on Sequoia 15.5. The app is primarily a MapKit SwiftUI based application.
Messages below:
Connection error: Error Domain=NSCocoaErrorDomain Code=4099 "The connection to service named com.apple.PerfPowerTelemetryClientRegistrationService was invalidated: Connection init failed at lookup with error 159 - Sandbox restriction." UserInfo={NSDebugDescription=The connection to service named com.apple.PerfPowerTelemetryClientRegistrationService was invalidated: Connection init failed at lookup with error 159 - Sandbox restriction.}
(+[PPSClientDonation isRegisteredSubsystem:category:]) Permission denied: Maps / SpringfieldUsage
(+[PPSClientDonation sendEventWithIdentifier:payload:]) Invalid inputs: payload={
isSPR = 0;
}
CAMetalLayer ignoring invalid setDrawableSize width=0.000000 height=0.000000
I'm also seeing the following error messages:
CoreUI: CUIThemeStore: No theme registered with id=0
Hello everyone,
I'm having trouble testing custom offer codes for my auto-renewable subscription in the Sandbox environment.
I am using the modern StoreKit 2 API to display the redemption sheet:
try await StoreKit.AppStore.presentOfferCodeRedeemSheet(in: windowScene)
When I enter a valid custom code that I created in App Store Connect, the system sheet immediately returns the following error:
"Cannot Redeem Code. The code entered is not valid. [environment: sandbox]"
To be clear, I am manually typing the custom code string itself into the redemption sheet's text field, not using a one-time code link or URL.
I believe my configuration is correct, and I've already spent a significant amount of time troubleshooting. Here is a list of everything I have checked and tried so far:
App Store Connect Configuration:
The Offer Code is marked as "Active".
The parent subscription product is approved and its status is "Ready for Sale".
The offer's eligibility is set correctly
The start and end dates for the offer are valid.
Despite all these steps, the error persists. At this point, I suspect this might be a temporary issue with the Sandbox environment itself, but I want to make sure I haven't missed any crucial configuration steps.
Has anyone else encountered this issue recently? Is there anything else I should be checking?
Any help would be greatly appreciated.
Thank you.
I’m getting Auto Layout constraint conflict warnings related to AVPlayerView in my project.
I’ve reproduced the issue on macOS Tahoe 26.2.
The conflict appears to originate inside AVPlayerView itself, between its internal subviews, rather than in my own layout code.
This issue can be easily reproduced in an empty project by simply adding an AVPlayerView as a subview using the code below.
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
let playerView = AVPlayerView()
view.addSubview(playerView)
}
}
After presenting that view controller, the following Auto Layout constraint conflict warnings appear in the console:
Conflicting constraints detected: <decode: bad range for [%@] got [offs:346 len:1057 within:0]>.
Will attempt to recover by breaking <decode: bad range for [%@] got [offs:1403 len:81 within:0]>.
Unable to simultaneously satisfy constraints:
(
"<NSLayoutConstraint:0xb33c29950 H:|-(0)-[AVDesktopPlayerViewContentView:0x10164dce0](LTR) (active, names: '|':AVPlayerView:0xb32ecc000 )>",
"<NSLayoutConstraint:0xb33c299a0 AVDesktopPlayerViewContentView:0x10164dce0.right == AVPlayerView:0xb32ecc000.right (active)>",
"<NSAutoresizingMaskLayoutConstraint:0xb33c62850 h=--& v=--& AVPlayerView:0xb32ecc000.width == 0 (active)>",
"<NSLayoutConstraint:0xb33d46df0 H:|-(0)-[AVEventPassthroughView:0xb33cfb480] (active, names: '|':AVDesktopPlayerViewContentView:0x10164dce0 )>",
"<NSLayoutConstraint:0xb33d46e40 AVEventPassthroughView:0xb33cfb480.trailing == AVDesktopPlayerViewContentView:0x10164dce0.trailing (active)>",
"<NSLayoutConstraint:0xb33ef8320 NSGlassView:0xb33ed8c00.trailing == AVEventPassthroughView:0xb33cfb480.trailing - 6 (active)>",
"<NSLayoutConstraint:0xb33ef8460 NSGlassView:0xb33ed8c00.width == 180 (active)>",
"<NSLayoutConstraint:0xb33ef84b0 NSGlassView:0xb33ed8c00.leading >= AVEventPassthroughView:0xb33cfb480.leading + 6 (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0xb33ef8460 NSGlassView:0xb33ed8c00.width == 180 (active)>
Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens. And/or, set a symbolic breakpoint on LAYOUT_CONSTRAINTS_NOT_SATISFIABLE to catch this in the debugger.
Is it system bug or maybe someone knows how to fix that?
Thank you.
When using iOS 26.2 (23C55) Safari, the following can occur.
The current tab (A) opens a new tab (B) via window.open(url, target, windowFeatures).
The user clicks the "back" button to close tab B, and returns to tab A.
Tab A attempts to open tab B again at a later point, using the same "target" as before, and fails (no window object is returned by window.open).
This bug only occurs when the target is the same as the previously closed tab (which was closed via the back button). If a new target is specified, the new tab opens as expected.
This bug is also limited to the back button. If the user manually closes tab B, then it can be re-opened by tab A using window.open using the same target as before.
Hey there guys, I'm new on SwiftUI and iOS Development world.
How can I achieve a seamless TabBar transition in SwiftUI? Currently, when I programmatically hide the TabBar on a pushed view and swipe back to the previous view, there is a noticeable delay before the TabBar reappears. How can I make it appear instantly?
Here is the link to the video https://streamable.com/3zz2o2
Thank you in advance
Topic:
UI Frameworks
SubTopic:
SwiftUI
Hi,
I’ve been struggling for a while with an issue around an auto-renewable subscription using StoreKit 2 and I’d like to double-check here whether I’m missing something, or if anyone has seen similar behavior.
Context
• iOS / iPadOS app, first release
• 1 auto-renewable subscription (only product in the app)
• Using StoreKit 2 only (Product, Transaction, AppStore)
• Review device according to the message: iPad Air 11” (M3), iPadOS 26.2
• I keep failing on Guideline 2.1 – App Completeness
• The App Review message is always the same:
“The In-App Purchase products in the app exhibited one or more bugs which create a poor user experience. Specifically, no action occurred when we tapped on the Continue to Purchase button.”
In App Store Connect, the subscription is properly configured, is in the state Ready for Review, and is correctly associated with this app version.
What I see (locally + TestFlight)
In TestFlight and local builds, the behavior looks correct:
• Product.products(for: […]) returns the product, the price and currency are displayed correctly on the paywall / subscription card.
• The user taps “Get PRO” → my overlay is shown (“Preparing purchase…” → then a screen with confirmation and price).
• After tapping the “Continue to Purchase” button in that overlay, I call await product.purchase().
• On my devices, the system StoreKit purchase sheet always appears.
• In the sandbox logs I can see:
• a successful result from purchase()
• a verified transaction via VerificationResult
• the “user has PRO” flag being set correctly after refreshing entitlements (Transaction.currentEntitlements + fallback Transaction.latest(for:)).
I’ve tested this on multiple real devices and with several sandbox Apple IDs – I cannot reproduce the “nothing happens after tapping” problem.
What App Review reports
App Review repeatedly claims that “no action occurred when we tapped on the Continue to Purchase button.”
From their screenshots and description, the flow is:
1. They open Settings → subscription card.
2. They see the loaded price, so the product has clearly been fetched successfully from the App Store.
3. They tap my “Get SalonFlow PRO” button.
4. My overlay appears with the subscription name and price.
5. They tap “Continue to Purchase” (in my UI this is “Pokračovat k nákupu”).
6. According to them, nothing happens – no system StoreKit confirmation, no error message, no visible action.
Important: this overlay did not appear as an extra complication, but as a reaction to their earlier feedback:
• Originally, I had a simple flow: button in the card → directly calling purchase().
• App Review at that time said that after tapping the button “nothing happens”.
• I added the overlay specifically to make it obvious that the button does react and that the app is preparing the system purchase: I show the product, the price, and a text explaining that a system App Store confirmation will appear next.
• Only from that overlay do I call purchase().
So: in their environment they obviously do reach the overlay (meaning the button definitely does “something”), but the actual StoreKit purchase sheet never shows up.
Additional changes and “safety belts”
From the App Review video it was clear they were tapping the purchase button roughly 3 seconds after launching the app. So I tightened the flow even more:
• The “Get SalonFlow PRO” button is now:
• disabled until the product has been loaded from the App Store,
• visually dimmed, with a spinner and a short text like “Loading subscription information, please wait…”.
• The button only becomes active once the product is actually loaded and ready.
• After that, the user goes through a two-step process:
1. tap “Get SalonFlow PRO” → overlay with details,
2. tap “Continue to Purchase” → this is where I call purchase().
On my devices, after that step the system purchase confirmation always appears. But App Review still says that after tapping “Continue to Purchase” nothing happens.
What I’d like to ask
1. Has anyone seen a situation where Product.purchase() with StoreKit 2 works fine in TestFlight and sandbox testing, but in the App Review environment the system purchase sheet never appears (no error, just “nothing”)?
2. Are there any known edge cases on iPad (iPadOS 26.2, iPad Air M3) where the StoreKit purchase sheet might fail to show even if:
• AppStore.canMakePayments == true,
• the product is valid and loaded,
• and no error is thrown from purchase()?
3. Could App Review consider my two-step flow (button → overlay → confirm button calling purchase()) problematic in itself, even though the overlay is there precisely because of their initial complaint that “nothing happens” after tapping the button?
4. Is there anything concrete you’d recommend:
• adding to the logs,
• changing in the timing/order of the purchase() call,
• or adjusting in the UI,
to make it absolutely clear what is happening in their environment if the system sheet never appears?
From my point of view, the implementation follows the StoreKit 2 documentation, everything works correctly in real tests and TestFlight, but the App Review environment behaves differently and I keep getting stuck on Guideline 2.1.
I’d really appreciate any experience, tips (“we had exactly this and fixed it by X”), or even a recommendation to radically simplify the flow back to a minimal “button → directly purchase()” without any intermediate overlay.
Thanks a lot for any help – this review loop has been going on for weeks and I’d really like to finally resolve it.