Search results for

“sandbox”

10,540 results found

Post

Replies

Boosts

Views

Activity

Reply to Sanboxed Apps Reading Extended Security Information (ACL)
Can you please confirm if my findings are accurate and sandboxed apps fail to read the com.apple.system.Security EA by design? No, I don't think that's correct. You can see the code here but I believe that xattr was set up as the fallback storage mechanism which the VFS system uses if the can't retrieve the data through ATTR_CMN_EXTENDED_SECURITY. As far as directly reading the xattr, the vfs layer is what blocks that, not the sandbox, through this check. However, my bigger question here is what you mean by read. ACL enforcement and validation happens in the kernel, not user space, so a process doesn't really read its ACL, whether or not it's stored in an xattr. I don't know what's going on here, but the general theory you're describing doesn't really make sense to me. Have you tried starting with a minimal test app that's sandboxed and directly access the file? I'd start with our basic app template with the sandbox enabled, then use the File Access Entitlement to hard code
Topic: App & System Services SubTopic: Core OS Tags:
Aug ’26
Reply to Words can’t truly explain this.
Finally someone asking; 1st Submission on June 8th Rejection 1: June 11th - A subtle yet valid UX issue, fixed that day itself and resubmitted. Rejection 2: June 12th - 1st Guidelines 4.3(b) rejection. The app is nuanced, so there were 2 accounts attached in the reviewer note with concisely explained details so they understand the nuance while reviewing the app as a whole. The reviewer only logged into one account and rejected. I resubmitted the same day clarifying this and that they needed to login to the other account to fully understand. Rejection 3: June 24th - Guidelines 4.3(b) rejection again. The reviewer only logged into one account again and rejected it. At this point I heard about App Review Board and I thought that might be the way to do this because I clearly explained why previously but the reviewer still rejected. So I made a App Review Board appeal. 3 weeks passes by no response, that's when I made my initial forum post asking how long does this process take. At the same time, I booked a 1 on 1
Aug ’26
Sanboxed Apps Reading Extended Security Information (ACL)
My custom filesystem kernel extension stores ACLs as an extended attribute, com.apple.system.Security. Sanboxed apps such as TextEdit, Pages, etc., running as a non-privileged process, fail to save modified contents when permissive ACLs are in use. Running them as a privileged process, does allow for file changes to be saved though. Non-sandboxed apps, such as VSCode, and command line programs are not susceptible to this behaviour. APFS, on the other hand, seems to handle ACLs as an ATTR_CMN_EXTENDED_SECURITY filesystem attribute, rather than as an EA. In this case, sandboxed apps have no trouble accessing the ACL data. I implemented a minimal PoC within my custom kext to verify this. I construct an ACL in memory allowing a given user to write,append,delete file contents, and return it that via vnop_getattr. This allows the file contents to be modified and saved by sandboxed apps. Can you please confirm if my findings are accurate and sandboxed apps fail to read the com.app
13
0
1.1k
Aug ’26
The in-app purchase payment in the TestFlight package defaults to obtaining products from the United States.
The in-app purchase payment function of the TestFlight package always defaults to providing products from the United States, even if I log in with an AppStore account from the Chinese region. The products obtained are still from the United States. Only when I make the purchase and am prompted to log in to the sandbox account will Chinese products be displayed. Storefront.current = USA
0
0
179
Aug ’26
Reply to PrivilegedHelperTool no longer launches automatically after SMJobBless to SMAppService
Don't use the comments feature. They hide your replies. For better or worse the App Sandbox is not a good option for our software. That's not what I'm saying. App Sandbox opts you into a lot of modern behaviour and expectations. It's literally the default. But all you need to do is add an unsandboxed XPC service. The whole OS, and random, unsuspecting APIs, run via XPC. You can't avoid it. the moment your app starts using the newer APIs, a few behaviors are clearly different. Certainly. But the old behaviours are deprecated. They may break at any time, especially if root is involved. The nice part is that launch daemons are the intended application for much of these technologies. The official documentation assumes a launch daemon. But if you're trying to do a launch agent, then you have to cobble together information from various places and try to make it work. I did finally get it to work, but it took me a year. But you could just run through the standard examples and see if that exhibits t
Aug ’26
Reply to PrivilegedHelperTool no longer launches automatically after SMJobBless to SMAppService
I don't know much about root issues with apps. But this question seems like it might be useful: https://developer.apple.com/forums/thread/792826 I think that the term privileged helper historically referred to an older way for apps to temporarily gain root privileges. Apple didn't like that and pushed people towards launch daemons. Lots more information here: https://developer.apple.com/forums/thread/708765 if one needs these LaunchDaemons to perform some actions with root privileges, what exactly would enabling the App Sandbox (com.apple.security.app-sandbox = true) on the privileged helper tool accomplish? Is there any point in confining a process with root privileges inside a container? Again, I'm not sure about anything involving root. But I have discovered certain benefits to sandboxing everything. If you have any part that requires (or typically uses) sandboxing, then all parts should be sandboxed. It greatly helps with interoperability between different apps
Aug ’26
Reply to PrivilegedHelperTool no longer launches automatically after SMJobBless to SMAppService
As it happens, shortly after posting I had a hunch that the com.apple.developer.service-management.managed-by-main-app entitlement may not be needed at all. That entitlement features on the GitHub repo LLMs are likely training on: https://github.com/malpern/privileged_helper_help/tree/main The .developer suffix hints that this would only be needed during development, but my best guess is that the fact that my main app uses a provisioning profile in both Debug and Release configuration somehow plays a role. Either way, removing that entitlement from the Helper tool suddenly allowed the connection to be started automatically. It would be great to know the answers to the other questions, since trial-and-error sometimes leads to half-truths: In addition to having the launchd plist that describes the helper tool copied to /Contents/Library/LaunchDaemons, should the same plist also be embedded by the helper tool binary via -sectcreate __TEXT __launchd_plist? Would this requirement, if it exists, be true for all ver
Aug ’26
PrivilegedHelperTool no longer launches automatically after SMJobBless to SMAppService
In transitioning an existing privileged helper tool from SMJobBless to the new-ish SMAppService APIs, I ran into a problem. Registration via [SMAppService daemonServiceWithPlistName:...]; works and I get the green light via SMAppServiceStatusEnabled. Presumably that means my app’s bundle structure is correct, except that when my app creates a connection to the named mach service advertised by the helper tool, the helper tool process no longer launches on-demand. The client side (main app) uses: xpc_connection_create_mach_service(com.fxfactory.FxFactory.helper, queue, XPC_CONNECTION_MACH_SERVICE_PRIVILEGED); The listener / helper tool uses: xpc_connection_create_mach_service(com.fxfactory.FxFactory.helper, dispatch_get_main_queue(), XPC_CONNECTION_MACH_SERVICE_LISTENER); When installed via SMJobBless, the privileged helper tool would automatically launch when a connection attempt is made by the app. This no longer works. The app sits indefinitely, never receiving a reply on its otherwise live xpc_connection. T
6
0
807
Aug ’26
AssetPackManager.shared traps on macOS 27 seed 6
On macOS 27.0 seed 6 (26A5421a) / Xcode 27 beta 6, the first touch of AssetPackManager.shared in a Managed Background Assets macOS app fatals at AssetPackManager.swift:360 with The app couldn't be validated: The app group with the ID TEAMID.group.example.app is inaccessible — with the app signed with exactly that group, BAAppGroupID matching, containerURL(forSecurityApplicationGroupIdentifier:) returning a real directory, and the container present on disk. I tried varying it and got the same result: App Sandbox on/off; the group spelled team-prefixed and iOS-style at every point of use. Notably, in the iOS-style build the message still names the team-prefixed identifier, which appears nowhere in that build — so the framework composes the prefixed form itself and validates that. The Mac provisioning profile authorizes group.example.app explicitly plus the auto-added TEAMID.* wildcard, and since the portal only registers group.-style IDs, no profile can list the prefixed form by name. Is this a known i
3
0
330
Aug ’26
Reply to App Review sandbox: revenuecat product loads, then STORE_PROBLEM followed by PRODUCT_NOT_AVAILABLE_FOR_PURCHASE on iPadOS 26.6
Follow-up: three possible causes of such purchase failures. I have continued investigating and now have three possible explanations for the STORE_PROBLEM result. None is confirmed, so I would appreciate tips on whether any could produce the complete sequence reported above. 1. Invalid or stale Apple sandbox session I performed a controlled test on my own iPad: I signed in with a valid developer-created Sandbox Apple Account. I confirmed that purchases worked. I deleted that account from App Store Connect while it remained selected on the iPad. I attempted another purchase. Apple displayed: You are not authorized to make purchases of this InApp in Sandbox at this time. This Apple Account doesn’t have permission to make In-App Purchases. After dismissing it, my app displayed the same high-level failure message seen during App Review. RevenueCat returned STORE_PROBLEM. I understand that App Review uses an Apple-managed sandbox identity that does not need to appear in my develo
Topic: App & System Services SubTopic: StoreKit Tags:
Aug ’26
Systemic Non-Factual App Review Misconduct
I apologize for bringing this personal dispute to the public forum, but I am desperate and do not know what other channel remains. After approximately 3.5 weeks, repeated resubmissions, direct telephone contact, and roughly four appeals, Apple continues issuing factually false or unsupported rejection grounds: Apple stated that my IAP “could not be found in the submitted binary.” I proved that its exact product identifier was compiled into the uploaded executable, that StoreKit was linked, and provided a physical-device recording of a successful sandbox purchase. Apple stated that account deletion was absent. It already existed, and I provided a physical-device recording demonstrating it. Apple ordered me to make unspecified “features that are not account based” freely accessible. The app handles sensitive, account-bound data. Despite my request and formal appeal, neither the reviewer nor the Review Board identified a single feature to which this finding applied. Apple demanded a recording of the app
2
0
159
Aug ’26
App Review sandbox: revenuecat product loads, then STORE_PROBLEM followed by PRODUCT_NOT_AVAILABLE_FOR_PURCHASE on iPadOS 26.6
Hello, I am investigating an intermittent In-App Purchase failure that occurred during App Review for the first release of my app. Environment Review device: iPad Air 11-inch (M3) OS: iPadOS 26.6 Environment: App Review sandbox Product type: Consumable StoreKit integration: RevenueCat through react-native-purchases 10.4.3 Observed behavior StoreKit successfully returned the products, localized names, and prices. The reviewer could see the credit packs and initiate the native purchase flow. My diagnostics show this sequence: Purchase initiated PURCHASE_CANCELLED; no transaction evidence Purchase initiated again RevenueCat code 2: STORE_PROBLEM elapsed: 9.4 seconds no transaction evidence Purchase initiated again RevenueCat code 5: PRODUCT_NOT_AVAILABLE_FOR_PURCHASE no transaction evidence Purchase initiated again RevenueCat code 5: PRODUCT_NOT_AVAILABLE_FOR_PURCHASE elapsed: 0.6 seconds no transaction evidence code-block The relevant sanitized logs are: { occurredAt: 2026-08-25T12:52:59.733Z, platform
3
0
696
Aug ’26
Storefront.current returns USA instead of China for TestFlight Sandbox account
I’m encountering an incorrect App Store storefront on one iOS device when testing an in-app purchase through TestFlight. Environment: App: ClawApp TestFlight build: 1.0.9 (08251556) Product ID: com.chagent.claw.credits.advanced StoreKit 2 Sandbox Apple Account country/region: Mainland China Device A: works correctly and returns CNY Device B: always returns USA/USD The same Sandbox Apple Account and the same TestFlight build are used on both devices On the affected device, StoreKit returns: storefrontCountryCode=USA storefrontCurrency=USD storeKitCurrency=USD storeKitDisplayPrice=US$9.99 The server catalog returns: serverSaleAmount=79.00 serverSaleCurrency=CNY I have already tried the following on the affected device: Signed out and signed back in to the Sandbox Apple Account Used another Mainland China Sandbox Apple Account Signed out of Media & Purchases Restarted the device Deleted and reinstalled the TestFlight app Cleared Sandbox purchase history However, S
1
0
146
Aug ’26
Is receiving the same transaction multiple times from Transaction.updates expected behavior?
I'm seeing behavior similar to what was reported in this thread: https://developer.apple.com/forums/thread/816344 I read the discussion in the related thread (816320) as well, but I couldn't determine whether receiving the same transaction multiple times from Transaction.updates is considered expected behavior. In my case, I'm testing an auto-renewable subscription in the Sandbox environment. After successfully processing and calling finish() on a transaction, Transaction.updates sometimes provides another transaction with the same transactionId. I've also observed the same transactionId being delivered multiple times through Transaction.updates itself. I compared the JWS representations of these transactions. They are not byte-for-byte identical, but the transaction information appears to be the same. The only differences I've identified are: signedDate deviceVerificationNonce deviceVerification This looks as though the same transaction is being signed again at a different time. I'd like to clarify
2
0
629
Aug ’26
Reply to Sanboxed Apps Reading Extended Security Information (ACL)
Can you please confirm if my findings are accurate and sandboxed apps fail to read the com.apple.system.Security EA by design? No, I don't think that's correct. You can see the code here but I believe that xattr was set up as the fallback storage mechanism which the VFS system uses if the can't retrieve the data through ATTR_CMN_EXTENDED_SECURITY. As far as directly reading the xattr, the vfs layer is what blocks that, not the sandbox, through this check. However, my bigger question here is what you mean by read. ACL enforcement and validation happens in the kernel, not user space, so a process doesn't really read its ACL, whether or not it's stored in an xattr. I don't know what's going on here, but the general theory you're describing doesn't really make sense to me. Have you tried starting with a minimal test app that's sandboxed and directly access the file? I'd start with our basic app template with the sandbox enabled, then use the File Access Entitlement to hard code
Topic: App & System Services SubTopic: Core OS Tags:
Replies
Boosts
Views
Activity
Aug ’26
Reply to In App Purchase Sandbox Testing - Clear Purchase History Not Working
I am also experiencing this (though I'm using Unity IAP, not StoreKit directly). Clearing purchases locally and in cloud, then signing out of Sandbox account and restarting/reinstalling the app: my fulfillment logic still being triggered for previous purchases. :( @newwbee That link is showing Feedback Not Found FYI
Topic: App & System Services SubTopic: StoreKit Tags:
Replies
Boosts
Views
Activity
Aug ’26
Reply to Words can’t truly explain this.
Finally someone asking; 1st Submission on June 8th Rejection 1: June 11th - A subtle yet valid UX issue, fixed that day itself and resubmitted. Rejection 2: June 12th - 1st Guidelines 4.3(b) rejection. The app is nuanced, so there were 2 accounts attached in the reviewer note with concisely explained details so they understand the nuance while reviewing the app as a whole. The reviewer only logged into one account and rejected. I resubmitted the same day clarifying this and that they needed to login to the other account to fully understand. Rejection 3: June 24th - Guidelines 4.3(b) rejection again. The reviewer only logged into one account again and rejected it. At this point I heard about App Review Board and I thought that might be the way to do this because I clearly explained why previously but the reviewer still rejected. So I made a App Review Board appeal. 3 weeks passes by no response, that's when I made my initial forum post asking how long does this process take. At the same time, I booked a 1 on 1
Replies
Boosts
Views
Activity
Aug ’26
Sanboxed Apps Reading Extended Security Information (ACL)
My custom filesystem kernel extension stores ACLs as an extended attribute, com.apple.system.Security. Sanboxed apps such as TextEdit, Pages, etc., running as a non-privileged process, fail to save modified contents when permissive ACLs are in use. Running them as a privileged process, does allow for file changes to be saved though. Non-sandboxed apps, such as VSCode, and command line programs are not susceptible to this behaviour. APFS, on the other hand, seems to handle ACLs as an ATTR_CMN_EXTENDED_SECURITY filesystem attribute, rather than as an EA. In this case, sandboxed apps have no trouble accessing the ACL data. I implemented a minimal PoC within my custom kext to verify this. I construct an ACL in memory allowing a given user to write,append,delete file contents, and return it that via vnop_getattr. This allows the file contents to be modified and saved by sandboxed apps. Can you please confirm if my findings are accurate and sandboxed apps fail to read the com.app
Replies
13
Boosts
0
Views
1.1k
Activity
Aug ’26
The in-app purchase payment in the TestFlight package defaults to obtaining products from the United States.
The in-app purchase payment function of the TestFlight package always defaults to providing products from the United States, even if I log in with an AppStore account from the Chinese region. The products obtained are still from the United States. Only when I make the purchase and am prompted to log in to the sandbox account will Chinese products be displayed. Storefront.current = USA
Replies
0
Boosts
0
Views
179
Activity
Aug ’26
Reply to PrivilegedHelperTool no longer launches automatically after SMJobBless to SMAppService
Don't use the comments feature. They hide your replies. For better or worse the App Sandbox is not a good option for our software. That's not what I'm saying. App Sandbox opts you into a lot of modern behaviour and expectations. It's literally the default. But all you need to do is add an unsandboxed XPC service. The whole OS, and random, unsuspecting APIs, run via XPC. You can't avoid it. the moment your app starts using the newer APIs, a few behaviors are clearly different. Certainly. But the old behaviours are deprecated. They may break at any time, especially if root is involved. The nice part is that launch daemons are the intended application for much of these technologies. The official documentation assumes a launch daemon. But if you're trying to do a launch agent, then you have to cobble together information from various places and try to make it work. I did finally get it to work, but it took me a year. But you could just run through the standard examples and see if that exhibits t
Replies
Boosts
Views
Activity
Aug ’26
Reply to PrivilegedHelperTool no longer launches automatically after SMJobBless to SMAppService
I don't know much about root issues with apps. But this question seems like it might be useful: https://developer.apple.com/forums/thread/792826 I think that the term privileged helper historically referred to an older way for apps to temporarily gain root privileges. Apple didn't like that and pushed people towards launch daemons. Lots more information here: https://developer.apple.com/forums/thread/708765 if one needs these LaunchDaemons to perform some actions with root privileges, what exactly would enabling the App Sandbox (com.apple.security.app-sandbox = true) on the privileged helper tool accomplish? Is there any point in confining a process with root privileges inside a container? Again, I'm not sure about anything involving root. But I have discovered certain benefits to sandboxing everything. If you have any part that requires (or typically uses) sandboxing, then all parts should be sandboxed. It greatly helps with interoperability between different apps
Replies
Boosts
Views
Activity
Aug ’26
Reply to PrivilegedHelperTool no longer launches automatically after SMJobBless to SMAppService
As it happens, shortly after posting I had a hunch that the com.apple.developer.service-management.managed-by-main-app entitlement may not be needed at all. That entitlement features on the GitHub repo LLMs are likely training on: https://github.com/malpern/privileged_helper_help/tree/main The .developer suffix hints that this would only be needed during development, but my best guess is that the fact that my main app uses a provisioning profile in both Debug and Release configuration somehow plays a role. Either way, removing that entitlement from the Helper tool suddenly allowed the connection to be started automatically. It would be great to know the answers to the other questions, since trial-and-error sometimes leads to half-truths: In addition to having the launchd plist that describes the helper tool copied to /Contents/Library/LaunchDaemons, should the same plist also be embedded by the helper tool binary via -sectcreate __TEXT __launchd_plist? Would this requirement, if it exists, be true for all ver
Replies
Boosts
Views
Activity
Aug ’26
PrivilegedHelperTool no longer launches automatically after SMJobBless to SMAppService
In transitioning an existing privileged helper tool from SMJobBless to the new-ish SMAppService APIs, I ran into a problem. Registration via [SMAppService daemonServiceWithPlistName:...]; works and I get the green light via SMAppServiceStatusEnabled. Presumably that means my app’s bundle structure is correct, except that when my app creates a connection to the named mach service advertised by the helper tool, the helper tool process no longer launches on-demand. The client side (main app) uses: xpc_connection_create_mach_service(com.fxfactory.FxFactory.helper, queue, XPC_CONNECTION_MACH_SERVICE_PRIVILEGED); The listener / helper tool uses: xpc_connection_create_mach_service(com.fxfactory.FxFactory.helper, dispatch_get_main_queue(), XPC_CONNECTION_MACH_SERVICE_LISTENER); When installed via SMJobBless, the privileged helper tool would automatically launch when a connection attempt is made by the app. This no longer works. The app sits indefinitely, never receiving a reply on its otherwise live xpc_connection. T
Replies
6
Boosts
0
Views
807
Activity
Aug ’26
AssetPackManager.shared traps on macOS 27 seed 6
On macOS 27.0 seed 6 (26A5421a) / Xcode 27 beta 6, the first touch of AssetPackManager.shared in a Managed Background Assets macOS app fatals at AssetPackManager.swift:360 with The app couldn't be validated: The app group with the ID TEAMID.group.example.app is inaccessible — with the app signed with exactly that group, BAAppGroupID matching, containerURL(forSecurityApplicationGroupIdentifier:) returning a real directory, and the container present on disk. I tried varying it and got the same result: App Sandbox on/off; the group spelled team-prefixed and iOS-style at every point of use. Notably, in the iOS-style build the message still names the team-prefixed identifier, which appears nowhere in that build — so the framework composes the prefixed form itself and validates that. The Mac provisioning profile authorizes group.example.app explicitly plus the auto-added TEAMID.* wildcard, and since the portal only registers group.-style IDs, no profile can list the prefixed form by name. Is this a known i
Replies
3
Boosts
0
Views
330
Activity
Aug ’26
Reply to App Review sandbox: revenuecat product loads, then STORE_PROBLEM followed by PRODUCT_NOT_AVAILABLE_FOR_PURCHASE on iPadOS 26.6
Follow-up: three possible causes of such purchase failures. I have continued investigating and now have three possible explanations for the STORE_PROBLEM result. None is confirmed, so I would appreciate tips on whether any could produce the complete sequence reported above. 1. Invalid or stale Apple sandbox session I performed a controlled test on my own iPad: I signed in with a valid developer-created Sandbox Apple Account. I confirmed that purchases worked. I deleted that account from App Store Connect while it remained selected on the iPad. I attempted another purchase. Apple displayed: You are not authorized to make purchases of this InApp in Sandbox at this time. This Apple Account doesn’t have permission to make In-App Purchases. After dismissing it, my app displayed the same high-level failure message seen during App Review. RevenueCat returned STORE_PROBLEM. I understand that App Review uses an Apple-managed sandbox identity that does not need to appear in my develo
Topic: App & System Services SubTopic: StoreKit Tags:
Replies
Boosts
Views
Activity
Aug ’26
Systemic Non-Factual App Review Misconduct
I apologize for bringing this personal dispute to the public forum, but I am desperate and do not know what other channel remains. After approximately 3.5 weeks, repeated resubmissions, direct telephone contact, and roughly four appeals, Apple continues issuing factually false or unsupported rejection grounds: Apple stated that my IAP “could not be found in the submitted binary.” I proved that its exact product identifier was compiled into the uploaded executable, that StoreKit was linked, and provided a physical-device recording of a successful sandbox purchase. Apple stated that account deletion was absent. It already existed, and I provided a physical-device recording demonstrating it. Apple ordered me to make unspecified “features that are not account based” freely accessible. The app handles sensitive, account-bound data. Despite my request and formal appeal, neither the reviewer nor the Review Board identified a single feature to which this finding applied. Apple demanded a recording of the app
Replies
2
Boosts
0
Views
159
Activity
Aug ’26
App Review sandbox: revenuecat product loads, then STORE_PROBLEM followed by PRODUCT_NOT_AVAILABLE_FOR_PURCHASE on iPadOS 26.6
Hello, I am investigating an intermittent In-App Purchase failure that occurred during App Review for the first release of my app. Environment Review device: iPad Air 11-inch (M3) OS: iPadOS 26.6 Environment: App Review sandbox Product type: Consumable StoreKit integration: RevenueCat through react-native-purchases 10.4.3 Observed behavior StoreKit successfully returned the products, localized names, and prices. The reviewer could see the credit packs and initiate the native purchase flow. My diagnostics show this sequence: Purchase initiated PURCHASE_CANCELLED; no transaction evidence Purchase initiated again RevenueCat code 2: STORE_PROBLEM elapsed: 9.4 seconds no transaction evidence Purchase initiated again RevenueCat code 5: PRODUCT_NOT_AVAILABLE_FOR_PURCHASE no transaction evidence Purchase initiated again RevenueCat code 5: PRODUCT_NOT_AVAILABLE_FOR_PURCHASE elapsed: 0.6 seconds no transaction evidence code-block The relevant sanitized logs are: { occurredAt: 2026-08-25T12:52:59.733Z, platform
Replies
3
Boosts
0
Views
696
Activity
Aug ’26
Storefront.current returns USA instead of China for TestFlight Sandbox account
I’m encountering an incorrect App Store storefront on one iOS device when testing an in-app purchase through TestFlight. Environment: App: ClawApp TestFlight build: 1.0.9 (08251556) Product ID: com.chagent.claw.credits.advanced StoreKit 2 Sandbox Apple Account country/region: Mainland China Device A: works correctly and returns CNY Device B: always returns USA/USD The same Sandbox Apple Account and the same TestFlight build are used on both devices On the affected device, StoreKit returns: storefrontCountryCode=USA storefrontCurrency=USD storeKitCurrency=USD storeKitDisplayPrice=US$9.99 The server catalog returns: serverSaleAmount=79.00 serverSaleCurrency=CNY I have already tried the following on the affected device: Signed out and signed back in to the Sandbox Apple Account Used another Mainland China Sandbox Apple Account Signed out of Media & Purchases Restarted the device Deleted and reinstalled the TestFlight app Cleared Sandbox purchase history However, S
Replies
1
Boosts
0
Views
146
Activity
Aug ’26
Is receiving the same transaction multiple times from Transaction.updates expected behavior?
I'm seeing behavior similar to what was reported in this thread: https://developer.apple.com/forums/thread/816344 I read the discussion in the related thread (816320) as well, but I couldn't determine whether receiving the same transaction multiple times from Transaction.updates is considered expected behavior. In my case, I'm testing an auto-renewable subscription in the Sandbox environment. After successfully processing and calling finish() on a transaction, Transaction.updates sometimes provides another transaction with the same transactionId. I've also observed the same transactionId being delivered multiple times through Transaction.updates itself. I compared the JWS representations of these transactions. They are not byte-for-byte identical, but the transaction information appears to be the same. The only differences I've identified are: signedDate deviceVerificationNonce deviceVerification This looks as though the same transaction is being signed again at a different time. I'd like to clarify
Replies
2
Boosts
0
Views
629
Activity
Aug ’26