General:
Forums subtopic: App & System Services > Networking
TN3151 Choosing the right networking API
Networking Overview document — Despite the fact that this is in the archive, this is still really useful.
TLS for App Developers forums post
Choosing a Network Debugging Tool documentation
WWDC 2019 Session 712 Advances in Networking, Part 1 — This explains the concept of constrained networking, which is Apple’s preferred solution to questions like How do I check whether I’m on Wi-Fi?
TN3135 Low-level networking on watchOS
TN3179 Understanding local network privacy
Adapt to changing network conditions tech talk
Understanding Also-Ran Connections forums post
Extra-ordinary Networking forums post
Foundation networking:
Forums tags: Foundation, CFNetwork
URL Loading System documentation — NSURLSession, or URLSession in Swift, is the recommended API for HTTP[S] on Apple platforms.
Moving to Fewer, Larger Transfers forums post
Testing Background Session Code forums post
Network framework:
Forums tag: Network
Network framework documentation — Network framework is the recommended API for TCP, UDP, and QUIC on Apple platforms.
Building a custom peer-to-peer protocol sample code (aka TicTacToe)
Implementing netcat with Network Framework sample code (aka nwcat)
Configuring a Wi-Fi accessory to join a network sample code
Moving from Multipeer Connectivity to Network Framework forums post
NWEndpoint History and Advice forums post
Network Extension (including Wi-Fi on iOS):
See Network Extension Resources
Wi-Fi Fundamentals
TN3111 iOS Wi-Fi API overview
Wi-Fi Aware framework documentation
Wi-Fi on macOS:
Forums tag: Core WLAN
Core WLAN framework documentation
Wi-Fi Fundamentals
Secure networking:
Forums tags: Security
Apple Platform Security support document
Preventing Insecure Network Connections documentation — This is all about App Transport Security (ATS).
WWDC 2017 Session 701 Your Apps and Evolving Network Security Standards [1] — This is generally interesting, but the section starting at 17:40 is, AFAIK, the best information from Apple about how certificate revocation works on modern systems.
Available trusted root certificates for Apple operating systems support article
Requirements for trusted certificates in iOS 13 and macOS 10.15 support article
About upcoming limits on trusted certificates support article
Apple’s Certificate Transparency policy support article
What’s new for enterprise in iOS 18 support article — This discusses new key usage requirements.
Technote 2232 HTTPS Server Trust Evaluation
Technote 2326 Creating Certificates for TLS Testing
QA1948 HTTPS and Test Servers
Miscellaneous:
More network-related forums tags: 5G, QUIC, Bonjour
On FTP forums post
Using the Multicast Networking Additional Capability forums post
Investigating Network Latency Problems forums post
WirelessInsights framework documentation
iOS Network Signal Strength forums post
Share and Enjoy
—
Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"
[1] This video is no longer available from Apple, but the URL should help you locate other sources of this info.
Networking
RSS for tagExplore the networking protocols and technologies used by the device to connect to Wi-Fi networks, Bluetooth devices, and cellular data services.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Several of my users are reporting on at lest recent and current versions of iOS the value from one characteristic can be swapped with another.
Originally I thought this was a library issue but it doesn't happen on Android and now a user with two iPhones using the exact same app and iOS 26.3 on both has the issue on one phone but not the other.
I've gone into more detail here which also includes a little data dumping to prove the values between characteristics can be mixed up.
https://github.com/dotintent/react-native-ble-plx/issues/1316
One user reported cycling Bluetooth on/off fixed the issue but the latest user says it does not.
For the peripheral the services can only change if the device enters firmware update mode (in which case the service UUID is different). Otherwise the characteristics on a service never change. This would make it a strange one to be caching related since the cache should always be correct.
I haven’t been able to get this to work at any level! I’m running into multiple issues, any light shed on any of these would be nice:
I can’t implement a bloom filter that produces the same output as can be found in the SimpleURLFilter sample project, after following the textual description of it that’s available in the documentation. No clue what my implementation is doing wrong, and because of the nature of hashing, there is no way to know. Specifically:
The web is full of implementations of FNV-1a and MurmurHash3, and they all produce different hashes for the same input. Can we get the proper hashes for some sample strings, so we know which is the “correct” one?
Similarly, different implementations use different encodings for the strings to hash. Which should we use here?
The formulas for numberOfBits and numberOfHashes give Doubles and assign them to Ints. It seems we should do this conversing by rounding them, is this correct?
Can we get a sample correct value for the combined hash, so we can verify our implementations against it?
Or ignoring all of the above, can we have the actual code instead of a textual description of it? 😓
I managed to get Settings to register my first attempt at this extension in beta 1. Now, in beta 2, any other project (including the sample code) will redirect to Settings, show the Allow/Deny message box, I tap Allow, and then nothing happens. This must be a bug, right?
Whenever I try to enable the only extension that Settings accepted (by setting its isEnabled to true), its status goes to .stopped and the error is, of course, .unknown. How do I debug this?
While the extension is .stopped, ALL URL LOADS are blocked on the device. Is this to be expected? (shouldFailClosed is set to false)
Is there any way to manually reload the bloom filter? My app ships blocklist updates with background push, so it would be wasteful to fetch the filter at a fixed interval. If so, can we opt out of the periodic fetch altogether?
I initially believed the API to be near useless because I didn’t know of its “fuzzy matching” capabilities, which I’ve discovered by accident in a forum post. It’d be nice if those were documented somewhere!
Thanks!!
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.
Hello,
I have an app that is using iOS 26 Network Framework APIs.
It is using QUIC, TLS 1.3 and Bonjour. For TLS I am using a PKCS#12 identity.
All works well and as expected if the devices (iPhone with no cellular, iPhone with cellular, and iPad no cellular) are all on the same wifi network.
If I turn off my router (ie no more wifi network) and leave on the wifi toggle on the iOS devices - only the non cellular iPhone and iPad are able to discovery and connect to each other. My iPhone with cellular is not able to.
By sharing my logs with Cursor AI it was determined that the connection between the two problematic peers (iPad with no cellular and iPhone with cellular) never even makes it to the TLS step because I never see the logs where I print out the certs I compare.
I tried doing "builder.requiredInterfaceType(.wifi)" but doing that blocked the two non cellular devices from working. I also tried "builder.prohibitedInterfaceTypes([.cellular])" but that also did not work.
Is AWDL on it's way out? Should I focus my energy on Wi-Fi Aware?
Regards,
Captadoh
Since updating to macOS 26.4 developerbeta 2 I've been getting full loss of dns resolution. I am not running a VPN or any network extensions that I am aware of.
I'm not sure how to report this in the feedback utility as I cannot find an appropriate category for it. Happy to file it if someone can give an appropriate suggestion - the closest I could see was Wi-Fi but that wanted Wi-Fi logs for the issue, which I do not believe to be needed as this is not a Wi-Fi connectivity issue.
Running
dig example.com +short
nslookup example.com
ping example.com
Gives the following output
104.18.27.120
104.18.26.120
Server: 10.0.1.1
Address: 10.0.1.1#53 \
Non-authoritative answer:
Name: example.com
Address: 104.18.26.120
Name: example.com
Address: 104.18.27.120 \
ping: cannot resolve example.com: Unknown host
This shows it's not an issue with my local network and that core networking is working, but something in the mDNSResponder/dns stack of macOS is failing. This causes all apps/browsers that do not implement their own DNS lookups to fail (Chrome still works).
Sometimes the issue clears after running the following commands (for a period), sometimes it does not. A restart always resolves the issue temporarily.
sudo killall -9 mDNSResponder
sudo killall -9 mDNSResponderHelper
sudo dscacheutil -flushcache
sudo ifconfig en0 down
sudo ifconfig en0 up
Topic:
App & System Services
SubTopic:
Networking
I'm using NEPacketTunnelProvider to intercept DNS queries, forward them upstream,
and inject the responses back via writePacketObjects().
This works correctly for responses under ~500 bytes. For larger responses (~893
bytes, e.g. DNS CERT records), writePacketObjects() returns without error but
mDNSResponder never receives the packet — it retries 3–4 times and then times out.
What I have verified:
IP and UDP checksums are correct
UDP length and IP total length fields are correct
Maximum packet size (MTU) set to 1500 in NEIPv4Settings/NEIPv6Settings
Approaches tried:
Injecting the full 921-byte packet — writePacketObjects() succeeds but the
packet never reaches mDNSResponder
IP-level fragmentation — fragments appear to be silently dropped
Setting the TC (truncation) bit — mDNSResponder does not retry over TCP
Truncating the response to ≤512 bytes — the packet arrives but the data is
incomplete
Questions:
Is there a supported way to deliver a DNS response larger than 512 bytes
through NEPacketTunnelFlow?
Does NEPacketTunnelProvider impose an undocumented packet size limit below
the configured MTU?
Does mDNSResponder silently discard responses larger than 512 bytes when the
original query had no EDNS0 OPT record? Is there a way to signal that larger
responses are supported?
Are IP-level fragments reliably delivered through writePacketObjects()?
Tested on iOS 26.3, physical device.
Topic:
App & System Services
SubTopic:
Networking
Is it somehow possible to get the transport layer (UDP and TCP) payload amounts for TLS or QUIC connections established via the Network framework? (From within the app itself that establishes the connections.)
I am currently using the ntstat.h kernel socket calls, but I hope there is a simpler solution.
With ntstat, I have not yet been able to observe a specific connection. I have to search for the connection I am looking in all (userspace) connections.
I’m encountering a persistent issue with my Network Extension (specifically NEFilterDataProvider) and would really appreciate any insights.
The extension generally works as expected, but after some time — especially after sleep/wake cycles or network changes — a global network outage occurs. During this state, no network traffic works: pings fail, browsers can’t load pages, etc. As soon as I stop the extension (by disabling it in System Preferences), the network immediately recovers. If I re-enable it, the outage returns instantly.
I’ve also noticed that once this happens, the extension stops receiving callbacks like handleNewFlow(), and reinstalling the app or restarting the extension doesn’t help. The only thing that resolves the issue is rebooting the system. After reboot, the extension works fine again — until the problem reoccurs later.
I asked AI about this behavior, and it suggested the possibility that the kernel might have marked the extension as untrusted, causing the system to intentionally block all network traffic as a safety mechanism.
Has anyone experienced similar behavior with NEFilterDataProvider? Could there be a way to detect or prevent this state without rebooting? Is there any logging or diagnostic data I should collect when it happens again?
Any guidance or pointers would be greatly appreciated. Thanks in advance!
We have a VPN app that uses NEPacketTunnelProvider with includeAllNetworks = true. We've encountered an issue where push notifications are not delivered over Wi-Fi while the tunnel is active in a pre-MFA quarantine state (tunnel is up but traffic is blocked on server side), regardless of whether excludeAPNS is set to true or false.
Observed behavior
Wi-Fi excludeAPNS = true - Notifications not delivered
Wi-Fi excludeAPNS = false - Notifications not delivered
Cellular excludeAPNS = true - Notifications delivered
Cellular excludeAPNS = false - Notifications not delivered
On cellular, the behavior matches our expectations: setting excludeAPNS = true allows APNS traffic to bypass the tunnel and notifications arrive; setting it to false routes APNS through the tunnel and notifications are blocked (as expected for a non-forwarding tunnel). On Wi-Fi, notifications fail to deliver in both cases.
Our question
Is this expected behavior when includeAllNetworks is enabled on Wi-Fi, or is this a known issue / bug with APNS delivery? Is there something else in the Wi-Fi networking path that includeAllNetworks affects beyond routing, which could prevent APNS from functioning even when the traffic is excluded from the tunnel?
Sample Project
Below is the minimal code that reproduces this issue. The project has two targets: a main app and a Network Extension. The tunnel provider captures all IPv4 and IPv6 traffic via default routes but does not forward packets — simulating a pre-MFA quarantine state. The main app configures the tunnel with includeAllNetworks = true and provides a UI toggle for excludeAPNS.
PacketTunnelProvider.swift (Network Extension target):
import NetworkExtension
class PacketTunnelProvider: NEPacketTunnelProvider {
override func startTunnel(options: [String : NSObject]?, completionHandler: @escaping (Error?) -> Void) {
let settings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "127.0.0.1")
let ipv4 = NEIPv4Settings(addresses: ["198.51.100.1"], subnetMasks: ["255.255.255.0"])
ipv4.includedRoutes = [NEIPv4Route.default()]
settings.ipv4Settings = ipv4
let ipv6 = NEIPv6Settings(addresses: ["fd00::1"], networkPrefixLengths: [64])
ipv6.includedRoutes = [NEIPv6Route.default()]
settings.ipv6Settings = ipv6
let dns = NEDNSSettings(servers: ["198.51.100.1"])
settings.dnsSettings = dns
settings.mtu = 1400
setTunnelNetworkSettings(settings) { error in
if let error = error {
completionHandler(error)
return
}
self.readPackets()
completionHandler(nil)
}
}
private func readPackets() {
packetFlow.readPackets { [weak self] packets, protocols in
self?.readPackets()
}
}
override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
completionHandler()
}
override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) {
if let handler = completionHandler {
handler(messageData)
}
}
override func sleep(completionHandler: @escaping () -> Void) {
completionHandler()
}
override func wake() {
}
}
ContentView.swift (Main app target) — trimmed to essentials:
import SwiftUI
import NetworkExtension
struct ContentView: View {
@State private var excludeAPNs = false
@State private var manager: NETunnelProviderManager?
var body: some View {
VStack {
Toggle("Exclude APNs", isOn: $excludeAPNs)
.onChange(of: excludeAPNs) { Task { await saveAndReload() } }
Button("Connect") { Task { await toggleVPN() } }
}
.padding()
.task { await loadManager() }
}
private func loadManager() async {
let managers = try? await NETunnelProviderManager.loadAllFromPreferences()
if let existing = managers?.first {
manager = existing
} else {
let m = NETunnelProviderManager()
let proto = NETunnelProviderProtocol()
proto.providerBundleIdentifier = "<your-extension-bundle-id>"
proto.serverAddress = "127.0.0.1"
proto.includeAllNetworks = true
proto.excludeAPNs = excludeAPNs
m.protocolConfiguration = proto
m.localizedDescription = "TestVPN"
m.isEnabled = true
try? await m.saveToPreferences()
try? await m.loadFromPreferences()
manager = m
}
if let proto = manager?.protocolConfiguration as? NETunnelProviderProtocol {
excludeAPNs = proto.excludeAPNs
}
}
private func saveAndReload() async {
guard let manager else { return }
if let proto = manager.protocolConfiguration as? NETunnelProviderProtocol {
proto.includeAllNetworks = true
proto.excludeAPNs = excludeAPNs
}
manager.isEnabled = true
try? await manager.saveToPreferences()
try? await manager.loadFromPreferences()
}
private func toggleVPN() async {
guard let manager else { return }
if manager.connection.status == .connected {
manager.connection.stopVPNTunnel()
} else {
await saveAndReload()
try? manager.connection.startVPNTunnel()
}
}
}
Steps to reproduce
Build and run the sample project with above code on a physical iOS device. Connect to a Wi-Fi network.
Set excludeAPNS = true using the toggle and tap Connect.
Send a push notification to the device to a test app with remote notification capability (e.g., via a test push service or the push notification console).
Observe that the notification is not delivered.
Disconnect. Switch to cellular. Reconnect with the same settings.
Send the same push notification — observe that it is delivered.
Environment
iOS 26.2
Xcode 26.2
Physical device (iPhone 15 Pro)
Hello Apple Support Team,
We are seeing a production crash on iOS 26 devices that appears to originate from Apple system frameworks rather than application code.
1. Crash Details
OS Version: iOS 26.x
App built with: Xcode 16
Devices: Multiple models (not device-specific)
Exception Type: SIGSEGV SEGV_ACCERR
Fault Address: 0x0000000000000100
Crashed Thread: 4 (network background queue)
Crash trace summary:
Last Exception :
0 libobjc.A.dylib _objc_release_x8 + 8
1 libboringssl.dylib _nw_protocol_boringssl_deallocate_options + 92
2 Network 0x000000019695207c 0x00000001968dc000 + 483452
3 libswiftCore.dylib __swift_release_dealloc + 56
4 libswiftCore.dylib bool swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::doDecrementSlow<(swift::PerformDeinit)1>(swift::RefCountBitsT<(swift::RefCountInlinedness)1>, unsigned int) + 152
5 Network 0x0000000196951f6c 0x00000001968dc000 + 483180
6 Network 0x0000000196952000 0x00000001968dc000 + 483328
7 libswiftCore.dylib __swift_release_dealloc + 56
8 libswiftCore.dylib bool swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::doDecrementSlow<(swift::PerformDeinit)1>(swift::RefCountBitsT<(swift::RefCountInlinedness)1>, unsigned int) + 152
9 libswiftCore.dylib void multiPayloadEnumFN<&handleRefCountsDestroy>(swift::TargetMetadata<swift::InProcess> const*, swift::LayoutStringReader1&, unsigned long&, unsigned char*) + 248
10 libswiftCore.dylib swift::swift_cvw_arrayDestroy(swift::OpaqueValue*, unsigned long, unsigned long, swift::TargetMetadata<swift::InProcess> const*) + 1172
11 libswiftCore.dylib _$sSp12deinitialize5countSvSi_tF + 40
12 CollectionsInternal ___swift_instantiateGenericMetadata + 1236
13 CollectionsInternal ___swift_instantiateGenericMetadata + 388
14 CollectionsInternal ___swift_instantiateGenericMetadata + 1044
15 libswiftCore.dylib __swift_release_dealloc + 56
16 libswiftCore.dylib bool swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::doDecrementSlow<(swift::PerformDeinit)1>(swift::RefCountBitsT<(swift::RefCountInlinedness)1>, unsigned int) + 152
17 Network 0x000000019695f9fc 0x00000001968dc000 + 539132
18 Network 0x000000019695f9bc 0x00000001968dc000 + 539068
19 libswiftCore.dylib __swift_release_dealloc + 56
20 libswiftCore.dylib bool swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::doDecrementSlow<(swift::PerformDeinit)1>(swift::RefCountBitsT<(swift::RefCountInlinedness)1>, unsigned int) + 152
21 libswiftCore.dylib swift_cvw_destroyImpl(swift::OpaqueValue*, swift::TargetMetadata<swift::InProcess> const*) + 212
22 Network 0x0000000196def5d8 0x00000001968dc000 + 5322200
23 Network 0x0000000196ded130 0x00000001968dc000 + 5312816
24 libswiftCore.dylib __swift_release_dealloc + 56
25 libswiftCore.dylib bool swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::doDecrementSlow<(swift::PerformDeinit)1>(swift::RefCountBitsT<(swift::RefCountInlinedness)1>, unsigned int) + 152
26 Network 0x000000019695fde0 0x00000001968dc000 + 540128
27 libobjc.A.dylib object_cxxDestructFromClass(objc_object*, objc_class*) + 116
28 libobjc.A.dylib objc_destructInstance_nonnull_realized(objc_object*) + 76
29 libobjc.A.dylib __objc_rootDealloc + 72
30 Network 0x000000019695f99c 0x00000001968dc000 + 539036
31 Network 0x000000019695fae4 0x00000001968dc000 + 539364
32 Network 0x0000000196b078b8 0x00000001968dc000 + 2275512
33 libobjc.A.dylib object_cxxDestructFromClass(objc_object*, objc_class*) + 116
34 libobjc.A.dylib objc_destructInstance_nonnull_realized(objc_object*) + 76
35 libobjc.A.dylib __objc_rootDealloc + 72
36 Network 0x0000000196b07658 0x00000001968dc000 + 2274904
37 Network 0x00000001968e51d4 nw_queue_context_async_if_needed + 92
38 Network 0x0000000197686ea0 0x00000001968dc000 + 14331552
39 libswiftCore.dylib swift::swift_cvw_arrayDestroy(swift::OpaqueValue*, unsigned long, unsigned long, swift::TargetMetadata<swift::InProcess> const*) + 436
40 libswiftCore.dylib _$sSp12deinitialize5countSvSi_tF + 40
41 CollectionsInternal ___swift_instantiateGenericMetadata + 1236
42 CollectionsInternal ___swift_instantiateGenericMetadata + 388
43 CollectionsInternal ___swift_instantiateGenericMetadata + 1044
44 libswiftCore.dylib __swift_release_dealloc + 56
45 libswiftCore.dylib bool swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::doDecrementSlow<(swift::PerformDeinit)1>(swift::RefCountBitsT<(swift::RefCountInlinedness)1>, unsigned int) + 152
46 Network 0x000000019694a010 0x00000001968dc000 + 450576
47 libobjc.A.dylib object_cxxDestructFromClass(objc_object*, objc_class*) + 116
48 libobjc.A.dylib objc_destructInstance_nonnull_realized(objc_object*) + 76
49 libobjc.A.dylib __objc_rootDealloc + 72
50 Network 0x0000000196a330e0 0x00000001968dc000 + 1405152
51 Network 0x00000001974378e0 0x00000001968dc000 + 11909344
52 Network 0x0000000196a17178 0x00000001968dc000 + 1290616
53 libdispatch.dylib __dispatch_call_block_and_release + 32
54 libdispatch.dylib __dispatch_client_callout + 16
55 libdispatch.dylib _dispatch_workloop_invoke.cold.4 + 32
56 libdispatch.dylib __dispatch_workloop_invoke + 1980
57 libdispatch.dylib __dispatch_root_queue_drain_deferred_wlh + 292
58 libdispatch.dylib __dispatch_workloop_worker_thread + 692
59 libsystem_pthread.dylib __pthread_wqthread + 292
------
Exception Type: SIGSEGV SEGV_ACCERR
Exception Codes: fault addr: 0x0000000000000100
Crashed Thread: 4
2. Behavior & Context
The crash occurs during normal HTTPS networking using standard URLSession (no direct usage of Network.framework nor boringssl APIs).
It appears to be triggered during QUIC connection establishment or TLS fallback.
The stack trace contains no application code frames — all symbols are from system libraries.
The crash strongly indicates double-free, over-release, or dangling pointer inside nw_protocol_boringssl_options deallocation.
3. Questions for Apple
Is this a known issue in iOS 26 within Network.framework / boringssl related to nw_protocol_boringssl_deallocate_options?
What is the root cause of the over‑release / invalid objc_release in this path?
Is there a workaround we can implement from the app side (e.g., disabling QUIC, adjusting TLS settings, or queue configuration)?
Do you have a target iOS version or patch where this issue will be fixed?
We can provide full crash logs and additional metrics upon request.
4. Additional Information
Developed using Swift 5, with a deployment target of iOS 12+.
Thank you for your support.
Topic:
App & System Services
SubTopic:
Networking
I use Iphone 17 wifi to test the device and mobile phone communicate,but I found the wifi disconnect innormal in hign frequency. This situation is only appears in iphone 17 series, iphone 14 and 15 is ok, so I think iphone 17 wifi chip or software has bugs. the local network disconnect in hign frequency.
Topic:
App & System Services
SubTopic:
Networking
Hi,
On macOS 26.4 Beta (25E5218f) (macOS Tahoe 26 Developer Beta ), the network filter causes network failures or slowdowns. This manifests as Chrome failing to access websites, while Safari can access the same websites without issue. The affected websites can be pinged locally.
My situation is similar to this situation.The same question link is: https://github.com/objective-see/LuLu/issues/836
Have you been paying attention to this issue? Hopefully, it can be fixed in the official release.
Thank you.
Dear Apple Developer Technical Support,
I am currently developing a macOS network filtering solution using NetworkExtension with NEFilterDataProvider.
During implementation of the handleOutboundData logic, we are using the following verdict:
NEFilterNewFlowVerdict.filterDataVerdict(
withFilterInbound: true,
peekInboundBytes: InboundPeekBytes,
filterOutbound: true,
peekOutboundBytes: OutboundPeekBytes
)
However, we have encountered an issue when SMB traffic is involved.
When SMB protocol communication occurs, the network connection occasionally becomes unresponsive or appears to stall when peekOutboundBytes is set to a large value.
Through testing, we observed the following behavior:
On some systems, reducing the peekOutboundBytes value allows SMB communication to proceed normally.
On other systems, even relatively small values can still cause the SMB connection to stall.
This behavior appears inconsistent across different macOS environments.
Because of this, we would like to clarify the following:
Is there a documented or recommended maximum value for peekOutboundBytes when using NEFilterNewFlowVerdict.filterDataVerdict?
Are there any internal limits or constraints within NetworkExtension that could cause SMB traffic to stall when the peek buffer size is too large?
Are there best practices for selecting appropriate peekInboundBytes / peekOutboundBytes values when filtering high-throughput protocols such as SMB?
If necessary, we can provide additional information such as macOS version, test environment details, and logs.
Thank you for your assistance.
Best regards,
sangho
Network is not working when over 50MB size file upload smb using NEFilterDataProvider in macOS
The event received through NEFilterDataProvider is returned immediately without doing any other work.
override func handleNewFlow(_ flow: NEFilterFlow) -> NEFilterNewFlowVerdict {
guard let socketFlow = flow as? NEFilterSocketFlow,
let auditToken = socketFlow.sourceAppAuditToken,
let remoteEndpoint = socketFlow.remoteEndpoint as? NWHostEndpoint,
let localEndpoint = socketFlow.localEndpoint as? NWHostEndpoint else {
return .allow()
}
return .filterDataVerdict(withFilterInbound: true, peekInboundBytes: Int.max, filterOutbound: true, peekOutboundBytes: Int.max)
}
override func handleInboundData(from flow: NEFilterFlow, readBytesStartOffset offset: Int, readBytes: Data) -> NEFilterDataVerdict {
guard let socketFlow = flow as? NEFilterSocketFlow,
let auditToken = socketFlow.sourceAppAuditToken,
let remoteEndpoint = socketFlow.remoteEndpoint as? NWHostEndpoint,
let localEndpoint = socketFlow.localEndpoint as? NWHostEndpoint else {
return .allow()
}
return NEFilterDataVerdict(passBytes: readBytes.count, peekBytes: Int.max)
}
override func handleOutboundData(from flow: NEFilterFlow, readBytesStartOffset offset: Int, readBytes: Data) -> NEFilterDataVerdict {
guard let socketFlow = flow as? NEFilterSocketFlow,
let auditToken = socketFlow.sourceAppAuditToken,
let remoteEndpoint = socketFlow.remoteEndpoint as? NWHostEndpoint,
let localEndpoint = socketFlow.localEndpoint as? NWHostEndpoint else {
return .allow()
}
return NEFilterDataVerdict(passBytes: readBytes.count, peekBytes: Int.max)
}
override func handleInboundDataComplete(for flow: NEFilterFlow) -> NEFilterDataVerdict {
guard let socketFlow = flow as? NEFilterSocketFlow,
let auditToken = socketFlow.sourceAppAuditToken,
let remoteEndpoint = socketFlow.remoteEndpoint as? NWHostEndpoint,
let localEndpoint = socketFlow.localEndpoint as? NWHostEndpoint else {
return .allow()
}
return .allow()
}
override func handleOutboundDataComplete(for flow: NEFilterFlow) -> NEFilterDataVerdict {
guard let socketFlow = flow as? NEFilterSocketFlow,
let auditToken = socketFlow.sourceAppAuditToken,
let remoteEndpoint = socketFlow.remoteEndpoint as? NWHostEndpoint,
let localEndpoint = socketFlow.localEndpoint as? NWHostEndpoint else {
return .allow()
}
return .allow()
}
how can i fix it?
I’m building a macOS app with a DNS Proxy system extension for Developer ID + notarization, deployed via MDM, and Xcode fails the Developer ID Release build with a provisioning profile mismatch for com.apple.developer.networking.networkextension.
Environment
macOS: Sequoia (15.7.2)
Xcode: 26.2
Distribution: Developer ID + notarization, deployed via MDM
Host bundle ID: com.mydns.agent.MyDNSMacProxy
DNS Proxy system extension bundle ID: com.mydns.agent.MyDNSMacProxy.dnsProxy
Host entitlements (Release):
File: MyDNSMacProxy/MyDNSMacProxyRelease.entitlements:
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.application-identifier</key>
<string>B234657989.com.mydns.agent.MyDNSMacProxy</string>
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>dns-proxy</string>
</array>
<key>com.apple.developer.system-extension.install</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>B234657989</string>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.mydns.MyDNSmac</string>
</array>
<key>keychain-access-groups</key>
<array>
<string>B234657989.*</string>
</array>
</dict>
</plist>
xcodebuild -showBuildSettings -scheme MyDNSMacProxy -configuration Release :
PROVISIONING_PROFILE_SPECIFIER = main MyDNSMacProxy5
CODE_SIGN_IDENTITY = Developer ID Application
Host Developer ID profile
main_MyDNSMacProxy5.provisionprofile (via security cms -D):
"Entitlements" => {
"com.apple.application-identifier" => "B234657989.com.mydns.agent.MyDNSMacProxy"
"com.apple.developer.team-identifier" => "B234657989"
"com.apple.security.application-groups" => [ "group.com.mydns.MyDNSmac", ..., "B234657989.*" ]
"keychain-access-groups" => [ "B234657989.*" ]
"com.apple.developer.system-extension.install" => 1
"com.apple.developer.networking.networkextension" => [
"packet-tunnel-provider-systemextension",
"app-proxy-provider-systemextension",
"content-filter-provider-systemextension",
"dns-proxy-systemextension",
"dns-settings",
"relay",
"url-filter-provider",
"hotspot-provider"
]
}
So:
App ID, team ID, keychain and system‑extension.install match.
The profile’s com.apple.developer.networking.networkextension is a superset of what I request in the host entitlements (dns-proxy only).
System extension (for context)
DNS Proxy system extension target:
NSExtensionPointIdentifier = com.apple.dns-proxy
NetworkExtension → NEProviderClasses → com.apple.networkextension.dns-proxy → my provider class
Entitlements: com.apple.developer.networking.networkextension = ["dns-proxy-systemextension"]
This target uses a separate Developer ID profile and builds successfully.
Xcode error
Release build of the host fails with:
…MyDNSMacProxy.xcodeproj: error: Provisioning profile "main MyDNSMacProxy5" doesn't match the entitlements file's value for the com.apple.developer.networking.networkextension entitlement. (in target 'MyDNSMacProxy' from project 'MyDNSMacProxy')
Xcode UI also says:
Entitlements: 6 Included, 1 Missing Includes com.apple.developer.team-identifier, com.apple.application-identifier, keychain-access-groups, com.apple.developer.system-extension.install, and com.apple.security.application-groups. Doesn’t match entitlements file value for com.apple.developer.networking.networkextension.
Because of this, the app bundle isn’t produced and I can’t inspect the final signed entitlements.
Questions:
For com.apple.developer.networking.networkextension, should Xcode accept a subset of values in the entitlements (here just dns-proxy) as long as that value is allowed by the Developer ID profile, or does it currently require a stricter match?
Is the following configuration valid for Developer ID + MDM with a DNS Proxy system extension:
Host entitlements: ["dns-proxy"]
System extension entitlements: ["dns-proxy-systemextension"]
Host profile’s NE array includes the DNS Proxy system extension types.
If this is a known limitation or bug in how Xcode validates NE entitlements for Developer ID, is there a recommended workaround?
Thanks for any guidance.
Topic:
App & System Services
SubTopic:
Networking
Tags:
Network Extension
System Extensions
Code Signing
Developer ID
Dear Apple Developer Support Team,
I am writing to inquire about the process for obtaining approval for the following entitlement in my iOS/macOS app:
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>content-filter-provider</string>
</array>
Specifically, I would like guidance on:
The steps required to submit a request for this entitlement.
Any necessary documentation or justification that needs to be provided to Apple.
Typical review timelines and approval criteria.
Any restrictions or compliance requirements associated with this entitlement.
Our app intends to implement a content filtering functionality to enhance network security and user safety. We want to ensure full compliance with Apple’s policies and guidelines.
Could you please provide detailed instructions or point us to the relevant resources to initiate this approval process?
Thank you for your assistance.
Hi Apple Network Team,
Good day.
Recently we are experiencing some issues that when iOS or iPad OS connected to a Wi-Fi with captive portal, iOS sometimes failed to launch the full captive portal website.
Based on TCPDump and WLAN dump logs, when this failure happened, we only see web client on iOS queried AAAA and HTTPS DNS queries without A query. Not all the websites are supporting and being hosted on both IPv4 and IPv6 servers. Is there a know bug on iOS and iPad OS side including OS version >= 36.2.
Topic:
App & System Services
SubTopic:
Networking
We are currently experiencing an issue that occurs only on iPhone 17 models.
In our app, after connecting to an external device, users can download multiple video files stored on the device. When downloading several videos consecutively, the device consistently stops receiving responses midway through the process. As a result, no response is returned, and the connection between the app and the device is eventually lost.
This issue does not occur on any iPhone models prior to iPhone 17.
It is reproducible across all iPhone 17 devices within our company.
This is a critical issue, and we need urgent assistance.
The main error logs show two patterns:
• Connection loss
• Timeout
At the OS level, the only error codes we receive are:
• -1005 (Network connection lost)
• -1001 (Request timed out)
Unfortunately, we are unable to obtain more detailed error information beyond these codes, which makes further debugging difficult.
We have attached the relevant logs below.
We would greatly appreciate any guidance on how to further investigate or resolve this issue.
310.0 / :: 81 % ::: 251.21481481481482
310.0 / :: 82 % ::: 254.23280423280423
310.0 / :: 83 % ::: 257.3820105820106
310.0 / :: 84 % ::: 260.4
KeepAlive SEND id=423F1336-6239-4B3B-9414-5A987D85D564 at=2026-02-24T12:56:43Z timeout=60.000000s
current: D20-Q2-PLUS, ssid: D20-Q2-PLUS_136a63
KeepAlive SKIP (in-flight)
tcp_output [C10.1.1:3] flags=[R.] seq=4017430266, ack=4146413113, win=2048 state=CLOSED rcv_nxt=4146413113, snd_una=4017429847
nw_read_request_report [C10] Receive failed with error "Operation timed out"
nw_flow_add_write_request [C10 192.168.000.0:443 failed parent-flow (satisfied (Path is satisfied), interface: en0[802.11], ipv4,
dns, uses wifi, LQM: good)] cannot accept write requests
nw_write_request_report [C10] Send failed with error "Socket is not connected"
Task <5BDBE621-329A-45E9-B236-9C173E92A41F>.<7> HTTP load failed, 361/0 bytes (error code: -1005 [4:-4])
Task <5BDBE621-329A-45E9-B236-9C173E92A41F>.<7> finished with error [-1005] Error Domain=NSURLErrorDomain Code=-1005 "The network
connection was lost." UserInfo={_kCFStreamErrorCodeKey=-4, NSUnderlyingError=0x13e632160 {Error Domain=kCFErrorDomainCFNetwork
Code=-1005 "(null)" UserInfo={NSErrorPeerAddressKey=<CFData 0x14cfe5a90 [0x201746068]>{length = 16, capacity = 16, bytes =
0x100201bbc0a86f010000000000000000}, _kCFStreamErrorCodeKey=-4, _kCFStreamErrorDomainKey=4}},
_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <5BDBE621-329A-45E9-B236-9C173E92A41F>.<7>,
_NSURLErrorRelatedURLSessionTaskErrorKey=(
"LocalDataTask <5BDBE621-329A-45E9-B236-9C173E92A41F>.<7>"
), NSLocalizedDescription=The network connection was lost., NSErrorFailingURLStringKey=https://192.168.000.0/keepalive,
NSErrorFailingURLKey=https://192.168.000.0/keepalive, _kCFStreamErrorDomainKey=4}
KeepAlive FAIL id=423F1336-6239-4B3B-9414-5A987D85D564 elapsed=29.203s status=-1
error=Optional(Alamofire.AFError.sessionTaskFailed(error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost."
UserInfo={_kCFStreamErrorCodeKey=-4, NSUnderlyingError=0x13e632160 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)"
UserInfo={NSErrorPeerAddressKey=<CFData 0x14cfe5a90 [0x201746068]>{length = 16, capacity = 16, bytes =
0x100201bbc0a86f010000000000000000}, _kCFStreamErrorCodeKey=-4, _kCFStreamErrorDomainKey=4}},
), NSLocalizedDescription=The network connection was lost.,
KeepAlive FAIL
1001 Log
KeepAlive SEND id=FC433405-C1F7-47EF-AF9E-D12E67B071FA at=2026-02-24T12:22:38Z timeout=60.000000s
current: D20-Q2-PLUS, ssid: VUEROID_D20-Q2-PLUS_136a63
KeepAlive FAIL id=FC433405-C1F7-47EF-AF9E-D12E67B071FA elapsed=7.834s status=-1
error=Optional(Alamofire.AFError.sessionTaskFailed(error: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out."
UserInfo={_kCFStreamErrorCodeKey=60, NSUnderlyingError=0x135e612f0 {Error Domain=kCFErrorDomainCFNetwork Code=-1001 "(null)"
UserInfo={_NSURLErrorNWPathKey=satisfied (Path is satisfied), viable, interface: en0[802.11], ipv4, dns, uses wifi, LQM: good,
_kCFStreamErrorCodeKey=60, _kCFStreamErrorDomainKey=1}},
), NSLocalizedDescription=The request timed out.,
NSErrorFailingURLKey=https://192.168.000.0/keepalive, _kCFStreamErrorDomainKey=1}))
KeepAlive FAIL ignored count=1 error=Server error : Optional(Alamofire.AFError.sessionTaskFailed(error: Error Domain=NSURLErrorDomain
Code=-1001 "The request timed out." UserInfo={_kCFStreamErrorCodeKey=60,
KeepAlive SEND id=A64AE4C0-28B4-41E3-AAC9-422C41D99D15 at=2026-02-24T12:22:58Z timeout=60.000000s
KeepAlive FAIL id=110B96DA-4D88-45E0-B8F7-D0A9798593AE elapsed=43.605s status=-1
error=Optional(Alamofire.AFError.sessionTaskFailed(error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost."
UserInfo={_kCFStreamErrorCodeKey=-4, NSUnderlyingError=0x135e60f60 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)"
UserInfo={NSErrorPeerAddressKey=<CFData 0x144dfee40 [0x201746068]>{length = 16, capacity = 16, bytes =
0x100201bbc0a86f010000000000000000}, _kCFStreamErrorCodeKey=-4, _kCFStreamErrorDomainKey=4}},
), NSLocalizedDescription=The network connection was lost., NSErrorFailingURLStringKey=https://192.168.000.0/keepalive,
NSErrorFailingURLKey=https://192.168.000.0/keepalive, _kCFStreamErrorDomainKey=4}))
KeepAlive FAIL ignored count=2 error=Server error : Optional(Alamofire.AFError.sessionTaskFailed(error: Error Domain=NSURLErrorDomain
Code=-1005 "The network connection was lost." UserInfo={_kCFStreamErrorCodeKey=-4, NSUnderlyingError=0x135e60f60 {Error
Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo={NSErrorPeerAddressKey=<CFData 0x144dfee40 [0x201746068]>{length = 16,
capacity = 16, bytes = 0x100201bbc0a86f010000000000000000}, _kCFStreamErrorCodeKey=-4, _kCFStreamErrorDomainKey=4}},
Network type changed, hasWiFiInterface :false
We are sending a keepalive request every 30 seconds to maintain the connection state with the device. Most of the issues occur during this keepalive process, and this is when the logs mentioned earlier are generated.
Based on our debugging so far, the keepalive function itself is being called as expected. However, the execution appears to stall while waiting for a response from the device. After remaining in that state for some time, the session eventually ends with either a timeout or a connection loss error.
We are use almofire 4.0.1.
According to the firmware developer, when this issue occurs, there are no corresponding values or logs received on the device side.
Therefore, we are currently investigating whether this might be related to a networking issue on the iPhone side.
All other features are functioning normally. The problem occurs only when downloading VOD video files, and the reproduction rate is 100% under that condition.
I’m using Network Framework with UDP and calling:
connection.receive(minimumIncompleteLength: 1,
maximumLength: 1500) { data, context, isComplete, error in
... // Some Logic
}
Is it possible for this completion handler to be called with data==nil if I haven't received any kind of error, i.e., error==nil and the connection is still in the .ready state?
Hello team,
I am trying to find out a way to block urls in the chrome browser if it is found in local blocked list cache. I found URL Filter Network very much suitable for my requirement. But I see at multiple places that this solution is only for Enterprise level or MDM or supervised device. So can I run this for normal user ? as my targeting audience would be bank users. One more thing how can I test this in development environment if we need supervised devices and do we need special entitlement ?
When trying to run sample project in the simulator then getting below error