Posts under App & System Services topic

Post

Replies

Boosts

Views

Activity

PushKit + CallKit for opt-in monitoring alerts?
Hi, Is it permitted to use PushKit and CallKit for monitoring alerts that users explicitly enable? An API event would trigger an incoming call, displaying the monitoring channel as the caller. Answering would acknowledge the alert and end the call, without establishing a voice connection. Alternatively, the app could read the alert locally using AVSpeechSynthesizer after answering. Are either of these approaches permitted, or is a network-based voice connection required?
1
0
88
4d
Mac Catalyst: outgoing CallKit call opens FaceTime and turns on the camera
We're bringing our CallKit-based VoIP app to the Mac with Mac Catalyst. Incoming calls work fine. For outgoing calls we request a CXStartCallAction (audio only, isVideo = false), the provider fulfills it and the call connects. But at the moment the call starts dialing, macOS launches FaceTime.app, which turns on the camera preview and shows its own call screen for our call ("no video"). When the call ends, FaceTime stays open and the camera stays on until FaceTime is quit manually. The system log shows callservicesd deciding to launch the in-call application for our call: callservicesd _shouldLaunchInCallApplicationForCall: 1 callservicesd Opening URL: <private> for call <private> CoreServicesUIAgent LAUNCH: ... com.apple.FaceTime starting stopped process.Reported as FB25284357 (macOS 27.0.1, Xcode 27.1). Is this expected for third-party CallKit providers on macOS? Is there a supported way to keep the call in our own app without dropping CallKit for outgoing calls?
2
0
130
4d
CallKit VoIP call on the receiver: the side (lock) button only locks the screen, no CXEndCallAction is delivered
Device and versions iPhone 15, iOS 27.0.1 App: Hush, a private messenger. Capacitor 8.5.2 iOS app; the UI is a web page in a WKWebView. Call signalling runs in the page; call audio runs in a native Swift Capacitor plugin on stasel/WebRTC 154.0.0, integrated with CallKit. Built on Codemagic with the latest Xcode, distributed through TestFlight. UIBackgroundModes: audio, voip. No PushKit yet: calls are placed and answered in the app's own screen while it is in the foreground. Setup RTCAudioSession manual audio (useManualAudio = true). isAudioEnabled is set only after ICE connects AND provider(_:didActivate:) is called (a 3-second fallback exists but never fired in these tests). We call RTCAudioSession.audioSessionDidActivate / audioSessionDidDeactivate from the provider delegate. Session: playAndRecord, mode voiceChat, options allowBluetoothHFP, no defaultToSpeaker. overrideOutputAudioPort is only called when the user picks Speaker (never in the failing tests). One CXProvider, created lazily, delegate on the main queue. Configuration: supportsVideo false (also tested true), maximumCallGroups 1, maximumCallsPerCallGroup 1, supportedHandleTypes [.generic], includesCallsInRecents false (also tested true). Outgoing: CXStartCallAction is requested via CXCallController when ICE first connects (not at dial time; the page plays its own ringback until then), handle generic, value "Hush". In perform(CXStartCallAction) we configure the audio session (no activation), reportCall(with:updated:), fulfil, then reportOutgoingCall(startedConnectingAt:) and (connectedAt:). Answering side: reportNewIncomingCall, then an immediate CXAnswerCallAction (the user already accepted in the app's screen). Mute: CXSetMutedCallAction. In-app End reported the call with reportCall(with:endedAt:reason: .remoteEnded) in all tests below (we are changing this to a CXEndCallAction request; not yet tested). Proximity: isProximityMonitoringEnabled = true from dialling while on the receiver. The screen does go dark at the ear. Also tested with our proximity monitoring off. The problem With a Hush call live, route Receiver, CallKit holding the call (the system call UI shows it), didActivate delivered exactly once, our audio running inside that activation, proximity on and the screen dark at the ear: pressing the side button only locks the screen. No CXEndCallAction arrives and the call continues. In the Phone app on the same iPhone the side button ends the call at the ear. Snapchat calls on this iPhone end on the side button while Snapchat's call screen is open. What works: End on the system lock-screen call UI delivers a CXEndCallAction and we end the call. Mute from the system UI arrives as CXSetMutedCallAction. So provider delegate delivery works. What we tried, in order (each tested on device, with a readout of the plugin's state after the call) First CallKit build: side button did nothing; lock-screen End worked. Readout: "CallKit off, its audio off (0x), fallback no, route speaker, proximity on". Cause: CXStartCallAction was refused (missing voip background mode) and the error swallowed. Fixed: voip added; on CXErrorCodeRequestTransactionError.unknownCallProvider we invalidate and recreate the provider and retry once. Next build: CallKit held the call, didActivate once, route Receiver. Side button still did nothing, no CXEndCallAction. Our route log showed two route changes caused by our own overrideOutputAudioPort(.none) on every activation and route change. Removed: no override unless Speaker is selected. Result: no change. Diagnostic switches, tested in combinations: our proximity monitoring on/off; supportsVideo false/true; includesCallsInRecents false/true; callee now reported with reportNewIncomingCall + CXAnswerCallAction (previously both sides used CXStartCallAction). Result: the side button ended the call EXACTLY ONCE: the first call after the provider was recreated (changing supportsVideo makes us invalidate() and create a new CXProvider). Every later call with the same configuration failed. Readout for the failures: "CallKit on, its audio on (1x), fallback no, route Receiver, proximity on", screen dark at the ear. Following thread 837211 (creating a provider implicitly pushes the audio session ID to callservicesd, which can keep a stale one; set the configuration before reporting each call): we now assign provider.configuration = a fresh CXProviderConfiguration at call start and again immediately before each CXStartCallAction request / reportNewIncomingCall. We also added a switch that recreates the CXProvider for every call. With the re-push alone: no end action. With a fresh provider every call: no end action either. Readout each time: "provider calls 1, config re-pushed yes, CallKit on, its audio on (1x), route Receiver, proximity on". The single success in step 3 has not been reproduced. Not tried on purpose: detecting the lock ourselves (protectedDataWillBecomeUnavailable arrives about 10 seconds late and needs a passcode; a 2017 thread says Home and Lock cannot be told apart); reporting the CallKit call at dial time instead of ICE connect; PushKit. Threads we relied on 819363 (April 2026): the lock button hangs up a CallKit call handled directly by the device (not through a headset), delivered as the provider's end action. 837211 (August 2026): stale audio session ID in callservicesd after provider creation; set the configuration before reporting a call. How we differ from apps where it works WKWebView: WebKit's GPU process holds a second AVAudioSession in our app's name. During the call the page captures no mic (the plugin owns it); before connect the page plays a Web Audio ringback (Ambient category). The CallKit call starts at ICE connect, not at dial time. In-app End reported as .remoteEnded rather than requested as a CXEndCallAction. The callee's immediate CXAnswerCallAction after reportNewIncomingCall. Questions Which conditions must hold for iOS to treat the side button as "end call" for a CallKit call, and which is our app failing? Is there a log subsystem or category (callservicesd, TelephonyUtilities) we can read in a sysdiagnose to see why the press is handled as lock? Could WebKit's GPU-process audio session in the same app confuse CallKit about which session carries the call? Would reporting the call at dial time, before any audio, change the outcome? Can ending the in-app call with reportCall(.remoteEnded) instead of a CXEndCallAction leave state in callservicesd that affects the NEXT call? That would fit "works once after a fresh provider, never again". We have no Mac. Is a sysdiagnose captured on the iPhone right after a failing press enough to diagnose this? If you need a project, we can provide the plugin's Swift source (one file) and the Capacitor app project that Codemagic builds.
1
0
117
4d
iOS 27 — Call Directory blocking overridden by Contacts or outgoing Recents?
We are developing GateCall, an iOS application that uses a Call Directory extension to maintain a private, user-selected list of blocked telephone numbers. We are seeking clarification about Call Directory blocking precedence on iOS 27.0.1, particularly when a number exists in Contacts or outgoing Recents. Test environment Physical iPhone 11 Pro Max running iOS 27.0.1. Call Directory extension enabled in Settings. Blocking entry: a valid Canadian telephone number normalized to E.164 and submitted as an Int64. CXCallDirectoryManager.reloadExtension returned successful completion. The application reported synchronization of one blocking entry. Actual extension-loaded entry count has not been independently verified. Observed sequence — November 1, 2026 The target number was initially present in iPhone Contacts. At 2:01 PM, the application reported successful Call Directory synchronization. At 2:06 PM, the iPhone placed an outgoing call to the target number. At 2:16 PM, an incoming cellular call from the same number caused the iPhone to ring. The call subsequently appeared in Phone → Recents as a missed call. We reviewed the September 2025 Apple DTS discussion: https://developer.apple.com/forums/thread/800415 That discussion describes a caller-information priority hierarchy and changes in iOS 26 affecting outgoing Recents. Questions Does iOS 27.0.1 intentionally prioritize Contacts and outgoing Recents over explicit blocking entries supplied by a third-party Call Directory extension? Is there a supported public API or configuration that allows a user-selected Call Directory block to take precedence over those sources? Is this priority behaviour documented or expected to change in future iOS releases? Is there a supported diagnostic mechanism to verify which blocking entries were actually loaded by iOS, beyond successful extension reload completion? We understand that a successful reload does not independently prove that a particular number was loaded or that Call Directory caused the observed behaviour. Our objective is to implement accurate, user-controlled blocking and avoid claiming protection that the operating system cannot guarantee. Any clarification from Apple DTS or developers with recent iOS 27 experience would be appreciated.
1
0
146
4d
Can macOS enforce fail-closed AUTH_EXEC authorization if the Endpoint Security client fails?
Hello Apple Developer Community, I am designing a security-isolated Swift compilation workflow on Apple silicon macOS. The goal is to execute a compiler only within an explicitly authorized environment, without granting access to unrelated project files or privileged operations. I am investigating the Endpoint Security framework, specifically AUTH_EXEC, for enforcing execution authorization. Security requirements: Allow only explicitly approved compiler and linker executables. Validate executable identity and command-line arguments, including child process execution. Prevent unauthorized execution even if the authorization component crashes, disconnects, or fails to respond before its deadline. Ensure that restrictions cannot be bypassed by launching a different executable or using unexpected child process arguments. My understanding: Endpoint Security provides execution authorization events and APIs for inspecting process arguments. However, Apple's documentation indicates that missing an authorization deadline may result in implicit authorization. This raises an important question about enforcing a strictly fail-closed policy. Questions: Is there a publicly supported macOS mechanism that guarantees unauthorized process execution remains blocked when an Endpoint Security client becomes unavailable or misses its authorization deadline? Can Endpoint Security be combined with App Sandbox, launch constraints, or another supported security mechanism to provide this guarantee? Is there a supported way to enforce restrictions on child process executable identity and command-line arguments before execution? If these guarantees are not available, what isolation architecture would Apple recommend for executing an untrusted or potentially misbehaving compiler? Environment: Apple silicon Mac macOS 26.x Apple Swift 6.3.x Xcode and macOS SDK Local, non-privileged Swift compilation This is an architectural design question. No Endpoint Security system extension or privileged helper has been deployed. I would appreciate guidance on publicly supported APIs, security guarantees, and any relevant Apple documentation. Thank you!
0
0
233
4d
additionalInfoFields on non-eventTickets
We noticed that in iOS 27 the additionalInfoFields are displayed in all pass types (coupon, storeCard etc.) despite Apple's documentation stating that they're only supported for poster event tickets ("Only poster event ticket passes support the Additional Info section."). Can someone from Apple confirm if additional info fields will be supported on all pass types going forward or if this is a bug and we should not rely on that feature. We'd love to use them but don't want to risk that they're disappearing with one of the next iOS updates. Forums don't allow to post in Wallet which is why I chose Apple Pay.
0
0
42
4d
addSubview slows down with sibling count, process-wide, once a MapKit location view has been in a window
Filed as FB25405148 with a small sample project. Posting here in case anyone else has hit this or knows a better workaround. Once a MapKit location view has been in a window, addSubview: anywhere in the process takes time proportional to the number of subviews the parent already has. The parent doesn't have to belong to the map. On iPhone Air with iOS 27.2, in a clean app, adding 8,000 plain UIViews to a plain UIView took 85 ms without a location view and 4,992 ms with one. You won't see this with a few hundred views. Up to about 1,000 siblings, the whole batch costs less than 100 ms extra. Map apps can hit it because annotation views are siblings under one container. On the same phone, adding 5,000 annotation views in batches took the longest frame from 25 ms to 208 ms. It happens with the default location view, with an MKUserLocationView returned from mapView(_:viewFor:), and with a bare MKUserLocationView added to a window by hand. A plain MKAnnotationView doesn't cause it. From LLDB on the simulator, it looks like MapKit's first call to _accessibilitySetInterfaceStyleIntent: installs _UIAccessibilityInterfaceStyleVisitor, and that's what slows later adds. Returning a plain MKAnnotationView for MKUserLocation avoids it, but gives up the system view. Only iOS 27.2 has been tested so far. Has anyone seen this on other versions, or found a way to keep the system location view without the cost?
0
0
44
4d
WatchOS 27 throttles BLE discoveries
Hi! We have an app that highly depends on CoreBluetooth including scanning for peripherals with an advertised serviceUUID. Our app sets the CBCentralManagerScanOptionAllowDuplicatesKey flag to true while scanning. Receiving continuous discovery events about nearby devices is key to measure the RSSI before connecting. Updating some of our test devices to watchOS 27 we noticed that our app is broken. To analyze further we created a simple app to compare behavior between watchOS 26 and 27, and the difference is clear. On the 27 device it behaves like the flag is ignored and we only receive a couple of callbacks to centralManager(_:didDiscover:advertisementData:rssi:) then it stops. We could not find any documentation declaring this as a new restriction or something regarding that has changed. Is this a bug, or is there a way to get the old behavior on the new OS? The example app used for testing is available here: https://github.com/levente-gulyas-skidata/WatchBLEExperiments (Change the serviceUUID for testing if needed) Thank you, Levi
1
4
204
4d
watchOS CoreBluetooth: BLE link stability, AutoReconnect and reduced reconnection range
I have a watchOS app communicating with a BLE peripheral during an active HKWorkoutSession. The workout provides sufficient runtime: once connected, the Watch can receive a notifying GATT characteristic approximately once per minute for hours, including while the display is off. In normal conditions the connection is very stable. The difficult case is outdoor use with marginal RF conditions. The peripheral and application protocol otherwise work reliably, but outdoors there are fewer reflected RF paths and normal body movement can intermittently obstruct the Watch-to-peripheral path. In those situations the link occasionally terminates with CBError.connectionTimeout. Reconnection is particularly important because this peripheral advertises for reconnection only approximately once per minute. We also know approximately which second of each minute the peripheral becomes active, so missing a single advertising opportunity can cause a relatively long data gap. I’m trying to better understand the supported CoreBluetooth/watchOS behavior in this situation. Maintaining a marginal existing connection Once the BLE connection is established, are there any public CoreBluetooth mechanisms or recommended practices for making that connection more robust against CBError.connectionTimeout? In particular, can application-level GATT activity have any influence on connection scheduling or link robustness, or is this entirely handled by the Bluetooth stack below CoreBluetooth? CBConnectPeripheralOptionEnableAutoReconnect with sparse advertising When CBConnectPeripheralOptionEnableAutoReconnect is enabled and the connection is lost, how does watchOS handle a peripheral that advertises only very infrequently? Does CoreBluetooth simply keep the reconnect pending and wait for subsequent advertisements indefinitely, subject to system policy? Known peripheral activity timing If the app knows approximately when the peripheral becomes active and advertises each minute, is there any supported way to make use of that timing during reconnection? Or should the app simply leave AutoReconnect pending and let CoreBluetooth handle reception? WWDC22 reduced reconnection range WWDC22 session 10135 says: “If your device is on the edge of Bluetooth range and repeatedly disconnects while in Background BLE connection, the reconnection range will be reduced. This means only devices close to the Apple Watch will reconnect.” The session also says these limits are counted over a rolling 24-hour window and are reset when the user interacts with the app. I would particularly appreciate clarification of how this works in practice: What conditions cause a disconnect to count toward this policy? Does this policy apply while an app has an active HKWorkoutSession and continues executing in the background? Is the state maintained per peripheral, per app, or more globally? What exactly constitutes the user interaction that resets it? Does bringing an already-running workout app back to the foreground reset it, or does the app need to be relaunched? Is there any public API or diagnostic indication that reduced reconnection range is currently active? Is there any supported way to explicitly clear/reset that state? Connection parameters Does watchOS expose any supported mechanism for a CoreBluetooth central to influence parameters relevant to connection robustness, such as connection interval, supervision timeout, PHY, transmit power, or similar link parameters? Diagnosing CBError.connectionTimeout When CoreBluetooth reports CBError.connectionTimeout, is there any supported diagnostic method to determine whether the Watch stopped receiving the peripheral, the peripheral stopped receiving the Watch, or whether this should simply be treated as a link-layer timeout without attribution to either side? For context, this is not primarily a background-runtime problem. The active workout keeps the app running and the normal persistent BLE connection can operate flawlessly for many hours. I’m specifically trying to understand the best supported strategy for preserving and recovering the BLE link when RF conditions temporarily become marginal, especially with a peripheral that advertises very sparsely after a disconnect. DTS asked me to post this question here for review.
5
2
519
4d
Supported API for native Thunderbolt host-to-host communication?
I'm looking into direct communication between a Mac and a Linux machine connected over Thunderbolt. Thunderbolt networking works fine, but I'd like to explore whether it's possible to transfer data using native Thunderbolt DMA, without going through the TCP/IP stack. I've looked through the IOKit and DriverKit documentation, but most of what I've found relates to drivers for PCIe devices connected over Thunderbolt rather than communication between two hosts. A couple of questions: Is there a supported API for discovering Thunderbolt XDomain services and establishing native DMA-backed send/receive paths between hosts? Can this be done from userspace or DriverKit, or would it require a kernel extension? Ideally, I'd also like to keep the existing Thunderbolt networking interface working alongside it. Any pointers to relevant APIs or documentation would be appreciated. Thanks!
3
0
304
4d
iOS 27: system-wide registered fonts disappear from Settings > General > Fonts after every reboot
Hello, We ship a font provider app that installs fonts system-wide on iOS, delivering the font files through On-Demand Resources. Since iOS 27 shipped, customers have been reporting that their installed fonts vanish from the system font list after every restart. I would like to know whether the restore path for system-wide font registrations changed in iOS 27, and what a font provider app is expected to do after a device reboot. Environment iOS 27.0 and 27.0.0 only. We have no reports on iOS 26 or earlier. iPhone 18 Pro and iPhone 18 Pro Max Fonts delivered through On-Demand Resources and registered for system-wide installation using CoreText Steps to reproduce Activate a font in the app. It appears in Settings > General > Fonts. Reboot the device. Without launching the app, open Settings > General > Fonts. The font is gone. The app still shows the font as active, because it keeps its own activation state. Deactivate and reactivate the font in the app. It comes back. Reboot again. It disappears again. This happens on every reboot. It also happens with a single font activated, and it persists after updating or reinstalling the app. Because the font is missing from the system font list, it is also missing in other apps that use system fonts. What we have ruled out Not low storage. These are new devices with plenty of free space. The documented purge trigger for On-Demand Resources is low storage, which does not explain a result this consistent. Not a crash. Our crash data for the affected app version shows no elevated crash rate on iOS 27 compared to iOS 18. Not specific to one font or one app version. Questions Did the restore path for system-wide font registrations change in iOS 27? Are registrations that reference files inside On-Demand Resources still restored at boot? If a font provider app now has to re-register after a reboot, when and how should it do that? There is no natural launch point, since someone may use the font in another app without opening ours first. Is there a supported way for the app to detect that a font it installed is no longer present in the system font list, so it can repair the registration quietly? Context We deliver several thousand fonts this way, and Apple increased our On-Demand Resources limit for that reason (Case-ID 17273913, December 2025). On-Demand Resources is deprecated as of iOS 27. We have separately confirmed that fonts delivered through Background Assets cannot be registered system-wide: registration fails with CTFontManagerErrorDomain code 306, both from the Background Assets container and after copying the files into the app sandbox, because CoreText requires the file to sit inside the app bundle or On-Demand Resources. We have a separate question open about that migration path, so this post is only about the reboot behavior on iOS 27. Happy to provide a sysdiagnose from an affected device and a sample project. Thank you.
3
0
676
4d
`sysextd` rejects new `NEFilterDataProvider` activation with "no policy" on macOS 26 — despite valid Developer ID + notarization
I'm building a macOS network monitor using NEFilterDataProvider as a system extension, distributed with Developer ID signing. On macOS 26.3 (Tahoe), sysextd consistently rejects the activation request with "no policy, cannot allow apps outside /Applications" — despite the app being in /Applications and passing every verification check. I'm aware of the known Xcode NE signing bug (r. 108838909) and have followed the manual signing process from Exporting a Developer ID Network Extension. I've also tried both xcodebuild build and xcodebuild archive workflows — identical failure. Environment macOS 26.3 (25D125), SIP enabled Xcode 26.3 (17C529) Hardware Apple M2 Pro Certificate Developer ID Application (issued Jan 30, 2026 — 27 days old) MDM/Profiles None installed Signing & Verification (all pass) $ spctl -a -vv /Applications/Chakshu.app /Applications/Chakshu.app: accepted source=Notarized Developer ID origin=Developer ID Application: ROBIN SHARMA (R65679C4F3) $ codesign --verify --deep --strict -vv /Applications/Chakshu.app /Applications/Chakshu.app: valid on disk /Applications/Chakshu.app: satisfies its Designated Requirement $ xcrun stapler validate /Applications/Chakshu.app The validate action worked! App signing: Authority=Developer ID Application: ROBIN SHARMA (R65679C4F3) Authority=Developer ID Certification Authority Authority=Apple Root CA TeamIdentifier=R65679C4F3 Runtime Version=26.2.0 Notarization Ticket=stapled App entitlements: com.apple.application-identifier = R65679C4F3.dev.indrasvat.chakshu com.apple.developer.team-identifier = R65679C4F3 com.apple.developer.system-extension.install = true com.apple.developer.networking.networkextension = [content-filter-provider-systemextension] keychain-access-groups = [R65679C4F3.*] Extension signing: Same Developer ID authority, same team, same timestamp. Extension entitlements match (minus system-extension.install). Developer ID provisioning profiles are embedded in both app and extension. What sysextd logs Captured Feb 26, 2026 from log stream --predicate 'process == "sysextd"': sysextd [com.apple.sx:XPC] client activation request for dev.indrasvat.chakshu.filter sysextd attempting to realize extension with identifier dev.indrasvat.chakshu.filter sysextd (Security) SecKeyVerifySignature ← pass (×2) sysextd (Security) SecTrustEvaluateIfNecessary ← pass (×2) sysextd [com.apple.xpc:connection] activating connection: name=com.apple.CodeSigningHelper sysextd [com.apple.xpc:connection] invalidated after the last release sysextd no policy, cannot allow apps outside /Applications sysextd [com.apple.sx:XPC] client connection invalidated Signature and trust evaluation pass. CodeSigningHelper completes. Then the policy check fails. The app receives OSSystemExtensionError code 4 (extensionNotFound). What I've tried and ruled out Build process: Approach Result xcodebuild build -configuration Release + manual re-sign Same failure xcodebuild archive + export from archive + manual re-sign (per thread/737894) Same failure Minimal hand-crafted Xcode project (no xcodegen, trivial code) Same failure Both workflows follow Quinn's process exactly: build with Apple Development → copy app → embed Developer ID provisioning profiles → re-sign inside-out (extension first, then app) with -systemextension suffix entitlements → notarize → staple → install to /Applications. System-level checks: Rebooting — no change Killing sysextd — no change Removing com.apple.quarantine xattr — no change chown root:wheel on app bundle — no change lsregister -r (reset Launch Services) — no change Waiting 27 days for certificate propagation — no change Reinstalling via Finder drag-to-Applications — no change No MDM or configuration profiles installed /Library/SystemExtensions/db.plist shows extensionPolicies: [] (empty) Key observation Pre-existing network extensions activated before macOS 26 work fine on this machine. For example, Tailscale's NEPacketTunnelProvider shows state: activated_enabled in the system extensions database — it was activated on a prior macOS version and is still running. Only new system extension activations fail. I've seen similar Tahoe-specific reports from LuLu (same NEFilterDataProvider type, Developer ID distribution): LuLu #825 LuLu #831 Questions Is this a known regression in macOS 26's sysextd policy evaluation for new Developer ID system extension activations? sysextd's policy check fails after all signature and trust evaluation succeeds. Is there a separate trust/policy path that sysextd consults beyond what spctl, codesign, and CodeSigningHelper verify? Is there anything else I should be checking? I have a sysdiagnose captured immediately after the failure, a minimal reproducer project, and full raw sysextd logs available on request.
8
0
811
4d
Is CMSensorRecorder accelerometer recording and retrieval supported while Apple Watch is charging?
On an Apple Watch Series 4-5, our app receives no recorded accelerometer samples during charging. Repeating the query for the same interval after disconnecting the charger also returns nil. Recording without the charger produces samples. An HKWorkoutSession remains running during the unsuccessful test, and live motion collection works while charging. Is this expected behavior or a known limitation? If supported, what conditions must be met?
1
0
58
4d
Maximum size of an Apple-hosted Managed Background Assets pack
I'm developing an iOS app that uses Apple-hosted Managed Background Assets to deliver regional offline mapping datasets. According to Apple's documentation, the limits are 200 GB of hosted data and 200 asset packs per app. However, I couldn't find a documented maximum size for an individual managed asset pack. Our use case requires automatic, on-demand downloads of geographic datasets, typically between 50 MB and 500 MB, depending on the region. I have a few questions: Is there a maximum compressed or uncompressed size for an individual Apple-hosted Managed Background Assets pack? Are on-demand downloads of 100–500 MB packs supported over Wi-Fi and cellular networks? Are there any additional restrictions on large packs, such as download frequency, storage requirements or background delivery policies? Can these packs be downloaded automatically when a user enters a new geographic region, without requiring the user to select or manually download the pack? I'm specifically asking about Managed Background Assets, not the legacy On-Demand Resources system. Any clarification from an Apple engineer would be greatly appreciated. Thank you!
0
0
42
4d
StoreKit 2 returns primary-language product metadata in sandbox despite an approved localization for the storefront's language
Device: iPhone 11, iOS 26.5 Build: development build, built with Xcode 26.6, iOS SDK 26.5, using the StoreKit sandbox Problem For a non-consumable in-app purchase, Product.displayName and Product.description (StoreKit 2, fetched with Product.products(for:)) always return the English (U.S.) localization, which is the product's primary language, instead of the approved Portuguese (Brazil) one. The App Store purchase sheet shows the English (U.S.) display name too. Setup The product is Approved. Its English (U.S.), Portuguese (Brazil) and Indonesian localizations are all Approved in App Store Connect. The app's App Store localizations include Portuguese (Brazil). The iPhone's preferred languages are Português (Brasil) first, then English (U.S.) and Svenska. The app's language in Settings → Apps → [app] → Language is Português (Brasil). The app's Info.plist declares pt-BR in CFBundleLocalizations. The sandbox tester was newly created in App Store Connect with Brazil as its country or region. Prices come back in BRL, so the Brazil storefront is in use. Questions TN2413 says the language follows the test account's store, and an App Store Commerce Engineer said in thread 756918 that a sandbox account set to the desired country should return that country's language. Our setup matches both, yet we get the primary language. Is localized product metadata expected to be served in the sandbox environment? If so, what else determines the language StoreKit returns, and why would it fall back to the primary language when an approved localization exists for the storefront's default language? How can we verify product localizations before releasing to production?
1
0
89
4d
有运算密集型的任务需要运行较长时间,用户在前台触发后不希望一直在前台等待任务完成,希望在后台持续运行并且有较高的CPU优先级,在前台轻负载情况下让这个后台任务性能保持和前台时接近的性能和时延,请问iOS上有这样的方案吗?
需要满足 (1)后台保活,在后台时任务仍然能一直运行直到任务完成 (2)任务在后台运行时,且前台负载较低时让任务分配尽量多的CPU资源,保持任务的性能和前台时接近 (3)需要使用GPU和NPU,需要跑AI模型,如果可以用GPU就更好,(GPU不跑也行) (4)方案合法,能上架苹果APP Store. 可以通过蓝牙连接来进行后台保活,这个任务本身就需要通过蓝牙连接一个外设,但是这种保活方式任务在后台时CPU权限较低,性能时延劣化很严重。 任务本身是类似做图片/视频处理的任务,需要跑几秒到几分钟的量级,最好可以尽量多地跑久一些。 我们试过了,后台保活后性能都大幅下降,降了6~10倍,体验较差 有没有做过类似的后台任务的,最终做到前后台性能接近的(前台空负载时)?
0
0
65
4d
Can bringing two iPhones together automatically display a custom profile card?
I’m evaluating an offline profile-card app for iPhone users in the United States. After installation and initial user consent, bringing two iPhones together should automatically display each person’s custom card, containing favorite musicians and their willingness to socialize. Requirements: Neither person needs to open the app before the interaction. The exchange works without internet. No QR codes or external NFC tags are involved. The card appears automatically, rather than requiring a notification tap to open it. Is this supported by any public iOS API or available entitlement? Could NFC & SE Platform support this non-payment use case? If unsupported, which requirement is the blocker? Please distinguish background/suspended apps from apps that the user has force-quit. Thank you.
0
0
33
4d
Supported read/write handoff of a sandbox-container PNG to Preview using NSWorkspace
Hello, I am preparing an existing macOS screenshot utility for distribution through the Mac App Store. The app stores captured PNG files under its temporary directory: FileManager.default.temporaryDirectory .appendingPathComponent("ShelfDragPoC/Captures", isDirectory: true) A context-menu "Edit" action passes the original PNG URL to Preview using NSWorkspace. The app does not create an editing copy. Relevant code: import AppKit @MainActor func openInPreview(_ url: URL) { guard let previewURL = NSWorkspace.shared.urlForApplication( withBundleIdentifier: "com.apple.Preview" ) else { return } let configuration = NSWorkspace.OpenConfiguration() configuration.activates = true NSWorkspace.shared.open( [url], withApplicationAt: previewURL, configuration: configuration ) { _, _ in } } The app monitors the original PNG URL for file changes and refreshes its thumbnail when changes are detected. Observed behavior: In the existing non-sandboxed app, rotating an image in Preview updates the original PNG and the thumbnail without requiring Command-S. In the sandboxed validation app, Preview opens the image, but editing results in a separate copy. When closing the edited document, Preview displays a message indicating that the original document will not be changed. The original PNG and the app's thumbnail are not updated. The Preview launch code and file watcher are unchanged between the non-sandboxed and sandboxed versions. The sandboxed app has these entitlements: com.apple.security.app-sandbox com.apple.security.files.user-selected.read-write com.apple.security.files.bookmarks.app-scope The app-scoped bookmark is used for a separate Desktop export feature. The PNG opened in Preview remains in the app's sandbox container. My question: Is there a supported public API that allows a sandboxed Mac App Store app to open its own container-resident PNG in Preview with the permissions required for in-place editing and normal automatic saving? Ideally, the user would only need to select "Edit" once, without an additional file-selection dialog or an explicit Save command. We want to preserve the original PNG URL, keep App Sandbox enabled, and avoid automatically exporting temporary images to the Desktop. If this workflow is not supported, what is Apple's recommended approach? Thank you.
8
0
370
4d
System Integrity Protection and the `com.apple.rootless.install.heritable` entitlement
For certain development tasks, I need to disable System Integrity Protection (SIP) (csrutil disable). After I am done doing my tests, I reenable SIP. Additionally, SIP has a number of unsupported configurations. For example, csrutil enable --without debug enables all system integrity protections except debugging. My question concerns the com.apple.rootless.install.heritable entitltement, which, from my understanding, allows any app to gain root access without authorization of the user. I would like to know whether any app give itself this entitlement without my authorization when (1) SIP is fully disabled (csrutil disable) and when (2) SIP is partially disabled in the aforementioned specific unsupported configuration (csrutil enable --without debug).
4
0
102
4d
PushKit + CallKit for opt-in monitoring alerts?
Hi, Is it permitted to use PushKit and CallKit for monitoring alerts that users explicitly enable? An API event would trigger an incoming call, displaying the monitoring channel as the caller. Answering would acknowledge the alert and end the call, without establishing a voice connection. Alternatively, the app could read the alert locally using AVSpeechSynthesizer after answering. Are either of these approaches permitted, or is a network-based voice connection required?
Replies
1
Boosts
0
Views
88
Activity
4d
Mac Catalyst: outgoing CallKit call opens FaceTime and turns on the camera
We're bringing our CallKit-based VoIP app to the Mac with Mac Catalyst. Incoming calls work fine. For outgoing calls we request a CXStartCallAction (audio only, isVideo = false), the provider fulfills it and the call connects. But at the moment the call starts dialing, macOS launches FaceTime.app, which turns on the camera preview and shows its own call screen for our call ("no video"). When the call ends, FaceTime stays open and the camera stays on until FaceTime is quit manually. The system log shows callservicesd deciding to launch the in-call application for our call: callservicesd _shouldLaunchInCallApplicationForCall: 1 callservicesd Opening URL: <private> for call <private> CoreServicesUIAgent LAUNCH: ... com.apple.FaceTime starting stopped process.Reported as FB25284357 (macOS 27.0.1, Xcode 27.1). Is this expected for third-party CallKit providers on macOS? Is there a supported way to keep the call in our own app without dropping CallKit for outgoing calls?
Replies
2
Boosts
0
Views
130
Activity
4d
CallKit VoIP call on the receiver: the side (lock) button only locks the screen, no CXEndCallAction is delivered
Device and versions iPhone 15, iOS 27.0.1 App: Hush, a private messenger. Capacitor 8.5.2 iOS app; the UI is a web page in a WKWebView. Call signalling runs in the page; call audio runs in a native Swift Capacitor plugin on stasel/WebRTC 154.0.0, integrated with CallKit. Built on Codemagic with the latest Xcode, distributed through TestFlight. UIBackgroundModes: audio, voip. No PushKit yet: calls are placed and answered in the app's own screen while it is in the foreground. Setup RTCAudioSession manual audio (useManualAudio = true). isAudioEnabled is set only after ICE connects AND provider(_:didActivate:) is called (a 3-second fallback exists but never fired in these tests). We call RTCAudioSession.audioSessionDidActivate / audioSessionDidDeactivate from the provider delegate. Session: playAndRecord, mode voiceChat, options allowBluetoothHFP, no defaultToSpeaker. overrideOutputAudioPort is only called when the user picks Speaker (never in the failing tests). One CXProvider, created lazily, delegate on the main queue. Configuration: supportsVideo false (also tested true), maximumCallGroups 1, maximumCallsPerCallGroup 1, supportedHandleTypes [.generic], includesCallsInRecents false (also tested true). Outgoing: CXStartCallAction is requested via CXCallController when ICE first connects (not at dial time; the page plays its own ringback until then), handle generic, value "Hush". In perform(CXStartCallAction) we configure the audio session (no activation), reportCall(with:updated:), fulfil, then reportOutgoingCall(startedConnectingAt:) and (connectedAt:). Answering side: reportNewIncomingCall, then an immediate CXAnswerCallAction (the user already accepted in the app's screen). Mute: CXSetMutedCallAction. In-app End reported the call with reportCall(with:endedAt:reason: .remoteEnded) in all tests below (we are changing this to a CXEndCallAction request; not yet tested). Proximity: isProximityMonitoringEnabled = true from dialling while on the receiver. The screen does go dark at the ear. Also tested with our proximity monitoring off. The problem With a Hush call live, route Receiver, CallKit holding the call (the system call UI shows it), didActivate delivered exactly once, our audio running inside that activation, proximity on and the screen dark at the ear: pressing the side button only locks the screen. No CXEndCallAction arrives and the call continues. In the Phone app on the same iPhone the side button ends the call at the ear. Snapchat calls on this iPhone end on the side button while Snapchat's call screen is open. What works: End on the system lock-screen call UI delivers a CXEndCallAction and we end the call. Mute from the system UI arrives as CXSetMutedCallAction. So provider delegate delivery works. What we tried, in order (each tested on device, with a readout of the plugin's state after the call) First CallKit build: side button did nothing; lock-screen End worked. Readout: "CallKit off, its audio off (0x), fallback no, route speaker, proximity on". Cause: CXStartCallAction was refused (missing voip background mode) and the error swallowed. Fixed: voip added; on CXErrorCodeRequestTransactionError.unknownCallProvider we invalidate and recreate the provider and retry once. Next build: CallKit held the call, didActivate once, route Receiver. Side button still did nothing, no CXEndCallAction. Our route log showed two route changes caused by our own overrideOutputAudioPort(.none) on every activation and route change. Removed: no override unless Speaker is selected. Result: no change. Diagnostic switches, tested in combinations: our proximity monitoring on/off; supportsVideo false/true; includesCallsInRecents false/true; callee now reported with reportNewIncomingCall + CXAnswerCallAction (previously both sides used CXStartCallAction). Result: the side button ended the call EXACTLY ONCE: the first call after the provider was recreated (changing supportsVideo makes us invalidate() and create a new CXProvider). Every later call with the same configuration failed. Readout for the failures: "CallKit on, its audio on (1x), fallback no, route Receiver, proximity on", screen dark at the ear. Following thread 837211 (creating a provider implicitly pushes the audio session ID to callservicesd, which can keep a stale one; set the configuration before reporting each call): we now assign provider.configuration = a fresh CXProviderConfiguration at call start and again immediately before each CXStartCallAction request / reportNewIncomingCall. We also added a switch that recreates the CXProvider for every call. With the re-push alone: no end action. With a fresh provider every call: no end action either. Readout each time: "provider calls 1, config re-pushed yes, CallKit on, its audio on (1x), route Receiver, proximity on". The single success in step 3 has not been reproduced. Not tried on purpose: detecting the lock ourselves (protectedDataWillBecomeUnavailable arrives about 10 seconds late and needs a passcode; a 2017 thread says Home and Lock cannot be told apart); reporting the CallKit call at dial time instead of ICE connect; PushKit. Threads we relied on 819363 (April 2026): the lock button hangs up a CallKit call handled directly by the device (not through a headset), delivered as the provider's end action. 837211 (August 2026): stale audio session ID in callservicesd after provider creation; set the configuration before reporting a call. How we differ from apps where it works WKWebView: WebKit's GPU process holds a second AVAudioSession in our app's name. During the call the page captures no mic (the plugin owns it); before connect the page plays a Web Audio ringback (Ambient category). The CallKit call starts at ICE connect, not at dial time. In-app End reported as .remoteEnded rather than requested as a CXEndCallAction. The callee's immediate CXAnswerCallAction after reportNewIncomingCall. Questions Which conditions must hold for iOS to treat the side button as "end call" for a CallKit call, and which is our app failing? Is there a log subsystem or category (callservicesd, TelephonyUtilities) we can read in a sysdiagnose to see why the press is handled as lock? Could WebKit's GPU-process audio session in the same app confuse CallKit about which session carries the call? Would reporting the call at dial time, before any audio, change the outcome? Can ending the in-app call with reportCall(.remoteEnded) instead of a CXEndCallAction leave state in callservicesd that affects the NEXT call? That would fit "works once after a fresh provider, never again". We have no Mac. Is a sysdiagnose captured on the iPhone right after a failing press enough to diagnose this? If you need a project, we can provide the plugin's Swift source (one file) and the Capacitor app project that Codemagic builds.
Replies
1
Boosts
0
Views
117
Activity
4d
iOS 27 — Call Directory blocking overridden by Contacts or outgoing Recents?
We are developing GateCall, an iOS application that uses a Call Directory extension to maintain a private, user-selected list of blocked telephone numbers. We are seeking clarification about Call Directory blocking precedence on iOS 27.0.1, particularly when a number exists in Contacts or outgoing Recents. Test environment Physical iPhone 11 Pro Max running iOS 27.0.1. Call Directory extension enabled in Settings. Blocking entry: a valid Canadian telephone number normalized to E.164 and submitted as an Int64. CXCallDirectoryManager.reloadExtension returned successful completion. The application reported synchronization of one blocking entry. Actual extension-loaded entry count has not been independently verified. Observed sequence — November 1, 2026 The target number was initially present in iPhone Contacts. At 2:01 PM, the application reported successful Call Directory synchronization. At 2:06 PM, the iPhone placed an outgoing call to the target number. At 2:16 PM, an incoming cellular call from the same number caused the iPhone to ring. The call subsequently appeared in Phone → Recents as a missed call. We reviewed the September 2025 Apple DTS discussion: https://developer.apple.com/forums/thread/800415 That discussion describes a caller-information priority hierarchy and changes in iOS 26 affecting outgoing Recents. Questions Does iOS 27.0.1 intentionally prioritize Contacts and outgoing Recents over explicit blocking entries supplied by a third-party Call Directory extension? Is there a supported public API or configuration that allows a user-selected Call Directory block to take precedence over those sources? Is this priority behaviour documented or expected to change in future iOS releases? Is there a supported diagnostic mechanism to verify which blocking entries were actually loaded by iOS, beyond successful extension reload completion? We understand that a successful reload does not independently prove that a particular number was loaded or that Call Directory caused the observed behaviour. Our objective is to implement accurate, user-controlled blocking and avoid claiming protection that the operating system cannot guarantee. Any clarification from Apple DTS or developers with recent iOS 27 experience would be appreciated.
Replies
1
Boosts
0
Views
146
Activity
4d
Can macOS enforce fail-closed AUTH_EXEC authorization if the Endpoint Security client fails?
Hello Apple Developer Community, I am designing a security-isolated Swift compilation workflow on Apple silicon macOS. The goal is to execute a compiler only within an explicitly authorized environment, without granting access to unrelated project files or privileged operations. I am investigating the Endpoint Security framework, specifically AUTH_EXEC, for enforcing execution authorization. Security requirements: Allow only explicitly approved compiler and linker executables. Validate executable identity and command-line arguments, including child process execution. Prevent unauthorized execution even if the authorization component crashes, disconnects, or fails to respond before its deadline. Ensure that restrictions cannot be bypassed by launching a different executable or using unexpected child process arguments. My understanding: Endpoint Security provides execution authorization events and APIs for inspecting process arguments. However, Apple's documentation indicates that missing an authorization deadline may result in implicit authorization. This raises an important question about enforcing a strictly fail-closed policy. Questions: Is there a publicly supported macOS mechanism that guarantees unauthorized process execution remains blocked when an Endpoint Security client becomes unavailable or misses its authorization deadline? Can Endpoint Security be combined with App Sandbox, launch constraints, or another supported security mechanism to provide this guarantee? Is there a supported way to enforce restrictions on child process executable identity and command-line arguments before execution? If these guarantees are not available, what isolation architecture would Apple recommend for executing an untrusted or potentially misbehaving compiler? Environment: Apple silicon Mac macOS 26.x Apple Swift 6.3.x Xcode and macOS SDK Local, non-privileged Swift compilation This is an architectural design question. No Endpoint Security system extension or privileged helper has been deployed. I would appreciate guidance on publicly supported APIs, security guarantees, and any relevant Apple documentation. Thank you!
Replies
0
Boosts
0
Views
233
Activity
4d
additionalInfoFields on non-eventTickets
We noticed that in iOS 27 the additionalInfoFields are displayed in all pass types (coupon, storeCard etc.) despite Apple's documentation stating that they're only supported for poster event tickets ("Only poster event ticket passes support the Additional Info section."). Can someone from Apple confirm if additional info fields will be supported on all pass types going forward or if this is a bug and we should not rely on that feature. We'd love to use them but don't want to risk that they're disappearing with one of the next iOS updates. Forums don't allow to post in Wallet which is why I chose Apple Pay.
Replies
0
Boosts
0
Views
42
Activity
4d
addSubview slows down with sibling count, process-wide, once a MapKit location view has been in a window
Filed as FB25405148 with a small sample project. Posting here in case anyone else has hit this or knows a better workaround. Once a MapKit location view has been in a window, addSubview: anywhere in the process takes time proportional to the number of subviews the parent already has. The parent doesn't have to belong to the map. On iPhone Air with iOS 27.2, in a clean app, adding 8,000 plain UIViews to a plain UIView took 85 ms without a location view and 4,992 ms with one. You won't see this with a few hundred views. Up to about 1,000 siblings, the whole batch costs less than 100 ms extra. Map apps can hit it because annotation views are siblings under one container. On the same phone, adding 5,000 annotation views in batches took the longest frame from 25 ms to 208 ms. It happens with the default location view, with an MKUserLocationView returned from mapView(_:viewFor:), and with a bare MKUserLocationView added to a window by hand. A plain MKAnnotationView doesn't cause it. From LLDB on the simulator, it looks like MapKit's first call to _accessibilitySetInterfaceStyleIntent: installs _UIAccessibilityInterfaceStyleVisitor, and that's what slows later adds. Returning a plain MKAnnotationView for MKUserLocation avoids it, but gives up the system view. Only iOS 27.2 has been tested so far. Has anyone seen this on other versions, or found a way to keep the system location view without the cost?
Replies
0
Boosts
0
Views
44
Activity
4d
WatchOS 27 throttles BLE discoveries
Hi! We have an app that highly depends on CoreBluetooth including scanning for peripherals with an advertised serviceUUID. Our app sets the CBCentralManagerScanOptionAllowDuplicatesKey flag to true while scanning. Receiving continuous discovery events about nearby devices is key to measure the RSSI before connecting. Updating some of our test devices to watchOS 27 we noticed that our app is broken. To analyze further we created a simple app to compare behavior between watchOS 26 and 27, and the difference is clear. On the 27 device it behaves like the flag is ignored and we only receive a couple of callbacks to centralManager(_:didDiscover:advertisementData:rssi:) then it stops. We could not find any documentation declaring this as a new restriction or something regarding that has changed. Is this a bug, or is there a way to get the old behavior on the new OS? The example app used for testing is available here: https://github.com/levente-gulyas-skidata/WatchBLEExperiments (Change the serviceUUID for testing if needed) Thank you, Levi
Replies
1
Boosts
4
Views
204
Activity
4d
watchOS CoreBluetooth: BLE link stability, AutoReconnect and reduced reconnection range
I have a watchOS app communicating with a BLE peripheral during an active HKWorkoutSession. The workout provides sufficient runtime: once connected, the Watch can receive a notifying GATT characteristic approximately once per minute for hours, including while the display is off. In normal conditions the connection is very stable. The difficult case is outdoor use with marginal RF conditions. The peripheral and application protocol otherwise work reliably, but outdoors there are fewer reflected RF paths and normal body movement can intermittently obstruct the Watch-to-peripheral path. In those situations the link occasionally terminates with CBError.connectionTimeout. Reconnection is particularly important because this peripheral advertises for reconnection only approximately once per minute. We also know approximately which second of each minute the peripheral becomes active, so missing a single advertising opportunity can cause a relatively long data gap. I’m trying to better understand the supported CoreBluetooth/watchOS behavior in this situation. Maintaining a marginal existing connection Once the BLE connection is established, are there any public CoreBluetooth mechanisms or recommended practices for making that connection more robust against CBError.connectionTimeout? In particular, can application-level GATT activity have any influence on connection scheduling or link robustness, or is this entirely handled by the Bluetooth stack below CoreBluetooth? CBConnectPeripheralOptionEnableAutoReconnect with sparse advertising When CBConnectPeripheralOptionEnableAutoReconnect is enabled and the connection is lost, how does watchOS handle a peripheral that advertises only very infrequently? Does CoreBluetooth simply keep the reconnect pending and wait for subsequent advertisements indefinitely, subject to system policy? Known peripheral activity timing If the app knows approximately when the peripheral becomes active and advertises each minute, is there any supported way to make use of that timing during reconnection? Or should the app simply leave AutoReconnect pending and let CoreBluetooth handle reception? WWDC22 reduced reconnection range WWDC22 session 10135 says: “If your device is on the edge of Bluetooth range and repeatedly disconnects while in Background BLE connection, the reconnection range will be reduced. This means only devices close to the Apple Watch will reconnect.” The session also says these limits are counted over a rolling 24-hour window and are reset when the user interacts with the app. I would particularly appreciate clarification of how this works in practice: What conditions cause a disconnect to count toward this policy? Does this policy apply while an app has an active HKWorkoutSession and continues executing in the background? Is the state maintained per peripheral, per app, or more globally? What exactly constitutes the user interaction that resets it? Does bringing an already-running workout app back to the foreground reset it, or does the app need to be relaunched? Is there any public API or diagnostic indication that reduced reconnection range is currently active? Is there any supported way to explicitly clear/reset that state? Connection parameters Does watchOS expose any supported mechanism for a CoreBluetooth central to influence parameters relevant to connection robustness, such as connection interval, supervision timeout, PHY, transmit power, or similar link parameters? Diagnosing CBError.connectionTimeout When CoreBluetooth reports CBError.connectionTimeout, is there any supported diagnostic method to determine whether the Watch stopped receiving the peripheral, the peripheral stopped receiving the Watch, or whether this should simply be treated as a link-layer timeout without attribution to either side? For context, this is not primarily a background-runtime problem. The active workout keeps the app running and the normal persistent BLE connection can operate flawlessly for many hours. I’m specifically trying to understand the best supported strategy for preserving and recovering the BLE link when RF conditions temporarily become marginal, especially with a peripheral that advertises very sparsely after a disconnect. DTS asked me to post this question here for review.
Replies
5
Boosts
2
Views
519
Activity
4d
Supported API for native Thunderbolt host-to-host communication?
I'm looking into direct communication between a Mac and a Linux machine connected over Thunderbolt. Thunderbolt networking works fine, but I'd like to explore whether it's possible to transfer data using native Thunderbolt DMA, without going through the TCP/IP stack. I've looked through the IOKit and DriverKit documentation, but most of what I've found relates to drivers for PCIe devices connected over Thunderbolt rather than communication between two hosts. A couple of questions: Is there a supported API for discovering Thunderbolt XDomain services and establishing native DMA-backed send/receive paths between hosts? Can this be done from userspace or DriverKit, or would it require a kernel extension? Ideally, I'd also like to keep the existing Thunderbolt networking interface working alongside it. Any pointers to relevant APIs or documentation would be appreciated. Thanks!
Replies
3
Boosts
0
Views
304
Activity
4d
iOS 27: system-wide registered fonts disappear from Settings > General > Fonts after every reboot
Hello, We ship a font provider app that installs fonts system-wide on iOS, delivering the font files through On-Demand Resources. Since iOS 27 shipped, customers have been reporting that their installed fonts vanish from the system font list after every restart. I would like to know whether the restore path for system-wide font registrations changed in iOS 27, and what a font provider app is expected to do after a device reboot. Environment iOS 27.0 and 27.0.0 only. We have no reports on iOS 26 or earlier. iPhone 18 Pro and iPhone 18 Pro Max Fonts delivered through On-Demand Resources and registered for system-wide installation using CoreText Steps to reproduce Activate a font in the app. It appears in Settings > General > Fonts. Reboot the device. Without launching the app, open Settings > General > Fonts. The font is gone. The app still shows the font as active, because it keeps its own activation state. Deactivate and reactivate the font in the app. It comes back. Reboot again. It disappears again. This happens on every reboot. It also happens with a single font activated, and it persists after updating or reinstalling the app. Because the font is missing from the system font list, it is also missing in other apps that use system fonts. What we have ruled out Not low storage. These are new devices with plenty of free space. The documented purge trigger for On-Demand Resources is low storage, which does not explain a result this consistent. Not a crash. Our crash data for the affected app version shows no elevated crash rate on iOS 27 compared to iOS 18. Not specific to one font or one app version. Questions Did the restore path for system-wide font registrations change in iOS 27? Are registrations that reference files inside On-Demand Resources still restored at boot? If a font provider app now has to re-register after a reboot, when and how should it do that? There is no natural launch point, since someone may use the font in another app without opening ours first. Is there a supported way for the app to detect that a font it installed is no longer present in the system font list, so it can repair the registration quietly? Context We deliver several thousand fonts this way, and Apple increased our On-Demand Resources limit for that reason (Case-ID 17273913, December 2025). On-Demand Resources is deprecated as of iOS 27. We have separately confirmed that fonts delivered through Background Assets cannot be registered system-wide: registration fails with CTFontManagerErrorDomain code 306, both from the Background Assets container and after copying the files into the app sandbox, because CoreText requires the file to sit inside the app bundle or On-Demand Resources. We have a separate question open about that migration path, so this post is only about the reboot behavior on iOS 27. Happy to provide a sysdiagnose from an affected device and a sample project. Thank you.
Replies
3
Boosts
0
Views
676
Activity
4d
`sysextd` rejects new `NEFilterDataProvider` activation with "no policy" on macOS 26 — despite valid Developer ID + notarization
I'm building a macOS network monitor using NEFilterDataProvider as a system extension, distributed with Developer ID signing. On macOS 26.3 (Tahoe), sysextd consistently rejects the activation request with "no policy, cannot allow apps outside /Applications" — despite the app being in /Applications and passing every verification check. I'm aware of the known Xcode NE signing bug (r. 108838909) and have followed the manual signing process from Exporting a Developer ID Network Extension. I've also tried both xcodebuild build and xcodebuild archive workflows — identical failure. Environment macOS 26.3 (25D125), SIP enabled Xcode 26.3 (17C529) Hardware Apple M2 Pro Certificate Developer ID Application (issued Jan 30, 2026 — 27 days old) MDM/Profiles None installed Signing & Verification (all pass) $ spctl -a -vv /Applications/Chakshu.app /Applications/Chakshu.app: accepted source=Notarized Developer ID origin=Developer ID Application: ROBIN SHARMA (R65679C4F3) $ codesign --verify --deep --strict -vv /Applications/Chakshu.app /Applications/Chakshu.app: valid on disk /Applications/Chakshu.app: satisfies its Designated Requirement $ xcrun stapler validate /Applications/Chakshu.app The validate action worked! App signing: Authority=Developer ID Application: ROBIN SHARMA (R65679C4F3) Authority=Developer ID Certification Authority Authority=Apple Root CA TeamIdentifier=R65679C4F3 Runtime Version=26.2.0 Notarization Ticket=stapled App entitlements: com.apple.application-identifier = R65679C4F3.dev.indrasvat.chakshu com.apple.developer.team-identifier = R65679C4F3 com.apple.developer.system-extension.install = true com.apple.developer.networking.networkextension = [content-filter-provider-systemextension] keychain-access-groups = [R65679C4F3.*] Extension signing: Same Developer ID authority, same team, same timestamp. Extension entitlements match (minus system-extension.install). Developer ID provisioning profiles are embedded in both app and extension. What sysextd logs Captured Feb 26, 2026 from log stream --predicate 'process == "sysextd"': sysextd [com.apple.sx:XPC] client activation request for dev.indrasvat.chakshu.filter sysextd attempting to realize extension with identifier dev.indrasvat.chakshu.filter sysextd (Security) SecKeyVerifySignature ← pass (×2) sysextd (Security) SecTrustEvaluateIfNecessary ← pass (×2) sysextd [com.apple.xpc:connection] activating connection: name=com.apple.CodeSigningHelper sysextd [com.apple.xpc:connection] invalidated after the last release sysextd no policy, cannot allow apps outside /Applications sysextd [com.apple.sx:XPC] client connection invalidated Signature and trust evaluation pass. CodeSigningHelper completes. Then the policy check fails. The app receives OSSystemExtensionError code 4 (extensionNotFound). What I've tried and ruled out Build process: Approach Result xcodebuild build -configuration Release + manual re-sign Same failure xcodebuild archive + export from archive + manual re-sign (per thread/737894) Same failure Minimal hand-crafted Xcode project (no xcodegen, trivial code) Same failure Both workflows follow Quinn's process exactly: build with Apple Development → copy app → embed Developer ID provisioning profiles → re-sign inside-out (extension first, then app) with -systemextension suffix entitlements → notarize → staple → install to /Applications. System-level checks: Rebooting — no change Killing sysextd — no change Removing com.apple.quarantine xattr — no change chown root:wheel on app bundle — no change lsregister -r (reset Launch Services) — no change Waiting 27 days for certificate propagation — no change Reinstalling via Finder drag-to-Applications — no change No MDM or configuration profiles installed /Library/SystemExtensions/db.plist shows extensionPolicies: [] (empty) Key observation Pre-existing network extensions activated before macOS 26 work fine on this machine. For example, Tailscale's NEPacketTunnelProvider shows state: activated_enabled in the system extensions database — it was activated on a prior macOS version and is still running. Only new system extension activations fail. I've seen similar Tahoe-specific reports from LuLu (same NEFilterDataProvider type, Developer ID distribution): LuLu #825 LuLu #831 Questions Is this a known regression in macOS 26's sysextd policy evaluation for new Developer ID system extension activations? sysextd's policy check fails after all signature and trust evaluation succeeds. Is there a separate trust/policy path that sysextd consults beyond what spctl, codesign, and CodeSigningHelper verify? Is there anything else I should be checking? I have a sysdiagnose captured immediately after the failure, a minimal reproducer project, and full raw sysextd logs available on request.
Replies
8
Boosts
0
Views
811
Activity
4d
Is CMSensorRecorder accelerometer recording and retrieval supported while Apple Watch is charging?
On an Apple Watch Series 4-5, our app receives no recorded accelerometer samples during charging. Repeating the query for the same interval after disconnecting the charger also returns nil. Recording without the charger produces samples. An HKWorkoutSession remains running during the unsuccessful test, and live motion collection works while charging. Is this expected behavior or a known limitation? If supported, what conditions must be met?
Replies
1
Boosts
0
Views
58
Activity
4d
Maximum size of an Apple-hosted Managed Background Assets pack
I'm developing an iOS app that uses Apple-hosted Managed Background Assets to deliver regional offline mapping datasets. According to Apple's documentation, the limits are 200 GB of hosted data and 200 asset packs per app. However, I couldn't find a documented maximum size for an individual managed asset pack. Our use case requires automatic, on-demand downloads of geographic datasets, typically between 50 MB and 500 MB, depending on the region. I have a few questions: Is there a maximum compressed or uncompressed size for an individual Apple-hosted Managed Background Assets pack? Are on-demand downloads of 100–500 MB packs supported over Wi-Fi and cellular networks? Are there any additional restrictions on large packs, such as download frequency, storage requirements or background delivery policies? Can these packs be downloaded automatically when a user enters a new geographic region, without requiring the user to select or manually download the pack? I'm specifically asking about Managed Background Assets, not the legacy On-Demand Resources system. Any clarification from an Apple engineer would be greatly appreciated. Thank you!
Replies
0
Boosts
0
Views
42
Activity
4d
StoreKit 2 returns primary-language product metadata in sandbox despite an approved localization for the storefront's language
Device: iPhone 11, iOS 26.5 Build: development build, built with Xcode 26.6, iOS SDK 26.5, using the StoreKit sandbox Problem For a non-consumable in-app purchase, Product.displayName and Product.description (StoreKit 2, fetched with Product.products(for:)) always return the English (U.S.) localization, which is the product's primary language, instead of the approved Portuguese (Brazil) one. The App Store purchase sheet shows the English (U.S.) display name too. Setup The product is Approved. Its English (U.S.), Portuguese (Brazil) and Indonesian localizations are all Approved in App Store Connect. The app's App Store localizations include Portuguese (Brazil). The iPhone's preferred languages are Português (Brasil) first, then English (U.S.) and Svenska. The app's language in Settings → Apps → [app] → Language is Português (Brasil). The app's Info.plist declares pt-BR in CFBundleLocalizations. The sandbox tester was newly created in App Store Connect with Brazil as its country or region. Prices come back in BRL, so the Brazil storefront is in use. Questions TN2413 says the language follows the test account's store, and an App Store Commerce Engineer said in thread 756918 that a sandbox account set to the desired country should return that country's language. Our setup matches both, yet we get the primary language. Is localized product metadata expected to be served in the sandbox environment? If so, what else determines the language StoreKit returns, and why would it fall back to the primary language when an approved localization exists for the storefront's default language? How can we verify product localizations before releasing to production?
Replies
1
Boosts
0
Views
89
Activity
4d
Developer Account- hanging submitted app bank details
Developer account; where do I got for support. I am trying to launch an called wealthontracker that was submitted for feedback. I havent had feedback so Im thinking its good to launch but in developer connect it said add your bank details in which I have done the IBAN. its being haning like that for more than 24 hrs maybe 4 to 5 days. PLEASE GET IT DONE
Replies
0
Boosts
0
Views
30
Activity
4d
有运算密集型的任务需要运行较长时间,用户在前台触发后不希望一直在前台等待任务完成,希望在后台持续运行并且有较高的CPU优先级,在前台轻负载情况下让这个后台任务性能保持和前台时接近的性能和时延,请问iOS上有这样的方案吗?
需要满足 (1)后台保活,在后台时任务仍然能一直运行直到任务完成 (2)任务在后台运行时,且前台负载较低时让任务分配尽量多的CPU资源,保持任务的性能和前台时接近 (3)需要使用GPU和NPU,需要跑AI模型,如果可以用GPU就更好,(GPU不跑也行) (4)方案合法,能上架苹果APP Store. 可以通过蓝牙连接来进行后台保活,这个任务本身就需要通过蓝牙连接一个外设,但是这种保活方式任务在后台时CPU权限较低,性能时延劣化很严重。 任务本身是类似做图片/视频处理的任务,需要跑几秒到几分钟的量级,最好可以尽量多地跑久一些。 我们试过了,后台保活后性能都大幅下降,降了6~10倍,体验较差 有没有做过类似的后台任务的,最终做到前后台性能接近的(前台空负载时)?
Replies
0
Boosts
0
Views
65
Activity
4d
Can bringing two iPhones together automatically display a custom profile card?
I’m evaluating an offline profile-card app for iPhone users in the United States. After installation and initial user consent, bringing two iPhones together should automatically display each person’s custom card, containing favorite musicians and their willingness to socialize. Requirements: Neither person needs to open the app before the interaction. The exchange works without internet. No QR codes or external NFC tags are involved. The card appears automatically, rather than requiring a notification tap to open it. Is this supported by any public iOS API or available entitlement? Could NFC & SE Platform support this non-payment use case? If unsupported, which requirement is the blocker? Please distinguish background/suspended apps from apps that the user has force-quit. Thank you.
Replies
0
Boosts
0
Views
33
Activity
4d
Supported read/write handoff of a sandbox-container PNG to Preview using NSWorkspace
Hello, I am preparing an existing macOS screenshot utility for distribution through the Mac App Store. The app stores captured PNG files under its temporary directory: FileManager.default.temporaryDirectory .appendingPathComponent("ShelfDragPoC/Captures", isDirectory: true) A context-menu "Edit" action passes the original PNG URL to Preview using NSWorkspace. The app does not create an editing copy. Relevant code: import AppKit @MainActor func openInPreview(_ url: URL) { guard let previewURL = NSWorkspace.shared.urlForApplication( withBundleIdentifier: "com.apple.Preview" ) else { return } let configuration = NSWorkspace.OpenConfiguration() configuration.activates = true NSWorkspace.shared.open( [url], withApplicationAt: previewURL, configuration: configuration ) { _, _ in } } The app monitors the original PNG URL for file changes and refreshes its thumbnail when changes are detected. Observed behavior: In the existing non-sandboxed app, rotating an image in Preview updates the original PNG and the thumbnail without requiring Command-S. In the sandboxed validation app, Preview opens the image, but editing results in a separate copy. When closing the edited document, Preview displays a message indicating that the original document will not be changed. The original PNG and the app's thumbnail are not updated. The Preview launch code and file watcher are unchanged between the non-sandboxed and sandboxed versions. The sandboxed app has these entitlements: com.apple.security.app-sandbox com.apple.security.files.user-selected.read-write com.apple.security.files.bookmarks.app-scope The app-scoped bookmark is used for a separate Desktop export feature. The PNG opened in Preview remains in the app's sandbox container. My question: Is there a supported public API that allows a sandboxed Mac App Store app to open its own container-resident PNG in Preview with the permissions required for in-place editing and normal automatic saving? Ideally, the user would only need to select "Edit" once, without an additional file-selection dialog or an explicit Save command. We want to preserve the original PNG URL, keep App Sandbox enabled, and avoid automatically exporting temporary images to the Desktop. If this workflow is not supported, what is Apple's recommended approach? Thank you.
Replies
8
Boosts
0
Views
370
Activity
4d
System Integrity Protection and the `com.apple.rootless.install.heritable` entitlement
For certain development tasks, I need to disable System Integrity Protection (SIP) (csrutil disable). After I am done doing my tests, I reenable SIP. Additionally, SIP has a number of unsupported configurations. For example, csrutil enable --without debug enables all system integrity protections except debugging. My question concerns the com.apple.rootless.install.heritable entitltement, which, from my understanding, allows any app to gain root access without authorization of the user. I would like to know whether any app give itself this entitlement without my authorization when (1) SIP is fully disabled (csrutil disable) and when (2) SIP is partially disabled in the aforementioned specific unsupported configuration (csrutil enable --without debug).
Replies
4
Boosts
0
Views
102
Activity
4d