Posts under App & System Services topic

Post

Replies

Boosts

Views

Activity

APNs proper behavior when connections are reset without warning
The company I work for sends large amount of traffic to APNs on behalf of our customers, with rates up to 50k/second at peek times. While a vast majority of the messages are successful or return a proper error code that we can parse and honor, roughly 1.5 million times per day our connections are being closed without warning. The networking library we use, https://github.com/hyperium/h2, is exposing these as ErrorKind::ConnectionReset or ErrorKind::BrokenPipe. From our reading of the APNs documentation, it is unclear what the correct response is when this occurs. There is no idempotency key included with our messages, so attempting to resend the message again seems frought with the potential for double sends. However, it some cases it seems clear that at least some of the messages in flight over that connection where never sent out at all. We found this open source project unconditionally retrying messages in this case. https://github.com/rpush/rpush/pull/734 Could someone from the APNs team please lay out the expected behavior a client should have when our connection is unexpected closed in this manner?
4
1
566
19h
Subscriptions load in TestFlight sandbox but not during App Review — 2.1(b), third rejection
Our first submission has now been rejected under Guideline 2.1(b), with the message: "the in-app purchases do not load successfully." Each review was performed on an iPad Air 11-inch (M3) running iPadOS 26.6. The app sells only auto-renewable subscriptions. We cannot reproduce the failure, and we have verified every part of the configuration we can think of. WHAT WE VERIFIED (via the App Store Connect API, not just the UI) Two subscriptions in one group, state READY_TO_SUBMIT Product IDs exactly match what the app requests Available in 175 territories, including the United States Prices set, en-US localizations present for both products and for the group App review screenshots attached to both, state COMPLETE Both subscriptions are included in the review submission (READY_FOR_REVIEW) Paid Apps Agreement: Active. Bank account: Active. Tax forms: Active. WHAT WORKS On our own devices, installed via TestFlight (sandbox environment), the products load correctly and a purchase completes and activates as expected. This works on both a real Apple ID and a Sandbox Tester account. WHAT WE OBSERVED FROM THE REVIEW SESSION We use RevenueCat. Their server-side API returns our offering with both packages and the correct product identifiers, so the offering metadata is fine. Our backend also shows that the reviewer's session reached our servers and signed in successfully at the review timestamp, so the device had working network connectivity. That leaves StoreKit itself returning no products on the reviewer's device, which is what empties the offering. QUESTIONS Are there known conditions under which StoreKit returns no products in the App Review sandbox for subscriptions that are in "Ready to Submit" and are attached to the same submission as the binary? For an app that has never been approved, is product loading during review handled differently from a normal sandbox session on a released app? Is there any way to obtain diagnostics from a review session, or to ask the reviewer for a screenshot of the failing screen? Replies in Resolution Center so far have only repeated the original rejection text. Is there anything specific to iPadOS 26.6 that could affect StoreKit 2 product lookups? For the next submission we have added a timeout and automatic retries around the product lookup, plus a visible retry control instead of a spinner, in case the failure is a transient cold-start timeout. But we would rather understand the actual cause than keep guessing. Any pointers appreciated.
2
1
510
19h
How can Core Motion accelerometer sample age be reliably verified on iOS?
Hello, I’m developing an iPhone safety application for people working alone outdoors. The app uses CMMotionManager accelerometer updates to detect prolonged inactivity while the phone is worn on the body, including when the screen is locked. In a physical iPhone test, we recorded 7,232 samples over approximately 12 minutes, including 6,925 samples tagged as background. Delivery intervals were stable. However, we cannot establish a documented relationship between CMAccelerometerData.timestamp and a host monotonic clock that would let us reliably determine each sample’s acquisition-to-consumption age. My questions are: Is CMAccelerometerData.timestamp guaranteed to be directly comparable to ProcessInfo.systemUptime or mach_absolute_time? How does this relationship behave across device sleep/wake and app suspension/resumption? Can Core Motion deliver previously buffered accelerometer samples after the app resumes? Is there a supported way to calculate or conservatively bound the actual age of an individual accelerometer sample? Our current implementation deliberately treats samples as unverified until their freshness can be established. We do not interpret stable callback intervals as proof of fresh measurements. Any guidance from Apple engineers or developers familiar with Core Motion timestamp semantics would be greatly appreciated. Thank you!
0
0
50
22h
Declared Age Range: fallback behavior, cached results, and older iOS versions
Hello, I am preparing an 18+ workout logging app for iOS and would like to clarify the supported behavior of the Declared Age Range framework before completing its integration. Workout records, body measurements and saved videos are stored locally. Outside additional regulatory requirements, the planned entry flow uses a neutral adult self-declaration without collecting a date of birth or identity documents. The intended storefronts are Japan, the United States, the United Kingdom, Canada, Australia, New Zealand, Ireland and Singapore. These are implementation-design questions, not errors reproduced in a completed DAR integration. I am seeking documented API/platform behavior, not legal approval. Applicability checks that fail If isEligibleForAgeFeatures throws, returns notAvailable, or does not complete, is there a supported fallback signal or recommended retry strategy? I would not interpret an error as a successful “outside regulated scope” result. Is there a documented platform requirement for app access while applicability remains unresolved, separate from developers’ obligations under applicable law? Previously returned adult age ranges If declaredAgeRangeRequired applies and requestAgeRange fails after an earlier adult response, does Apple support relying on an app-stored result? I understand that the system caches responses; my question concerns a result stored separately by the app. Is there a supported way to detect when that result must be invalidated because of an Apple Account change, changes to age information, or sharing/consent changes? If no such signal exists, what implementation pattern does Apple recommend? I would not assume that a previous result always belongs to the current person or invent a cache lifetime. Earlier OS versions For affected newly created Apple Accounts in regulated regions, what supported path applies on: iOS versions without Declared Age Range; iOS 26.0–26.1, without isEligibleForAgeFeatures; iOS 26.2–26.3, without requiredRegulatoryFeatures? The age-assurance Q&A discusses existing Apple Accounts on iOS 18 or earlier. Is there additional documentation covering newly created affected accounts on earlier OS versions? While checks remain unresolved, the proposed design withholds advertising and new purchases and preserves existing data with free export. This is a proposed design, not an assumption that local recording is exempt from any requirement. References reviewed: https://developer.apple.com/support/age-assurance/ https://developer.apple.com/documentation/declaredagerange/requesting-people-share-their-age-range-with-your-app Pointers to relevant documentation or sample code would be appreciated. Thank you.
0
0
36
23h
Sandbox IAP: AuthKit succeeds, then AMSServerErrorDomain -5000 (cancel-purchase-batch)
Every sandbox purchase of our auto-renewable subscriptions cancels right after AuthKit sign-in succeeds. It's blocking our 1.0 release. Filed as FB25469063, no reply yet. Capacitor iOS app, bundle io.xrplive.app, 1.0.0 (TestFlight), products io.xrplive.app.pro.monthly / .yearly, iPhone 17 Pro Max on iOS 27.0.1, StoreKit via @capgo/native-purchases. Console on every attempt: (1) AMSAuthKitUpdateTask: "The AuthKit authentication succeeded." (2) Then: Error Domain=AMSServerErrorDomain Code=-5000 UserInfo={failureType=-5000, m-allowed=false, cancel-purchase-batch=true, customerMessage=Check the account information you entered and try again.} Also AMSErrorDomain Code=100 (Authentication Failed), Code=2 ("Password reuse not available for account"), and a 401 from sandbox.itunes.apple.com/commerce/messages/app/inbox. We already fixed a purchase(confirmIn:) presentation issue. This failure is in sandbox verification after a successful sign-in, which we can't fix from the client. Is -5000 with cancel-purchase-batch a known sandbox account or commerce issue? Is there a sandbox tester or storefront state that fixes it when AuthKit succeeds but verification still fails?
0
0
31
23h
Touch on PROLED XDR Displays
Is there any way to change the default actions here https://support.apple.com/en-gb/guide/macbook-pro-proled-xdr/wv2xzgrweunx/mac When using apps not yet tailored for touch (or even Qt apps that ARE optimsied for touch on other platforms) the default "scroll or pan" by dragging one finger in any direction is effectively interprted as a scroll wheel which is often a zoom function in 2D navigation. I would expect dragging a finger to be passed to the app just like "select multiple items" (which can be triggered by touch and hold then drag, but this behaviour is intermittent at best) Also, similarly, it's diappointing that multi touch gestures like two fingers to pinch to zoom are not passed to the application.
0
0
31
23h
Keeping monitored regions in sync with server changes when background pushes aren’t delivered
Our app logs workers’ arrival and departure at work sites using CLLocationManager region monitoring (up to 20 circular regions, “Always” authorization). Each worker’s list of sites changes on our server (daily schedule, occasional same-day changes). When it changes, we send a background push (apns-push-type: background, apns-priority: 5, aps containing only content-available: 1), and the app fetches the new list and re-registers its regions. On real users’ iPhones (iOS 26.6.2) these pushes often aren’t acted on for hours. It’s typically a newly installed app the user rarely opens, sometimes swiped away, possibly in Low Power Mode. Users won’t open the app or change settings. Region monitoring itself works well for us, including relaunching the app after a swipe-away. We understand background pushes are best-effort, so we’re planning to: fetch the list whenever the app is relaunched by a region event pre-load the next work day’s sites in advance coalesce pushes (max ~2/hour per device) Questions: Is there a recommended way to keep monitored regions in sync with server-side changes for an app the user rarely opens, without user interaction or broader location tracking (we want to avoid significant-location-change for privacy reasons)? If the app is relaunched by a region event, is it fine to do a network fetch and re-register regions in that same background launch? As a fallback when a device hasn’t fetched after a change, would an alert push with mutable-content and a Notification Service Extension that downloads the new list be an acceptable use? On iOS 26, does region monitoring still relaunch an app that was swiped away from the app switcher?
0
0
45
1d
CMMotionActivityManager: past activities move in time between queries (watchOS 27, Apple Watch Ultra 4)
When I query the same past period with CMMotionActivityManager.queryActivityStarting(from:to:to:) at two different times, the second result contains the same activities, but their startDate values are earlier. Setup Apple Watch Ultra 4 (Watch8,1), watchOS 27.0.1 My app reads the activity history a few minutes after it happens and stores it. Later it queries the same period again and compares the results. What I see The activity types and durations do not change. Whole blocks of history move back in time by a constant offset. Example from today's query, compared with the stored values: Period of the dataOffsetNov 8, 12:47 – 19:55−155 sNov 8, 19:57 – Nov 9, 17:18−95 sNov 9, 17:19 – now0 sYesterday at 17:19, the same Nov 8 evening data had an offset of 0 s. So the offset changes over time, not only with the age of the data. New steps add up: when a step occurs, all older history moves back by the same amount. Earlier I saw offsets of −60 s, −123 s, −177 s and −340 s. The stored values match HealthKit workout start and end times within about 8 s. The re-queried values do not (for example −52 s at the start of a run). timestamp of these activities is equal to startDate (seconds since 2001), so it does not help to match them. I did not see this on Apple Watch Ultra 3 with watchOS 27, but I have only one comparison from that watch. Questions Is startDate of a past CMMotionActivity expected to stay the same? If not, which event changes it, and is there a way to detect it? What is the recommended way to get stable times from the activity history? I log every query on the watch (all activities plus clock and battery state every 30 minutes), so I can share data or a sysdiagnose. I will also file a Feedback.
0
0
32
1d
macOS Open Directory: Does ODNodeCreateRecord cleanup preserve concurrent records?
We are designing a local, non-login service account provisioning process on macOS using the public Open Directory API. The documentation for ODNodeCreateRecord() states that if setting an initial attribute fails, the record is deleted and an error is returned. We need to ensure that a failed creation attempt cannot delete or modify a pre-existing record, including during concurrent record creation or replacement. Questions: When attribute initialization fails, is the internal cleanup guaranteed to target only the record instance created by that specific API call, rather than another record with the same name? Is this cleanup bound to a unique record identity or UUID, including if another process concurrently creates, removes, or replaces a record with the same name? Does the public API provide an atomic create-only guarantee that prevents changes to an existing record? If these guarantees are not provided, what supported API or provisioning approach should be used to avoid affecting pre-existing local Directory Services records? Our current plan uses the local /Local/Default Directory Services node for a dedicated service account, administrative change serialization, pre-creation collision checks, and post-operation identity verification. We understand that these checks do not themselves prove atomicity or race-free cleanup. We would appreciate clarification of the supported API guarantees, specifically for macOS 15. Thank you.
3
0
57
1d
NETransparentProxyManager: saving isOnDemandEnabled = true disables On-Demand on other proxies
On macOS, multiple NETransparentProxyManager (NEAppProxyProvider) configurations from different vendors can be enabled (isEnabled = true) and run simultaneously. However, we discovered that when one NETransparentProxyManager configuration calls saveToPreferencesWithCompletionHandler: with isOnDemandEnabled = true, /usr/libexec/nehelper (NEConfigurationManager) silently modifies any other enabled NETransparentProxyManager configuration in /Library/Preferences/com.apple.networkextension.plist and flips its OnDemandEnabled to false (and nesessionmanager logs Resetting VPN On Demand and marks the other session not-kernel-activated). Unlike NEVPNManager.isEnabled (which documents mutual exclusion for personal VPNs), NETransparentProxyManager is designed so multiple transparent proxies can coexist simultaneously, and neither NETransparentProxyManager.h nor NEVPNManager.h documents that isOnDemandEnabled is mutually exclusive across coexisting transparent proxy configurations. Root Cause Observed in NetworkExtension.framework When inspecting -[NEConfigurationManager saveConfigurationToDisk:updateSCPreferences:currentSignature:userUUID:notifyNow:isUpgrade:], when iterating over existing NEConfiguration objects of the same grade: If [[newConfig VPN] isEnabled] && [[otherConfig VPN] isEnabled] && [[newConfig VPN] isOnDemandEnabled] && [[otherConfig VPN] isOnDemandEnabled], NEConfigurationManager invokes: +[NEConfigurationManager disableConfiguration:otherConfig onDemandOnly:YES] disableConfiguration:onDemandOnly:YES calls [[otherConfig VPN] setOnDemandEnabled:NO], even when both configurations are NETransparentProxyManager (TunnelType == 2). Real-World Impact When two enterprise security products that both use NETransparentProxyManager are installed on the same Mac: Both configure isEnabled = true, onDemandRules = [NEOnDemandRuleConnect()], and isOnDemandEnabled = true. Whenever Proxy A saves its preferences, nehelper silently flips Proxy B's isOnDemandEnabled to false (and vice versa). After a reboot or network transition where Proxy B's initial startVPNTunnel fails while Wi-Fi is still associating and Proxy B relies on VPN On Demand (NEOnDemandRuleConnect) to start its NEAppProxyProvider once network connectivity comes up, macOS never starts Proxy B because its isOnDemandEnabled flag was cleared. Minimal Reproducer (Swift) Compile this minimal CLI inside an app bundle signed with the com.apple.developer.networking.networkextension = ["app-proxy-provider"] entitlement: import Foundation import NetworkExtension let args = CommandLine.arguments let name = args.count > 1 ? args[1] : "PocProxyA" let action = args.count > 2 ? args[2] : "status" DispatchQueue.main.async { NETransparentProxyManager.loadAllFromPreferences { managers, error in if let error = error { print("[\(name)] loadAllFromPreferences error: \(error)") exit(1) } let all = managers ?? [] let existing = all.first(where: { $0.localizedDescription == name }) if action == "status" { if let mgr = existing { print("[\(name)] -> isEnabled=\(mgr.isEnabled), isOnDemandEnabled=\(mgr.isOnDemandEnabled), rulesCount=\(mgr.onDemandRules?.count ?? 0)") } else { print("[\(name)] -> not found") } exit(0) } if action == "remove" { guard let mgr = existing else { exit(0) } mgr.removeFromPreferences { err in print("[\(name)] removed (err=\(String(describing: err)))") exit(0) } return } // action == "save" let mgr = existing ?? NETransparentProxyManager() let proto = (mgr.protocolConfiguration as? NETunnelProviderProtocol) ?? NETunnelProviderProtocol() proto.providerBundleIdentifier = "com.example.poc.extension" proto.serverAddress = "127.0.0.1" mgr.protocolConfiguration = proto mgr.localizedDescription = name mgr.isEnabled = true mgr.onDemandRules = [NEOnDemandRuleConnect()] mgr.isOnDemandEnabled = true print("[\(name)] Saving NETransparentProxyManager with isEnabled=true, isOnDemandEnabled=true...") mgr.saveToPreferences { err in if let err = err { print("[\(name)] saveToPreferences error: \(err)") exit(1) } print("[\(name)] saveToPreferences succeeded! isEnabled=\(mgr.isEnabled), isOnDemandEnabled=\(mgr.isOnDemandEnabled)") exit(0) } } } RunLoop.main.run()Reproduction Output Running save on PocProxyA, then save on PocProxyB, and checking status on both: === Step 1: PocProxyA saves isOnDemandEnabled = true === [PocProxyA] Saving NETransparentProxyManager with isEnabled=true, isOnDemandEnabled=true... [PocProxyA] saveToPreferences succeeded! isEnabled=true, isOnDemandEnabled=true [PocProxyA] -> isEnabled=true, isOnDemandEnabled=true, rulesCount=1 === Step 2: PocProxyB saves isOnDemandEnabled = true === [PocProxyB] Saving NETransparentProxyManager with isEnabled=true, isOnDemandEnabled=true... [PocProxyB] saveToPreferences succeeded! isEnabled=true, isOnDemandEnabled=true === Step 3: Check BOTH configurations after PocProxyB saved === [PocProxyA] -> isEnabled=true, isOnDemandEnabled=false, rulesCount=1 [PocProxyB] -> isEnabled=true, isOnDemandEnabled=true, rulesCount=1 === Step 4: PocProxyA saves isOnDemandEnabled = true again === [PocProxyA] Saving NETransparentProxyManager with isEnabled=true, isOnDemandEnabled=true... [PocProxyA] saveToPreferences succeeded! isEnabled=true, isOnDemandEnabled=true === Step 5: Check BOTH configurations after PocProxyA saved === [PocProxyA] -> isEnabled=true, isOnDemandEnabled=true, rulesCount=1 [PocProxyB] -> isEnabled=true, isOnDemandEnabled=false, rulesCount=1Questions Is disableConfiguration:onDemandOnly:YES stripping isOnDemandEnabled across coexisting NETransparentProxyManager (TunnelType = 2) configurations a bug in NEConfigurationManager, or an intentional limitation? Is there a recommended way for two coexisting NETransparentProxyManager configurations from different vendors to both use On-Demand without disabling each other's isOnDemandEnabled flag on saveToPreferences? Filed in Feedback Assistant as FB25463155.
3
2
286
1d
Supported sandbox approach for cross-app window positioning and resizing
I am developing a macOS window-management utility for a new Mac App Store submission, targeting macOS 13+ on Apple silicon and supported Intel Macs. Its core function is to move and resize windows belonging to other, unmodified applications, in response to explicit menu commands, registered keyboard shortcuts, or optional edge-drag snapping. The current unsandboxed engineering implementation uses public Accessibility APIs: AXUIElementCreateApplication, AXUIElementCopyAttributeValue / AXUIElementCopyMultipleAttributeValues for window geometry, AXUIElementCopyElementAtPosition for drag targeting, and AXUIElementSetAttributeValue for AXPosition and AXSize. It requires explicit Accessibility consent. Window information is processed locally; the app does not transmit it. I understand that App Review Guideline 2.4.5(i) requires App Sandbox and that “Protecting user data with App Sandbox” lists assistive Accessibility API use as incompatible. The DTS answer in thread 789663 also explains that sandboxed apps cannot use Accessibility APIs, while noting that some use cases have alternatives. For this specific cross-application positioning/resizing use case: Is there a currently supported public API or documented, requestable entitlement that permits it in a newly submitted sandboxed Mac App Store app? If a supported alternative exists, what API/architecture and minimum OS requirements apply, including any approval process? If there is no supported route, can you confirm that this functionality cannot currently be delivered within the described sandboxed Mac App Store constraints? I am seeking a supported architecture for controlling other apps’ windows. The unsandboxed tests establish functionality only; they do not establish sandbox compatibility or App Review eligibility. References: https://developer.apple.com/app-store/review/guidelines/#hardware-compatibility https://developer.apple.com/documentation/security/protecting-user-data-with-app-sandbox https://developer.apple.com/forums/thread/789663
5
0
148
1d
A logging NWProtocolFramerImplementation-conforming type
This is an extension of https://developer.apple.com/forums/thread/854016 I was wondering if there's a way to print out the bytes passed-through so I can check that framer's implementation. Is there an existing type for this? Or would I need to introduce one? One issue is as a base diagnosing type, I can only check this new framer for correctness through inspection. Another is if using String conversion functionality takes too much resources for a type that may be called alot. My current idea is making an inline-array of 1024 bytes, write the UTF-8 representation directly, wrapping it with a no-allocation NSString, then passing that to the logging infrastructure.
1
0
50
1d
Develop DriverKit extensions locally with a Free Developer Account
I have not seen a clear answer about this: https://developer.apple.com/forums/thread/776657 https://developer.apple.com/forums/thread/743639?answerId=775701022#775701022 Thus, I would like to pose: Is there any way to install a DriverKit extension locally for development and testing using a free developer account, or is development of DriverKit extensions gated behind a paid developer account? Thank you!
7
0
869
1d
NEAppPushProvider times out connecting to a server on a routed subnet, while the containing app connects fine
We use Local Push Connectivity (NEAppPushProvider, matchSSIDs set) to receive notifications from an on-premise MQTT broker over WebSocket (wss://host:port/mqtt). iPhone on Wi-Fi, VLAN A (SSID matches matchSSIDs) Server on wired VLAN B, routing and firewall rules allow VLAN A → VLAN B on that port Result: the containing app, in the foreground, connects successfully to wss://<VLAN B IP>:<port>/mqtt. At the same moment, the app push provider (URLSessionWebSocketTask to the exact same URL) fails with "The request timed out". The provider starts normally (start() is called). When the server has an address on the Wi-Fi subnet (VLAN A), the provider connects without any issue. Is the app push provider restricted to servers on the local subnet of the matched Wi-Fi network? If so, is this documented anywhere? If not, what could prevent the provider from reaching a routed address that the app itself can reach? iOS version: 27.0.1 device : iPhone 13
1
0
78
1d
iPhone entitlement for bounded Bluetooth scanning while the screen is off?
We develop an iPhone app that performs user-started Bluetooth discovery for 1–5 minutes, with visible progress, cancellation and a Live Activity. We need to discover arbitrary BLE advertisers, including nonconnectable devices, and receive repeated RSSI samples during that bounded scan. The app declares bluetooth-central, creates its central manager before starting the Live Activity in the foreground, and scans with nil service filters and duplicates enabled. Discovery continues behind another app while the display is on, but saved observation timestamps stop advancing after the phone is locked with its display off. We understand the restriction described in https://developer.apple.com/forums/thread/815189. Is there an iPhone managed entitlement or supported program that permits this use case? If so, what are the eligibility criteria and application route? We also found com.apple.developer.bluetooth-central-screen-off-scanning mentioned in https://developer.apple.com/forums/thread/835684. That discussion concerns watchOS medical use; we are asking whether any corresponding iPhone capability exists. If no route exists, should we submit an enhancement request through Feedback Assistant?
1
0
45
1d
Supported quarantine-preservation contract for sandboxed file operations
Traverse is a sandboxed macOS file manager with user-selected read/write access. For an input already carrying the complete raw com.apple.quarantine value 0086;timestamp;agent;event, a fresh private copy may receive 0082 with the remaining fields equal. This asks about the input state, without claiming a verified creation recipe for the retained test file. Our security requirement is equality of the entire original raw value before and throughout the interval when the destination name is reachable, including interruption immediately after publication. Is there a documented, supported App Sandbox API or operation that guarantees this for (a) a same-volume, same-inode move from private staging to an absent user-selected name, (b) a new file or extracted ZIP member, and (c) native Trash followed by restoration? If so, what OS/volume/entitlement scope and exact guarantee apply, and can the raw flags and event field be preserved without removing or replacing an OS-assigned quarantine mark? If no such public contract exists, please confirm that raw byte equality cannot be claimed from quarantineProperties, FileManager.trashItem, NSWorkspace.recycle, NSFileCoordinator, rename, clone/copy, or post-operation readback alone. We are not requesting a bypass of quarantine or a weaker substitute for 0086.
1
0
44
1d
Critical Regression: smbfs 7.0 introduces a crtitical bug regarding symlinks
Apple feedback FB25355124 The SMB client no longer accepts reads to symlinks that are an absolute path to a network volume or a symlink that contains a (..) in the relative path. Reproduction steps on an SMB mount with this file structure: dir a.txt Run this command from inside of "dir": ln -s my-link ../dir/a.txt Attempt to read that symlink: cat ./my-link Which results in this error: cat: link: Invalid argument which is translating to an EINVAL getting returned from the SMB client. Same behavior was observed when making a symlink with an absolute path: ln -s my-link /Volumes/Example/dir/a.txt The server is responding successfully to the IOCTL command but the client is still rejecting the request with that error. This behavior was not observed in macOS 26.6.2 (smbfs 6.0.1) as well as previous versions of macOS.
4
5
307
1d
CloudKit JS with Advanced Data Protection: supported access to private encrypted data?
Does CloudKit JS support private encrypted records and assets when Advanced Data Protection is enabled? Our test account has ADP and iCloud.com web access on. Native CloudKit sync succeeds, but Apple’s browser sign-in reports Authentication Error before our callback. The container, environment, allowed origin and callback have been verified. A separate native-generated web token authenticates one identity request, while a known private-record lookup returns ACCESS_DENIED. Is there a supported trusted-device temporary-approval flow for third-party CloudKit JS, or another supported approach that keeps ADP enabled?
0
0
87
1d
PushToTalk: headset "play" never starts a transmission (goes to Music) — and is PTT appropriate for voice capture to an assistant?
Hi, We're building a voice assistant app. The user speaks to the assistant through a Bluetooth earset; the app records the speech, transcribes it and the assistant acts on it. We want the user to start and stop that capture from the earset button while the iPhone stays locked, without the Phone call UI. We prototyped this with the PushToTalk framework and have two questions. 1. Headset play button does not reach our joined PTT channel Setup (minimal test app, nothing else running): iPhone 14 Pro Max, iOS 26.6.1 (23G83). Entitlements: com.apple.developer.push-to-talk, aps-environment. Background modes: push-to-talk, audio, bluetooth-central. PTChannelManager.channelManager(delegate:restorationDelegate:) → requestJoinChannel in the foreground → didJoinChannel → setAccessoryButtonEventsEnabled(true, channelUUID:) completes without error. Audio session configured once before joining: .playAndRecord, options .allowBluetoothHFP; tried mode .default and .voiceChat. We never call setActive; audio starts only in didActivate (AVAudioEngine). What works: The system PTT UI talk button, phone locked: didBeginTransmitting → didActivate (earset HFP 16 kHz) → audio recorded. A Lock Screen / Control Center control running an intent that adopts PushToTalkTransmissionIntent, phone locked: one tap starts, one tap ends; 5+ minute transmissions; app cold-launched by the system when needed. What doesn't: pressing the earset's play/pause button (single press) while joined and idle never produces didBeginTransmitting. Same result with AirPods and with a third-party A2DP/HFP earset, locked and unlocked, Music app closed or not. mediaremoted logs, for every press: mediaremoted: Received command from client <... bundleIdentifier = com.apple.BTAvrcp ...>: <... command = Play ...> mediaremoted: No context for context-sensitive command <... command = Play, SenderBundleIdentifier = <com.apple.BTAvrcp> ...> mediaremoted: Destination app com.apple.Music not available for command <... command = Play ...> mediaremoted: Sending previously queued command <... command = Play ...> (Music is launched and plays)In thread 804205 you described this path as pressing "play" on an A2DP/HFP accessory "that's currently in playback mode". Questions: a) What exactly must be true for a headset AVRCP Play/Pause to be routed to the PTT system instead of the now-playing app? Is "playback mode" a state of our channel (e.g. only while setActiveRemoteParticipant is set / audio is playing), of the accessory, or of the route? b) Is an idle joined channel (no remote participant, nothing playing) expected to receive accessory events at all? c) Is a press-once start / press-once end mapping supported for accessory events, or is it press-and-hold only? d) If headset buttons cannot start a transmission from idle, is the BLE path (requestBeginTransmitting from a CoreBluetooth event) the only supported option for an earset trigger? (Our earset exposes no BLE button characteristic, so that would require firmware changes.) 2. Is this an appropriate use of PushToTalk? The audio goes from the user to our assistant service (speech-to-text, then the assistant responds in the app or by voice). There is no second human on the channel. In thread 816408 you noted the voice communication frameworks "can't be used for any other purpose". Would capturing a user's spoken requests/notes for an AI assistant through PTT be considered a supported use, or is PTT limited to person-to-person communication? If it isn't, is there any supported API that lets a user start and stop audio capture with an earset or a Lock Screen control while the device stays locked? A sysdiagnose and the test project are available on request. Thanks!
1
0
107
1d
[macOS 27] Cannot receive 4096-byte packets over USB CDC-ACM (works in macOS 26)
Hello, I’m facing an issue with a custom USB CDC-ACM device after updating to macOS 27. The device sends 4096-byte packets, which were correctly received under macOS 26. Since I need to transfer large amounts of data, 4096 bytes was a good compromise between performance and reliability. However, now any packet larger than 1019 bytes is not received at all. Wireshark confirms that the packets are present on the USB bus, but neither Serial Tool nor my own software can see them. The device uses the AppleUSBACMData driver (CDC-Data interface, Full Speed USB, with bMaxPacketSize0=64). Fragmenting the incoming data into chunks of 1019 bytes or less works as a temporary fix, but it significantly reduces performance and is not a sustainable solution. I have three specific questions: Is there a hardcoded 1019-byte buffer limit in AppleUSBACMData or IOSerialFamily in macOS 27? Is this a known issue in macOS 27 with CDC-ACM devices? Should I consider writing a custom driver for my device instead of relying on Apple’s default AppleUSBACMData? Any help or insights would be greatly appreciated. Thanks!
1
0
40
1d
APNs proper behavior when connections are reset without warning
The company I work for sends large amount of traffic to APNs on behalf of our customers, with rates up to 50k/second at peek times. While a vast majority of the messages are successful or return a proper error code that we can parse and honor, roughly 1.5 million times per day our connections are being closed without warning. The networking library we use, https://github.com/hyperium/h2, is exposing these as ErrorKind::ConnectionReset or ErrorKind::BrokenPipe. From our reading of the APNs documentation, it is unclear what the correct response is when this occurs. There is no idempotency key included with our messages, so attempting to resend the message again seems frought with the potential for double sends. However, it some cases it seems clear that at least some of the messages in flight over that connection where never sent out at all. We found this open source project unconditionally retrying messages in this case. https://github.com/rpush/rpush/pull/734 Could someone from the APNs team please lay out the expected behavior a client should have when our connection is unexpected closed in this manner?
Replies
4
Boosts
1
Views
566
Activity
19h
Subscriptions load in TestFlight sandbox but not during App Review — 2.1(b), third rejection
Our first submission has now been rejected under Guideline 2.1(b), with the message: "the in-app purchases do not load successfully." Each review was performed on an iPad Air 11-inch (M3) running iPadOS 26.6. The app sells only auto-renewable subscriptions. We cannot reproduce the failure, and we have verified every part of the configuration we can think of. WHAT WE VERIFIED (via the App Store Connect API, not just the UI) Two subscriptions in one group, state READY_TO_SUBMIT Product IDs exactly match what the app requests Available in 175 territories, including the United States Prices set, en-US localizations present for both products and for the group App review screenshots attached to both, state COMPLETE Both subscriptions are included in the review submission (READY_FOR_REVIEW) Paid Apps Agreement: Active. Bank account: Active. Tax forms: Active. WHAT WORKS On our own devices, installed via TestFlight (sandbox environment), the products load correctly and a purchase completes and activates as expected. This works on both a real Apple ID and a Sandbox Tester account. WHAT WE OBSERVED FROM THE REVIEW SESSION We use RevenueCat. Their server-side API returns our offering with both packages and the correct product identifiers, so the offering metadata is fine. Our backend also shows that the reviewer's session reached our servers and signed in successfully at the review timestamp, so the device had working network connectivity. That leaves StoreKit itself returning no products on the reviewer's device, which is what empties the offering. QUESTIONS Are there known conditions under which StoreKit returns no products in the App Review sandbox for subscriptions that are in "Ready to Submit" and are attached to the same submission as the binary? For an app that has never been approved, is product loading during review handled differently from a normal sandbox session on a released app? Is there any way to obtain diagnostics from a review session, or to ask the reviewer for a screenshot of the failing screen? Replies in Resolution Center so far have only repeated the original rejection text. Is there anything specific to iPadOS 26.6 that could affect StoreKit 2 product lookups? For the next submission we have added a timeout and automatic retries around the product lookup, plus a visible retry control instead of a spinner, in case the failure is a transient cold-start timeout. But we would rather understand the actual cause than keep guessing. Any pointers appreciated.
Replies
2
Boosts
1
Views
510
Activity
19h
How can Core Motion accelerometer sample age be reliably verified on iOS?
Hello, I’m developing an iPhone safety application for people working alone outdoors. The app uses CMMotionManager accelerometer updates to detect prolonged inactivity while the phone is worn on the body, including when the screen is locked. In a physical iPhone test, we recorded 7,232 samples over approximately 12 minutes, including 6,925 samples tagged as background. Delivery intervals were stable. However, we cannot establish a documented relationship between CMAccelerometerData.timestamp and a host monotonic clock that would let us reliably determine each sample’s acquisition-to-consumption age. My questions are: Is CMAccelerometerData.timestamp guaranteed to be directly comparable to ProcessInfo.systemUptime or mach_absolute_time? How does this relationship behave across device sleep/wake and app suspension/resumption? Can Core Motion deliver previously buffered accelerometer samples after the app resumes? Is there a supported way to calculate or conservatively bound the actual age of an individual accelerometer sample? Our current implementation deliberately treats samples as unverified until their freshness can be established. We do not interpret stable callback intervals as proof of fresh measurements. Any guidance from Apple engineers or developers familiar with Core Motion timestamp semantics would be greatly appreciated. Thank you!
Replies
0
Boosts
0
Views
50
Activity
22h
Declared Age Range: fallback behavior, cached results, and older iOS versions
Hello, I am preparing an 18+ workout logging app for iOS and would like to clarify the supported behavior of the Declared Age Range framework before completing its integration. Workout records, body measurements and saved videos are stored locally. Outside additional regulatory requirements, the planned entry flow uses a neutral adult self-declaration without collecting a date of birth or identity documents. The intended storefronts are Japan, the United States, the United Kingdom, Canada, Australia, New Zealand, Ireland and Singapore. These are implementation-design questions, not errors reproduced in a completed DAR integration. I am seeking documented API/platform behavior, not legal approval. Applicability checks that fail If isEligibleForAgeFeatures throws, returns notAvailable, or does not complete, is there a supported fallback signal or recommended retry strategy? I would not interpret an error as a successful “outside regulated scope” result. Is there a documented platform requirement for app access while applicability remains unresolved, separate from developers’ obligations under applicable law? Previously returned adult age ranges If declaredAgeRangeRequired applies and requestAgeRange fails after an earlier adult response, does Apple support relying on an app-stored result? I understand that the system caches responses; my question concerns a result stored separately by the app. Is there a supported way to detect when that result must be invalidated because of an Apple Account change, changes to age information, or sharing/consent changes? If no such signal exists, what implementation pattern does Apple recommend? I would not assume that a previous result always belongs to the current person or invent a cache lifetime. Earlier OS versions For affected newly created Apple Accounts in regulated regions, what supported path applies on: iOS versions without Declared Age Range; iOS 26.0–26.1, without isEligibleForAgeFeatures; iOS 26.2–26.3, without requiredRegulatoryFeatures? The age-assurance Q&A discusses existing Apple Accounts on iOS 18 or earlier. Is there additional documentation covering newly created affected accounts on earlier OS versions? While checks remain unresolved, the proposed design withholds advertising and new purchases and preserves existing data with free export. This is a proposed design, not an assumption that local recording is exempt from any requirement. References reviewed: https://developer.apple.com/support/age-assurance/ https://developer.apple.com/documentation/declaredagerange/requesting-people-share-their-age-range-with-your-app Pointers to relevant documentation or sample code would be appreciated. Thank you.
Replies
0
Boosts
0
Views
36
Activity
23h
Sandbox IAP: AuthKit succeeds, then AMSServerErrorDomain -5000 (cancel-purchase-batch)
Every sandbox purchase of our auto-renewable subscriptions cancels right after AuthKit sign-in succeeds. It's blocking our 1.0 release. Filed as FB25469063, no reply yet. Capacitor iOS app, bundle io.xrplive.app, 1.0.0 (TestFlight), products io.xrplive.app.pro.monthly / .yearly, iPhone 17 Pro Max on iOS 27.0.1, StoreKit via @capgo/native-purchases. Console on every attempt: (1) AMSAuthKitUpdateTask: "The AuthKit authentication succeeded." (2) Then: Error Domain=AMSServerErrorDomain Code=-5000 UserInfo={failureType=-5000, m-allowed=false, cancel-purchase-batch=true, customerMessage=Check the account information you entered and try again.} Also AMSErrorDomain Code=100 (Authentication Failed), Code=2 ("Password reuse not available for account"), and a 401 from sandbox.itunes.apple.com/commerce/messages/app/inbox. We already fixed a purchase(confirmIn:) presentation issue. This failure is in sandbox verification after a successful sign-in, which we can't fix from the client. Is -5000 with cancel-purchase-batch a known sandbox account or commerce issue? Is there a sandbox tester or storefront state that fixes it when AuthKit succeeds but verification still fails?
Replies
0
Boosts
0
Views
31
Activity
23h
Touch on PROLED XDR Displays
Is there any way to change the default actions here https://support.apple.com/en-gb/guide/macbook-pro-proled-xdr/wv2xzgrweunx/mac When using apps not yet tailored for touch (or even Qt apps that ARE optimsied for touch on other platforms) the default "scroll or pan" by dragging one finger in any direction is effectively interprted as a scroll wheel which is often a zoom function in 2D navigation. I would expect dragging a finger to be passed to the app just like "select multiple items" (which can be triggered by touch and hold then drag, but this behaviour is intermittent at best) Also, similarly, it's diappointing that multi touch gestures like two fingers to pinch to zoom are not passed to the application.
Replies
0
Boosts
0
Views
31
Activity
23h
Keeping monitored regions in sync with server changes when background pushes aren’t delivered
Our app logs workers’ arrival and departure at work sites using CLLocationManager region monitoring (up to 20 circular regions, “Always” authorization). Each worker’s list of sites changes on our server (daily schedule, occasional same-day changes). When it changes, we send a background push (apns-push-type: background, apns-priority: 5, aps containing only content-available: 1), and the app fetches the new list and re-registers its regions. On real users’ iPhones (iOS 26.6.2) these pushes often aren’t acted on for hours. It’s typically a newly installed app the user rarely opens, sometimes swiped away, possibly in Low Power Mode. Users won’t open the app or change settings. Region monitoring itself works well for us, including relaunching the app after a swipe-away. We understand background pushes are best-effort, so we’re planning to: fetch the list whenever the app is relaunched by a region event pre-load the next work day’s sites in advance coalesce pushes (max ~2/hour per device) Questions: Is there a recommended way to keep monitored regions in sync with server-side changes for an app the user rarely opens, without user interaction or broader location tracking (we want to avoid significant-location-change for privacy reasons)? If the app is relaunched by a region event, is it fine to do a network fetch and re-register regions in that same background launch? As a fallback when a device hasn’t fetched after a change, would an alert push with mutable-content and a Notification Service Extension that downloads the new list be an acceptable use? On iOS 26, does region monitoring still relaunch an app that was swiped away from the app switcher?
Replies
0
Boosts
0
Views
45
Activity
1d
CMMotionActivityManager: past activities move in time between queries (watchOS 27, Apple Watch Ultra 4)
When I query the same past period with CMMotionActivityManager.queryActivityStarting(from:to:to:) at two different times, the second result contains the same activities, but their startDate values are earlier. Setup Apple Watch Ultra 4 (Watch8,1), watchOS 27.0.1 My app reads the activity history a few minutes after it happens and stores it. Later it queries the same period again and compares the results. What I see The activity types and durations do not change. Whole blocks of history move back in time by a constant offset. Example from today's query, compared with the stored values: Period of the dataOffsetNov 8, 12:47 – 19:55−155 sNov 8, 19:57 – Nov 9, 17:18−95 sNov 9, 17:19 – now0 sYesterday at 17:19, the same Nov 8 evening data had an offset of 0 s. So the offset changes over time, not only with the age of the data. New steps add up: when a step occurs, all older history moves back by the same amount. Earlier I saw offsets of −60 s, −123 s, −177 s and −340 s. The stored values match HealthKit workout start and end times within about 8 s. The re-queried values do not (for example −52 s at the start of a run). timestamp of these activities is equal to startDate (seconds since 2001), so it does not help to match them. I did not see this on Apple Watch Ultra 3 with watchOS 27, but I have only one comparison from that watch. Questions Is startDate of a past CMMotionActivity expected to stay the same? If not, which event changes it, and is there a way to detect it? What is the recommended way to get stable times from the activity history? I log every query on the watch (all activities plus clock and battery state every 30 minutes), so I can share data or a sysdiagnose. I will also file a Feedback.
Replies
0
Boosts
0
Views
32
Activity
1d
macOS Open Directory: Does ODNodeCreateRecord cleanup preserve concurrent records?
We are designing a local, non-login service account provisioning process on macOS using the public Open Directory API. The documentation for ODNodeCreateRecord() states that if setting an initial attribute fails, the record is deleted and an error is returned. We need to ensure that a failed creation attempt cannot delete or modify a pre-existing record, including during concurrent record creation or replacement. Questions: When attribute initialization fails, is the internal cleanup guaranteed to target only the record instance created by that specific API call, rather than another record with the same name? Is this cleanup bound to a unique record identity or UUID, including if another process concurrently creates, removes, or replaces a record with the same name? Does the public API provide an atomic create-only guarantee that prevents changes to an existing record? If these guarantees are not provided, what supported API or provisioning approach should be used to avoid affecting pre-existing local Directory Services records? Our current plan uses the local /Local/Default Directory Services node for a dedicated service account, administrative change serialization, pre-creation collision checks, and post-operation identity verification. We understand that these checks do not themselves prove atomicity or race-free cleanup. We would appreciate clarification of the supported API guarantees, specifically for macOS 15. Thank you.
Replies
3
Boosts
0
Views
57
Activity
1d
NETransparentProxyManager: saving isOnDemandEnabled = true disables On-Demand on other proxies
On macOS, multiple NETransparentProxyManager (NEAppProxyProvider) configurations from different vendors can be enabled (isEnabled = true) and run simultaneously. However, we discovered that when one NETransparentProxyManager configuration calls saveToPreferencesWithCompletionHandler: with isOnDemandEnabled = true, /usr/libexec/nehelper (NEConfigurationManager) silently modifies any other enabled NETransparentProxyManager configuration in /Library/Preferences/com.apple.networkextension.plist and flips its OnDemandEnabled to false (and nesessionmanager logs Resetting VPN On Demand and marks the other session not-kernel-activated). Unlike NEVPNManager.isEnabled (which documents mutual exclusion for personal VPNs), NETransparentProxyManager is designed so multiple transparent proxies can coexist simultaneously, and neither NETransparentProxyManager.h nor NEVPNManager.h documents that isOnDemandEnabled is mutually exclusive across coexisting transparent proxy configurations. Root Cause Observed in NetworkExtension.framework When inspecting -[NEConfigurationManager saveConfigurationToDisk:updateSCPreferences:currentSignature:userUUID:notifyNow:isUpgrade:], when iterating over existing NEConfiguration objects of the same grade: If [[newConfig VPN] isEnabled] && [[otherConfig VPN] isEnabled] && [[newConfig VPN] isOnDemandEnabled] && [[otherConfig VPN] isOnDemandEnabled], NEConfigurationManager invokes: +[NEConfigurationManager disableConfiguration:otherConfig onDemandOnly:YES] disableConfiguration:onDemandOnly:YES calls [[otherConfig VPN] setOnDemandEnabled:NO], even when both configurations are NETransparentProxyManager (TunnelType == 2). Real-World Impact When two enterprise security products that both use NETransparentProxyManager are installed on the same Mac: Both configure isEnabled = true, onDemandRules = [NEOnDemandRuleConnect()], and isOnDemandEnabled = true. Whenever Proxy A saves its preferences, nehelper silently flips Proxy B's isOnDemandEnabled to false (and vice versa). After a reboot or network transition where Proxy B's initial startVPNTunnel fails while Wi-Fi is still associating and Proxy B relies on VPN On Demand (NEOnDemandRuleConnect) to start its NEAppProxyProvider once network connectivity comes up, macOS never starts Proxy B because its isOnDemandEnabled flag was cleared. Minimal Reproducer (Swift) Compile this minimal CLI inside an app bundle signed with the com.apple.developer.networking.networkextension = ["app-proxy-provider"] entitlement: import Foundation import NetworkExtension let args = CommandLine.arguments let name = args.count > 1 ? args[1] : "PocProxyA" let action = args.count > 2 ? args[2] : "status" DispatchQueue.main.async { NETransparentProxyManager.loadAllFromPreferences { managers, error in if let error = error { print("[\(name)] loadAllFromPreferences error: \(error)") exit(1) } let all = managers ?? [] let existing = all.first(where: { $0.localizedDescription == name }) if action == "status" { if let mgr = existing { print("[\(name)] -> isEnabled=\(mgr.isEnabled), isOnDemandEnabled=\(mgr.isOnDemandEnabled), rulesCount=\(mgr.onDemandRules?.count ?? 0)") } else { print("[\(name)] -> not found") } exit(0) } if action == "remove" { guard let mgr = existing else { exit(0) } mgr.removeFromPreferences { err in print("[\(name)] removed (err=\(String(describing: err)))") exit(0) } return } // action == "save" let mgr = existing ?? NETransparentProxyManager() let proto = (mgr.protocolConfiguration as? NETunnelProviderProtocol) ?? NETunnelProviderProtocol() proto.providerBundleIdentifier = "com.example.poc.extension" proto.serverAddress = "127.0.0.1" mgr.protocolConfiguration = proto mgr.localizedDescription = name mgr.isEnabled = true mgr.onDemandRules = [NEOnDemandRuleConnect()] mgr.isOnDemandEnabled = true print("[\(name)] Saving NETransparentProxyManager with isEnabled=true, isOnDemandEnabled=true...") mgr.saveToPreferences { err in if let err = err { print("[\(name)] saveToPreferences error: \(err)") exit(1) } print("[\(name)] saveToPreferences succeeded! isEnabled=\(mgr.isEnabled), isOnDemandEnabled=\(mgr.isOnDemandEnabled)") exit(0) } } } RunLoop.main.run()Reproduction Output Running save on PocProxyA, then save on PocProxyB, and checking status on both: === Step 1: PocProxyA saves isOnDemandEnabled = true === [PocProxyA] Saving NETransparentProxyManager with isEnabled=true, isOnDemandEnabled=true... [PocProxyA] saveToPreferences succeeded! isEnabled=true, isOnDemandEnabled=true [PocProxyA] -> isEnabled=true, isOnDemandEnabled=true, rulesCount=1 === Step 2: PocProxyB saves isOnDemandEnabled = true === [PocProxyB] Saving NETransparentProxyManager with isEnabled=true, isOnDemandEnabled=true... [PocProxyB] saveToPreferences succeeded! isEnabled=true, isOnDemandEnabled=true === Step 3: Check BOTH configurations after PocProxyB saved === [PocProxyA] -> isEnabled=true, isOnDemandEnabled=false, rulesCount=1 [PocProxyB] -> isEnabled=true, isOnDemandEnabled=true, rulesCount=1 === Step 4: PocProxyA saves isOnDemandEnabled = true again === [PocProxyA] Saving NETransparentProxyManager with isEnabled=true, isOnDemandEnabled=true... [PocProxyA] saveToPreferences succeeded! isEnabled=true, isOnDemandEnabled=true === Step 5: Check BOTH configurations after PocProxyA saved === [PocProxyA] -> isEnabled=true, isOnDemandEnabled=true, rulesCount=1 [PocProxyB] -> isEnabled=true, isOnDemandEnabled=false, rulesCount=1Questions Is disableConfiguration:onDemandOnly:YES stripping isOnDemandEnabled across coexisting NETransparentProxyManager (TunnelType = 2) configurations a bug in NEConfigurationManager, or an intentional limitation? Is there a recommended way for two coexisting NETransparentProxyManager configurations from different vendors to both use On-Demand without disabling each other's isOnDemandEnabled flag on saveToPreferences? Filed in Feedback Assistant as FB25463155.
Replies
3
Boosts
2
Views
286
Activity
1d
Supported sandbox approach for cross-app window positioning and resizing
I am developing a macOS window-management utility for a new Mac App Store submission, targeting macOS 13+ on Apple silicon and supported Intel Macs. Its core function is to move and resize windows belonging to other, unmodified applications, in response to explicit menu commands, registered keyboard shortcuts, or optional edge-drag snapping. The current unsandboxed engineering implementation uses public Accessibility APIs: AXUIElementCreateApplication, AXUIElementCopyAttributeValue / AXUIElementCopyMultipleAttributeValues for window geometry, AXUIElementCopyElementAtPosition for drag targeting, and AXUIElementSetAttributeValue for AXPosition and AXSize. It requires explicit Accessibility consent. Window information is processed locally; the app does not transmit it. I understand that App Review Guideline 2.4.5(i) requires App Sandbox and that “Protecting user data with App Sandbox” lists assistive Accessibility API use as incompatible. The DTS answer in thread 789663 also explains that sandboxed apps cannot use Accessibility APIs, while noting that some use cases have alternatives. For this specific cross-application positioning/resizing use case: Is there a currently supported public API or documented, requestable entitlement that permits it in a newly submitted sandboxed Mac App Store app? If a supported alternative exists, what API/architecture and minimum OS requirements apply, including any approval process? If there is no supported route, can you confirm that this functionality cannot currently be delivered within the described sandboxed Mac App Store constraints? I am seeking a supported architecture for controlling other apps’ windows. The unsandboxed tests establish functionality only; they do not establish sandbox compatibility or App Review eligibility. References: https://developer.apple.com/app-store/review/guidelines/#hardware-compatibility https://developer.apple.com/documentation/security/protecting-user-data-with-app-sandbox https://developer.apple.com/forums/thread/789663
Replies
5
Boosts
0
Views
148
Activity
1d
A logging NWProtocolFramerImplementation-conforming type
This is an extension of https://developer.apple.com/forums/thread/854016 I was wondering if there's a way to print out the bytes passed-through so I can check that framer's implementation. Is there an existing type for this? Or would I need to introduce one? One issue is as a base diagnosing type, I can only check this new framer for correctness through inspection. Another is if using String conversion functionality takes too much resources for a type that may be called alot. My current idea is making an inline-array of 1024 bytes, write the UTF-8 representation directly, wrapping it with a no-allocation NSString, then passing that to the logging infrastructure.
Replies
1
Boosts
0
Views
50
Activity
1d
Develop DriverKit extensions locally with a Free Developer Account
I have not seen a clear answer about this: https://developer.apple.com/forums/thread/776657 https://developer.apple.com/forums/thread/743639?answerId=775701022#775701022 Thus, I would like to pose: Is there any way to install a DriverKit extension locally for development and testing using a free developer account, or is development of DriverKit extensions gated behind a paid developer account? Thank you!
Replies
7
Boosts
0
Views
869
Activity
1d
NEAppPushProvider times out connecting to a server on a routed subnet, while the containing app connects fine
We use Local Push Connectivity (NEAppPushProvider, matchSSIDs set) to receive notifications from an on-premise MQTT broker over WebSocket (wss://host:port/mqtt). iPhone on Wi-Fi, VLAN A (SSID matches matchSSIDs) Server on wired VLAN B, routing and firewall rules allow VLAN A → VLAN B on that port Result: the containing app, in the foreground, connects successfully to wss://<VLAN B IP>:<port>/mqtt. At the same moment, the app push provider (URLSessionWebSocketTask to the exact same URL) fails with "The request timed out". The provider starts normally (start() is called). When the server has an address on the Wi-Fi subnet (VLAN A), the provider connects without any issue. Is the app push provider restricted to servers on the local subnet of the matched Wi-Fi network? If so, is this documented anywhere? If not, what could prevent the provider from reaching a routed address that the app itself can reach? iOS version: 27.0.1 device : iPhone 13
Replies
1
Boosts
0
Views
78
Activity
1d
iPhone entitlement for bounded Bluetooth scanning while the screen is off?
We develop an iPhone app that performs user-started Bluetooth discovery for 1–5 minutes, with visible progress, cancellation and a Live Activity. We need to discover arbitrary BLE advertisers, including nonconnectable devices, and receive repeated RSSI samples during that bounded scan. The app declares bluetooth-central, creates its central manager before starting the Live Activity in the foreground, and scans with nil service filters and duplicates enabled. Discovery continues behind another app while the display is on, but saved observation timestamps stop advancing after the phone is locked with its display off. We understand the restriction described in https://developer.apple.com/forums/thread/815189. Is there an iPhone managed entitlement or supported program that permits this use case? If so, what are the eligibility criteria and application route? We also found com.apple.developer.bluetooth-central-screen-off-scanning mentioned in https://developer.apple.com/forums/thread/835684. That discussion concerns watchOS medical use; we are asking whether any corresponding iPhone capability exists. If no route exists, should we submit an enhancement request through Feedback Assistant?
Replies
1
Boosts
0
Views
45
Activity
1d
Supported quarantine-preservation contract for sandboxed file operations
Traverse is a sandboxed macOS file manager with user-selected read/write access. For an input already carrying the complete raw com.apple.quarantine value 0086;timestamp;agent;event, a fresh private copy may receive 0082 with the remaining fields equal. This asks about the input state, without claiming a verified creation recipe for the retained test file. Our security requirement is equality of the entire original raw value before and throughout the interval when the destination name is reachable, including interruption immediately after publication. Is there a documented, supported App Sandbox API or operation that guarantees this for (a) a same-volume, same-inode move from private staging to an absent user-selected name, (b) a new file or extracted ZIP member, and (c) native Trash followed by restoration? If so, what OS/volume/entitlement scope and exact guarantee apply, and can the raw flags and event field be preserved without removing or replacing an OS-assigned quarantine mark? If no such public contract exists, please confirm that raw byte equality cannot be claimed from quarantineProperties, FileManager.trashItem, NSWorkspace.recycle, NSFileCoordinator, rename, clone/copy, or post-operation readback alone. We are not requesting a bypass of quarantine or a weaker substitute for 0086.
Replies
1
Boosts
0
Views
44
Activity
1d
Critical Regression: smbfs 7.0 introduces a crtitical bug regarding symlinks
Apple feedback FB25355124 The SMB client no longer accepts reads to symlinks that are an absolute path to a network volume or a symlink that contains a (..) in the relative path. Reproduction steps on an SMB mount with this file structure: dir a.txt Run this command from inside of "dir": ln -s my-link ../dir/a.txt Attempt to read that symlink: cat ./my-link Which results in this error: cat: link: Invalid argument which is translating to an EINVAL getting returned from the SMB client. Same behavior was observed when making a symlink with an absolute path: ln -s my-link /Volumes/Example/dir/a.txt The server is responding successfully to the IOCTL command but the client is still rejecting the request with that error. This behavior was not observed in macOS 26.6.2 (smbfs 6.0.1) as well as previous versions of macOS.
Replies
4
Boosts
5
Views
307
Activity
1d
CloudKit JS with Advanced Data Protection: supported access to private encrypted data?
Does CloudKit JS support private encrypted records and assets when Advanced Data Protection is enabled? Our test account has ADP and iCloud.com web access on. Native CloudKit sync succeeds, but Apple’s browser sign-in reports Authentication Error before our callback. The container, environment, allowed origin and callback have been verified. A separate native-generated web token authenticates one identity request, while a known private-record lookup returns ACCESS_DENIED. Is there a supported trusted-device temporary-approval flow for third-party CloudKit JS, or another supported approach that keeps ADP enabled?
Replies
0
Boosts
0
Views
87
Activity
1d
PushToTalk: headset "play" never starts a transmission (goes to Music) — and is PTT appropriate for voice capture to an assistant?
Hi, We're building a voice assistant app. The user speaks to the assistant through a Bluetooth earset; the app records the speech, transcribes it and the assistant acts on it. We want the user to start and stop that capture from the earset button while the iPhone stays locked, without the Phone call UI. We prototyped this with the PushToTalk framework and have two questions. 1. Headset play button does not reach our joined PTT channel Setup (minimal test app, nothing else running): iPhone 14 Pro Max, iOS 26.6.1 (23G83). Entitlements: com.apple.developer.push-to-talk, aps-environment. Background modes: push-to-talk, audio, bluetooth-central. PTChannelManager.channelManager(delegate:restorationDelegate:) → requestJoinChannel in the foreground → didJoinChannel → setAccessoryButtonEventsEnabled(true, channelUUID:) completes without error. Audio session configured once before joining: .playAndRecord, options .allowBluetoothHFP; tried mode .default and .voiceChat. We never call setActive; audio starts only in didActivate (AVAudioEngine). What works: The system PTT UI talk button, phone locked: didBeginTransmitting → didActivate (earset HFP 16 kHz) → audio recorded. A Lock Screen / Control Center control running an intent that adopts PushToTalkTransmissionIntent, phone locked: one tap starts, one tap ends; 5+ minute transmissions; app cold-launched by the system when needed. What doesn't: pressing the earset's play/pause button (single press) while joined and idle never produces didBeginTransmitting. Same result with AirPods and with a third-party A2DP/HFP earset, locked and unlocked, Music app closed or not. mediaremoted logs, for every press: mediaremoted: Received command from client <... bundleIdentifier = com.apple.BTAvrcp ...>: <... command = Play ...> mediaremoted: No context for context-sensitive command <... command = Play, SenderBundleIdentifier = <com.apple.BTAvrcp> ...> mediaremoted: Destination app com.apple.Music not available for command <... command = Play ...> mediaremoted: Sending previously queued command <... command = Play ...> (Music is launched and plays)In thread 804205 you described this path as pressing "play" on an A2DP/HFP accessory "that's currently in playback mode". Questions: a) What exactly must be true for a headset AVRCP Play/Pause to be routed to the PTT system instead of the now-playing app? Is "playback mode" a state of our channel (e.g. only while setActiveRemoteParticipant is set / audio is playing), of the accessory, or of the route? b) Is an idle joined channel (no remote participant, nothing playing) expected to receive accessory events at all? c) Is a press-once start / press-once end mapping supported for accessory events, or is it press-and-hold only? d) If headset buttons cannot start a transmission from idle, is the BLE path (requestBeginTransmitting from a CoreBluetooth event) the only supported option for an earset trigger? (Our earset exposes no BLE button characteristic, so that would require firmware changes.) 2. Is this an appropriate use of PushToTalk? The audio goes from the user to our assistant service (speech-to-text, then the assistant responds in the app or by voice). There is no second human on the channel. In thread 816408 you noted the voice communication frameworks "can't be used for any other purpose". Would capturing a user's spoken requests/notes for an AI assistant through PTT be considered a supported use, or is PTT limited to person-to-person communication? If it isn't, is there any supported API that lets a user start and stop audio capture with an earset or a Lock Screen control while the device stays locked? A sysdiagnose and the test project are available on request. Thanks!
Replies
1
Boosts
0
Views
107
Activity
1d
[macOS 27] Cannot receive 4096-byte packets over USB CDC-ACM (works in macOS 26)
Hello, I’m facing an issue with a custom USB CDC-ACM device after updating to macOS 27. The device sends 4096-byte packets, which were correctly received under macOS 26. Since I need to transfer large amounts of data, 4096 bytes was a good compromise between performance and reliability. However, now any packet larger than 1019 bytes is not received at all. Wireshark confirms that the packets are present on the USB bus, but neither Serial Tool nor my own software can see them. The device uses the AppleUSBACMData driver (CDC-Data interface, Full Speed USB, with bMaxPacketSize0=64). Fragmenting the incoming data into chunks of 1019 bytes or less works as a temporary fix, but it significantly reduces performance and is not a sustainable solution. I have three specific questions: Is there a hardcoded 1019-byte buffer limit in AppleUSBACMData or IOSerialFamily in macOS 27? Is this a known issue in macOS 27 with CDC-ACM devices? Should I consider writing a custom driver for my device instead of relying on Apple’s default AppleUSBACMData? Any help or insights would be greatly appreciated. Thanks!
Replies
1
Boosts
0
Views
40
Activity
1d