Environment
OS: iOS 26.2 ~ 26.3
SDK: Xcode 16.4 (Target: iOS 17.6)
Framework: StoreKit 2
Environment: Production (Cannot reproduce in Sandbox or Xcode Configuration)
Issue Description
We are encountering a critical purchase failure that occurs exclusively in the Production environment.
When a user who has a "Pending Downgrade" (scheduled for the next renewal date) attempts to re-purchase their current higher-tier product to cancel the downgrade, StoreKit 2 returns an error.
Steps to Reproduce
User is currently on "Product A" (Higher Tier).
User schedules a downgrade to "Product B" (Lower Tier). The status changes to "Pending Downgrade".
User attempts to purchase "Product A" again via Product.purchase().
The system purchase sheet appears, and the user confirms the purchase.
Immediately after authentication, a system alert from StoreKit appears saying: "Cannot process request at this time. Please try again later." (現在リクエストを一時的に処理できません。しばらくしてからもう一度お試しください。)
After dismissing the alert, the app receives StoreKitError code 2 (unknown) with the localized message: "Request could not be completed" (リクエストを完了できません).
Technical Observations
Transaction.currentEntitlements: Does not change.
App Store Server Notifications (V2): No notifications are sent to our server.
Sandbox Behavior: Works perfectly. Re-purchasing Product A successfully cancels the downgrade and the subscription remains at the Higher Tier.
AppStore.sync(): Running a manual sync does not resolve the pending state after the error.
Question
Since we cannot debug production-level logs, we are stuck. Is this a known regression in the StoreKit 2 commerce engine regarding state synchronization for downgrades? Has anyone found a workaround for this specific scenario?
Any insights would be greatly appreciated.
Delve into the world of built-in app and system services available to developers. Discuss leveraging these services to enhance your app's functionality and user experience.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Created
I've been able to run this sample project with the PIRServer. But the urls are still not blocked.
https://developer.apple.com/documentation/networkextension/filtering-traffic-by-url
https://github.com/apple/pir-service-example
I got this on the log
Received filter status change: <FilterStatus: 'running'>
I'm debugging an app I'm building and everything I'm seeing suggests I need to put in a request to Apple to turn on NetworkExtension → Packet Tunnel Provider entitlement for our Team ID and bundle IDs.
1: Is this true?
2: Doesn't the option in xcode handle this?
Hello,
Recently we got a question about the event_timestamps for the phone usage report in our research project:
Does the event_timestamp correspond to the start point or end point of a period of interest?
For example, say the event_timestamp is 2024-07-01 23:59:59 with a duration of 86400. The user is noted to have made 2 phone calls during that event_timestamp. Did those phone calls occur in the 86400 seconds prior to that timestamp (i.e., on 2024-07-01) or in the 86400 seconds after that timestamp (i.e., on 2024-07-02)?
Thanks!
Hi, I’m working on a proof of concept for a CarPlay application where I need to display multiple Points of Interest, such as EV charging stations and fuel stations. The app will also allow users to book a selected Point of Interest (for example, an EV charging slot). I understand that the app can be registered under the Navigation (turn‑by‑turn) category, but I wanted to check whether it is also possible to register it under the Driving Task category. I also want to know if i can Register for multiple Categories for my car play application.
I am developing a mobile application using Flutter and plan to implement in-app subscriptions for both iOS platforms. I would like to request guidance on the following:
Technical Implementation:
Recommended best practices for implementing auto-renewable subscriptions in Flutter apps
StoreKit 2 integration requirements and compatibility considerations
Server-to-server notification setup and endpoint requirements
Testing Procedures:
Sandbox environment configuration and testing workflow
TestFlight testing requirements for subscription features
Recommended testing scenarios before production release
Required Documentation and Accounts:
Complete list of required agreements (Paid Applications Agreement, etc.)
Banking and tax information requirements
Privacy policy and terms of service specifications for subscription apps
App Review guidelines specific to subscription-based apps
Subscription Management:
Grace period implementation requirements
Handling subscription cancellations and refunds
Promotional offers and introductory pricing setup
Could you please provide documentation or direct me to the appropriate resources? Additionally, if there are any specific requirements for Flutter-based applications, I would appreciate that information.
Application Details:
Platform: iOS (Flutter framework)
Subscription Type: Auto-renewable subscriptions
I have noticed that there are no new kdk builds since mid December
Is everything ok at apple
I am aware of NXUs but the kernel version has changed much since then
I'm building a HomeKit app that discovers Thread devices and visualizes the mesh topology. I can detect device roles (Router vs End Device via characteristic 0x0703) and identify Border Routers (via _meshcop._udp), but I cannot determine which Router is the parent of a given End Device. Any Thread device can act as a Router (a Nanoleaf bulb, an Eve plug, not just HomePods), and End Devices attach to these Routers as children. That parent-child relationship is what I'm trying to map, but there's no RLOC16, neighbor table, or parent identifier exposed through any available API.
I've tested every path I can find. Here's what I've tried on a network with 44 Thread devices and 6 Border Routers:
What works (partially)
HAP Thread Management Service (0x0701) gives me the device role from characteristic 0x0703, the OpenThread version from 0x0706, and node capabilities from 0x0702. That's the complete set of characteristics on that service. None of them contain RLOC16, parent Router, or neighbor data. This service also only exists on HAP-native Thread devices. My 20 Matter-over-Thread devices (Aqara, Eve Door, SmartWings, Onvis S4) don't have it at all.
MeshCoP Bonjour (_meshcop._udp) identifies Border Routers and the network name/Extended PAN ID. No topology data about other mesh nodes.
What doesn't work
ThreadNetwork framework (THClient) - retrieveAllCredentials() returns error Code 3 because the app can't access credentials stored by Apple Home. Even if it worked, THCredentials only contains network config (name, PAN ID, channel), not topology.
Direct CoAP queries - Border Routers don't route traffic from WiFi to Thread management ports. Mesh-local addresses aren't reachable. No Thread NWInterface in Network.framework.
Network.framework - No visibility into the Thread mesh from the WiFi side.
The only remaining path I can see (but it's not practical)
Matter cluster 0x0035 (Thread Network Diagnostics) appears to have exactly what I need: RLOC16, NeighborTable with isChild boolean, RouteTable. I haven't implemented this because it requires commissioning each device individually onto my app's own Matter fabric via Multi-Admin. That's 21 separate user-initiated pairing actions on my network. I can't ask end users to do that.
The core issue
Every Thread Router (whether it's a HomePod acting as a Border Router or a Nanoleaf bulb acting as a mesh Router) knows its own children and neighbors. The Border Routers also maintain route tables covering the mesh backbone. This data exists on the user's own devices but none of it is exposed to third-party apps.
Even something minimal would help. HMAccessory already exposes matterNodeID as a cross-protocol identifier. Exposing RLOC16 the same way would be enough, since parent-child relationships are encoded in the address itself (ParentRLOC = ChildRLOC & 0xFC00).
Has anyone found another approach I'm missing?
Thanks in advance for any pointers.
I have a Live Activity on iOS. Love it.
However, that Live Activity via remote hosting (I'm not building for other targets) shows the Live Activity on watchOS, macOS and CarPlay.
disfavoredLocations are for widgets, but I don't appear to have a method to limit or provide exclusive locations the live activity should appear.
https://developer.apple.com/documentation/DeclaredAgeRange/AgeRangeService/isEligibleForAgeFeatures returns a bool. I assume that means that it will return True for the states where their laws are in effect.
The TX law and the UT/LA/AZ laws have different requirements though:
TX requires the app verify the user's age on every app launch.
These other states require the app verify the user's age "no more than once during each 12-month period"
A future law (Brazil maybe?) might do something else.
How can we determine if the user is eligible for the TX versus other state requirements?
Environment:
iPhone 17 / iPhone 17 Pro (Apple N1 chip)
iOS 26.x
Xcode 26
Framework: Flutter app with native iOS BLE library (CoreBluetooth)
We have a production IoT app that communicates with BLE nodes (Nordic, PIC, EnOcean peripherals) using an advertising/scanning-based protocol — not GATT connections. The app broadcasts commands via CBPeripheralManager (advertising service UUIDs) and receives responses by scanning with CBCentralManager (reading manufacturer data and service UUIDs from advertisement packets). This workflow has been reliable across all iPhone models from iPhone 8 through iPhone 16 Pro Max.
On iPhone 17 devices, we are experiencing multiple failures in this workflow.
Architecture:
Sending commands: We use CBPeripheralManager.startAdvertising() with CBAdvertisementDataServiceUUIDsKey to broadcast a UUID-encoded command to nearby nodes.
Receiving responses: We use CBCentralManager.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey: true]) and filter responses in centralManager(_:didDiscover:advertisementData:rssi:) by matching CBAdvertisementDataServiceUUIDsKey or CBAdvertisementDataManufacturerDataKey against expected UUID masks.
Communication pattern: Advertise a command → stop advertiser → start scanner → wait for matching response → process result. Typical timeout is 1.5 seconds per exchange.
Issues observed on iPhone 17:
peripheralManagerDidStartAdvertising behaviour change
After calling CBPeripheralManager.startAdvertising(:), the delegate callback peripheralManagerDidStartAdvertising(:error:) either fires with errors that did not occur on previous hardware, or advertising does not appear to reach the peripheral nodes at all. The same advertising payload works immediately when tested on iPhone 15/16.
Is the N1 chip's Bluetooth 6 stack handling CBAdvertisementDataServiceUUIDsKey advertising differently? Are there new constraints on advertising payload size or format?
Scanner returning fewer/no results with withServices: nil
Our scanner uses scanForPeripherals(withServices: nil) because we need to read manufacturer data from advertisement packets and filter using a custom UUID mask. On iPhone 17, we observe significantly fewer didDiscover callbacks compared to iPhone 15/16 in the same physical environment, with the same nodes advertising.
We understand that passing service UUIDs in withServices: is recommended, but our protocol requires reading raw manufacturer data bytes that aren't associated with a single service UUID — we use mask-based matching (e.g., filter mask 11110000-0000-0000-0000-000000000000 against scan results).
Has the N1 chip changed the rate or filtering behaviour of unfiltered BLE scans? Is there a new throttling mechanism?
Background scanning stops immediately
When the app moves to background, scanning appears to stop entirely on iPhone 17 — even with bluetooth-central in UIBackgroundModes. On iPhone 16, background scanning continued (at reduced intervals) and delivered results for peripherals advertising filtered service UUIDs.
Aggressive session termination on app backgrounding
Our advertise-then-scan sequences (typically 1.5s round-trip) are being interrupted when the user briefly switches apps. The CBPeripheralManager stops advertising and the CBCentralManager stops scanning, causing timeout errors. This was not observed on previous iPhone models with the same iOS background mode configuration.
Questions for Apple:
Are there documented changes to CoreBluetooth behaviour on the N1 Bluetooth 6 chip that affect advertising-based (non-GATT) communication patterns?
Has the scan response rate for scanForPeripherals(withServices: nil) been intentionally reduced on iPhone 17?
Is CBCentralManagerOptionRestoreIdentifierKey now required for reliable background scanning on iPhone 17, or is this a known regression?
Are there new advertising payload constraints (size, format, interval) that we should be aware of for the N1 chip?
What we've tried:
Added NSBluetoothAlwaysUsageDescription and NSBluetoothWhileInUseUsageDescription to Info.plist
Confirmed Bluetooth permissions are granted
Tested with identical BLE nodes that work on iPhone 15/16
Verified CBManagerState.poweredOn before all operations
Any guidance or known workarounds would be greatly appreciated. Happy to provide sysdiagnose logs or a minimal reproducible sample project.
We are experiencing an issue where Apple’s CDN is not fetching the updated apple-app-site-association (AASA) file correctly for our domain.
Domain - app.myloft-stage.com
AASA File Locations (Both Return Correct JSON):
https://app.myloft-stage.com/.well-known/apple-app-site-association
https://app.myloft-stage.com/apple-app-site-association
Both endpoints:
Return HTTP 200
Return valid JSON
Content-Type: application/json
No redirects
Valid SSL certificate
JSON validated and correctly formatted
Apple CDN URL -
https://app-site-association.cdn-apple.com/a/v1/app.myloft-stage.com
Error Returned by Apple CDN - {"cause":"invalid character '\u003c' looking for beginning of value"}
This error indicates that Apple CDN is receiving HTML content (starting with <) instead of JSON, even though the origin server returns proper JSON.
Observations :
Direct access to AASA file returns correct JSON.
Apple CDN appears to be caching an older or incorrect response.
The CDN response does not match the current server response.
Universal Links fail due to this incorrect AASA retrieval.
Hi,
I've now identified a few areas when BGContinuedProcessingTask gets expired by the system
no progress for ~30 seconds
high CPU usage
high temperature
Some of these I can preempt and expire preemptively and handle the notification, others I cannot and just need to let the failure bubble up.
When the failure does bubble up, I'd like to update the title and subtitle. I'm able to update the title, but the subtitle is fixed at "Task Failed"
Is there any workaround? Or shall I file a bug here?
We are developing an iOS application that requires NFC-based communication using ISO 7816 / ISO 14443 standards for secure element interaction as part of a card provisioning workflow.
We would like clarification on the following points:
Is it possible to provision a payment card or securely add a card to an NFC-enabled device using direct ISO 7816 APDU communication via NFCTagReaderSession?
If not, is Apple Pay In-App Provisioning (PassKit framework) the only supported approach for enabling contactless payment functionality on iPhone?
What specific entitlements are required if the use case involves secure element communication for token provisioning (not bypassing Apple Pay)?
We have already requested the relevant NFC entitlements through our Apple Developer account and are awaiting a response. Any guidance on the correct architecture and approval requirements would be greatly appreciated.
Thank you in advance for your support.
I am encountering an issue where the Lock Screen Quick Action fails to visibly open my app.
My app is a camera application that utilizes a CameraCaptureIntent to launch a standalone, lightweight camera view (accessible while the device is locked), distinct from the main application.
Steps to Reproduce:
Open the lightweight camera view using the Lock Screen Quick Action.
From this view, launch the Main App.
Lock the iPhone (put it to sleep).
Attempt to launch the lightweight camera view via the Quick Action again.
A slight animation occurs, but the camera view does not appear on screen. After multiple tests, it seems the view is actually launching but remains in an "invisible state."
I suspect that the system hides the lightweight camera view when transitioning to the Main App, but fails to reset this hidden state when the Quick Action is triggered subsequently.
I would appreciate any guidance on a potential workaround or confirmation if this is a known issue awaiting a system update.
macOS 26 "Tahoe" is allocating much more memory for apps than former macOS versions: A customer contacted me with my app's Thumbnail extension allocating so much memory that her 48 GB RAM Mac Mini ran into "out of application memory" state. I couldn't identify any memory leak in my extension's code nor reproduce the issue, but found the main app allocating as much as 5 times the memory compared to running on macOS 15 or lower.
This productive app is explicitly using "Liquid Glass" views as well as implicitly e.g. for an inspector pane. So I created a sample app, just based on Xcode's template of a document-based app, and the issue is still showing (although less dramatically): This sample app allocates 22 MB according to Tahoe's Activity Monitor, while Sequoia only requires 16 MB:
macOS 15.6.1
macOS 26.2
Is anyone experiencing similar issues? I suspect some massive leak in Tahoe's memory management, and just filed a corresponding feedback (FB21967167).
Topic:
App & System Services
SubTopic:
Processes & Concurrency
Tags:
Foundation
QuickLook Thumbnailing
AppKit
My team is developing an enterprise VPN application that needs to respond to Mobile Device Management (MDM) profile installations and removals in real-time. Our app uses the NetworkExtension framework and needs to update the UI immediately when VPN configurations are added or removed via MDM.
We are currently observing NEVPNConfigurationChangeNotification to detect VPN configuration changes:
While NEVPNConfigurationChangeNotification fires reliably when users manually remove VPN profiles through Settings > General > VPN & Device Management, it appears to have inconsistent behavior when MDM profiles containing VPN configurations are installed programmatically via MDM systems.
STEPS TO REPRODUCE
From MDM Admin Console: Deploy a new VPN profile to the test device
On Device: Wait for MDM profile installation (usually silent, no user interaction required)
Check Device Settings: Go to Settings > General > VPN & Device Management to confirm profile is installed
Return to App: Check if the UI shows the new VPN profile
Dear Apple Support Team,
Thank you for your continued support.
I would like to inquire about the behavior of CallKit.
Our company provides an office PBX extension phone application (iPhone app).
When the iPhone is placed into sleep mode (screen off) and our app receives an incoming call, the following sequence sometimes results in an audio playback panel
appearing at the bottom of the lock screen for a few seconds after the call ends(See attachment file for detail).
Sequence to reproduce the issue:
Put the iPhone into sleep mode (screen off).
Receive an incoming call to our extension phone app.
CallKit incoming call screen appears.
Answer the call.
Conduct the call.
End the call from the peer.
iOS versions with confirmed behavior:
iOS 26.0: Not observed.
iOS 26.2: Observed.
iOS 26.3: Not observed.
This behavior does not affect the call functionality itself; however, some users report that the temporary appearance of the audio playback panel feels unusual.
If there is any known reason for this behavior or any recommended workaround, we would greatly appreciate your guidance.
Additionally, if this is a known issue that was addressed in iOS 26.3, we would appreciate any information you can provide regarding that as well.
Thank you very much for your assistance.
In an ObjC framework I'm developing (a dylib) that is loaded into JRE to be used via JNI (Zulu, Graal, or "native image" from Graal+ a JAR) I implemented a naive method that collects current memory footprint of the host process: It collects 5 numbers into a simple NSDictionary with NSString keys (physical footprint, default zone bytes used and allocated, and sums for used and allocated bytes for all zones.
The code ran for some time, but at certain point my process started crashing horribly in this method -- at the last line, accessing the dictionary.
Here's the code:
-(NSDictionary *)memoryState {
NSMutableDictionary *memoryState = [NSMutableDictionary dictionaryWithCapacity:8];
// obtain process current physical memory footprint, in bytes.
task_vm_info_data_t info;
mach_msg_type_number_t count = TASK_VM_INFO_COUNT;
kern_return_t kr = task_info(mach_task_self(),
TASK_VM_INFO, (task_info_t)&info, &count);
[memoryState setObject:(kr == KERN_SUCCESS) ? @(info.phys_footprint) : [NSNull null] forKey:@"physical"];
// obtain process default zone's allocated memory, in bytes.
malloc_zone_t *zone = malloc_default_zone();
if (zone!=nil) {
malloc_statistics_t st;
malloc_zone_statistics(zone, &st);
[memoryState setObject:@(st.size_in_use) forKey:@"bytesInUseDefaultZone"];
[memoryState setObject:@(st.size_allocated) forKey:@"bytesAllocatedDefaultZone"];
}
uint64_t zone_count = 0, size_in_use =0, size_allocated = 0;
vm_address_t *zones = NULL;
unsigned int zones_count = 0;
kr = malloc_get_all_zones(mach_task_self(), NULL, &zones, &zones_count);
if (kr == KERN_SUCCESS && zones != NULL && zones_count > 0) {
for (unsigned int i = 0; i < zones_count; i++) {
malloc_zone_t *zone = (malloc_zone_t *)zones[i];
if (!zone) continue;
malloc_statistics_t st;
malloc_zone_statistics(zone, &st);
zone_count++;
size_in_use += (uint64_t)st.size_in_use;
size_allocated += (uint64_t)st.size_allocated;
}
[memoryState setObject:@(size_in_use) forKey:@"bytesInUseAllZones"];
[memoryState setObject:@(size_allocated) forKey:@"bytesAllocatedAllZones"];
}
if (zones != NULL) {
vm_deallocate(mach_task_self(), (vm_address_t)zones, zones_count * sizeof(vm_address_t));
}
return [memoryState copy];
}
my (JRE) process started crashing badly, at the last [memoryState copy]; with crash report I could not understand (looks like an infinite recursion or loop).
Any debug log messages (os_log) for this memoryState, its items or its copy would crash the same.
Finally I found that commenting out the vm_deallocate() call removes the crash.
Sorry to say - I could NOT find anywhere in the documentation anything about malloc_get_all_zones() returned data, and whether I need to deallocate it after use. Some darn AI analyzer pointed out I "had a leak" and that "Apple documentation" which it didn't provide, requires that I thus release this data.
1 ) Do I really have to deallocate the returned "zones" ?? even if I do, something here is strange - zones is a malloc_zone_t ** -- how can it be casted to (vm_address_t)zones
Where can I read actual documentation about these low level APIs and the correct use?
Thanks!
Topic:
App & System Services
SubTopic:
Core OS
How to eliminate this spacing?