Hi Dev Forums and Quinn "The Eskimo!",
Short version
Is there sample NWConnection code available that behaves in a similar way to the higher level URLSession and URLRequest APIs?
Long version
I have not been able to make this question get past the "sensitive language filter" on the dev forums. I figured it might be 'fool' or 'heck', or the X link, but removing each of those still triggers the sensitive language filter.
Please see this gist:
https://gist.github.com/lzell/8672c26ecb6ee1bb26d3aa3c7d67dd62
Thank you!
Lou Zell
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
We've observed intermittent crashes in our production environment, pls help to take a look at this, thx
Hi everyone,
I'm developing an enterprise iOS application and need to access the WiFi connection channel. I understand that Apple's privacy and security policies restrict direct access to certain network details, including the WiFi connection channel.
After some research, I found that this data might be accessible via the private API MobileWiFi.framework. However, when I tried to use this framework, I encountered the following error:
Missing com.apple.wifi.manager-access entitlement
I reached out to Apple regarding this entitlement, but they were not familiar with it, suggesting it might be deprecated.
Here are my questions:
Is there an official or supported way to access the WiFi connection channel in an enterprise iOS app?
If not, is there any workaround or additional steps required to use the MobileWiFi.framework without encountering the entitlement error?
Are there any specific entitlements or provisioning profile configurations that I need to be aware of to resolve this issue?
Any guidance or suggestions would be greatly appreciated. Thank you!
My laptop (M1 Pro, macOS 15.3.2) is connected to a dual stack network via Wi-Fi. The home.arpa. domain is supplied as a search domain via both DHCPv4 (options 15 and 119) and DHCPv6 (option 24). "Details…" for the network connection in System Settings show this domain under the DNS tab.
The laptop uses a Forwarding DNS Resolver of my router, which in turn forwards requests for home.arpa. (including subdomains) to a local DNS server (CoreDNS) which is authoritative for this zone.
The DNS server is configured via the following zone file:
$ORIGIN home.arpa.
$TTL 3600
@ IN SOA @ nobody.invalid. (1 3600 1200 604800 3600)
@ NS @
@ AAAA ….1
gateway A ….1
gateway AAAA …::1
b._dns-sd._udp PTR @
lb._dns-sd._udp PTR @
db._dns-sd._udp PTR @
_services._dns-sd._udp PTR _smb._tcp
_smb._tcp PTR Media._smb._tcp
Media._smb._tcp SRV 0 0 445 gateway
Media._smb._tcp TXT ("path=/media" "u=guest")
Output of dig(1) looks like:
$ dig @….1 -t PTR lb._dns-sd._udp.home.arpa.
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43291
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;lb._dns-sd._udp.home.arpa. IN PTR
;; ANSWER SECTION:
lb._dns-sd._udp.home.arpa. 1993 IN PTR home.arpa.
;; AUTHORITY SECTION:
home.arpa. 2771 IN NS home.arpa.
$ dig @….1 -t PTR _services._dns-sd._udp.home.arpa.
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9057
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;_services._dns-sd._udp.home.arpa. IN PTR
;; ANSWER SECTION:
_services._dns-sd._udp.home.arpa. 3600 IN PTR _smb._tcp.home.arpa.
;; AUTHORITY SECTION:
home.arpa. 3600 IN NS home.arpa.
$ dig @….1 -t PTR _smb._tcp.home.arpa.
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44220
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;_smb._tcp.home.arpa. IN PTR
;; ANSWER SECTION:
_smb._tcp.home.arpa. 3599 IN PTR Media._smb._tcp.home.arpa.
;; AUTHORITY SECTION:
home.arpa. 3599 IN NS home.arpa.
$ dig @….1 -t SRV Media._smb._tcp.home.arpa.
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45878
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;Media._smb._tcp.home.arpa. IN SRV
;; ANSWER SECTION:
media._smb._tcp.home.arpa. 3600 IN SRV 0 0 445 gateway.home.arpa.
;; AUTHORITY SECTION:
home.arpa. 3600 IN NS home.arpa.
$ dig @….1 -t A gateway.home.arpa.
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2782
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;gateway.home.arpa. IN A
;; ANSWER SECTION:
gateway.home.arpa. 86400 IN A 192.168.99.1
;; AUTHORITY SECTION:
home.arpa. 3578 IN NS home.arpa.
$ dig @….1 -t AAAA gateway.home.arpa.
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17297
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;gateway.home.arpa. IN AAAA
;; ANSWER SECTION:
gateway.home.arpa. 3600 IN AAAA fd6f:9784:5753::1
;; AUTHORITY SECTION:
home.arpa. 3600 IN NS home.arpa.
Output of dns-sd(1):
/usr/bin/dns-sd -test
…
Testing for error returns when various strings are > 63 bytes: PASSED
Running basic API input range tests with various pointer parameters set to NULL:
Basic API input range tests: PASSED
$ dns-sd -m -F
Looking for recommended browsing domains:
DATE: ---Fri 11 Apr 2025---
8:50:17.846 ...STARTING...
Timestamp Recommended Browsing domain
8:50:17.847 Added (More) local
8:50:17.847 Added arpa
- > home
$ dns-sd -B _smb._tcp home.arpa.
Browsing for _smb._tcp.home.arpa.
DATE: ---Fri 11 Apr 2025---
8:59:10.044 ...STARTING...
$ dns-sd -L Media _smb._tcp home.arpa.
Lookup Media._smb._tcp.home.arpa.
DATE: ---Fri 11 Apr 2025---
9:15:53.328 ...STARTING...
$ dns-sd -Q _smb._tcp.home.arpa. PTR IN
DATE: ---Fri 11 Apr 2025---
9:16:52.208 ...STARTING...
Timestamp A/R Flags IF Name Type Class Rdata
9:16:52.210 Add 40000002 0 _smb._tcp.home.arpa. PTR IN 0.0.0.0 No Such Record
9:16:52.222 Add 2 0 _smb._tcp.home.arpa. PTR IN 0.0.0.0 No Such Record
Similarly, when I open Finder->Network I see home.arpa but it's empty. Of interest is that on the DNS server side I see the following requests being made:
2025-04-11 09:03:15 container,info,debug [INFO] […]:56541 - 21555 "SOA IN _afpovertcp._tcp.home.arpa. udp 44 false 512" NXDOMAIN qr,aa,rd 112 0.000755089s
2025-04-11 09:03:15 container,info,debug [INFO] […]:56077 - 58266 "SOA IN _smb._tcp.home.arpa. udp 37 false 512" NOERROR qr,aa,rd 105 0.001012632s
2025-04-11 09:03:15 container,info,debug [INFO] […]:45274 - 45976 "SOA IN _rfb._tcp.home.arpa. udp 37 false 512" NXDOMAIN qr,aa,rd 105 0.000762339s
2025-04-11 09:03:15 container,info,debug [INFO] […]:54387 - 32090 "SOA IN _adisk._tcp.home.arpa. udp 39 false 512" NXDOMAIN qr,aa,rd 107 0.001058132s
2025-04-11 09:03:15 container,info,debug [INFO] […]:35855 - 51155 "SOA IN _tcp.home.arpa. udp 32 false 512" NOERROR qr,aa,rd 100 0.000664963s
I suppose that an attempt to locate services is made but it's unsuccessful and I'm not sure why.
What further debugging can I attempt?
Hello! My app wants to disable VPN connection. I used the loadFromPreferencesWithCompletionHandler method of NEVPNManager for detection, but regardless of whether the VPN was actually connected or not, it kept returning NEVPNStatusInvalid. How should I handle this issue?
NEVPNManager *vpnManager = [NEVPNManager sharedManager];
[vpnManager loadFromPreferencesWithCompletionHandler:^(NSError * _Nullable error) {
if (error) {
return;
}
NEVPNStatus status = vpnManager.connection.status;
switch (status) {
case NEVPNStatusInvalid:
// kept returning NEVPNStatusInvalid
break;
case NEVPNStatusDisconnected:
break;
case NEVPNStatusConnecting:
break;
case NEVPNStatusConnected:
break;
case NEVPNStatusReasserting:
break;
case NEVPNStatusDisconnecting:
break;
default:
break;
}
}];
Title: Loss of Internet Connectivity on iOS Device When Packet Tunnel Crashes
Feedback ticket: https://feedbackassistant.apple.com/feedback/14162605
Product: iPhone 12
Version: iOS - 17.5.1
Configuration: NETunnelProviderManager Configuration
Description: We are developing an iOS VPN client and have configured our packet tunnel provider according to Apple's guidelines. The configuration is as follows:
includeAllNetworks = YES
excludeLocalNetworks = NO
enforceRoutes = NO
This setup works as expected when the VPN successfully connects. However, we encounter a blocker issue where the device loses internet connectivity if the packet tunnel crashes.
Steps to Reproduce:
Configure the NETunnelProviderManager with the above settings.
Connect the VPN, which successfully establishes a connection.
Verify that resources are accessible and internet connectivity is functional.
Packet tunnel to crash unexpectedly.Observe that the NE process (Packet Tunnel) restarts automatically, as expected and attempts to reconnect the VPN;
however, the device now lacks internet connectivity, preventing VPN reconnection.
Try accessing resources using Safari or any other internet-dependent app, resulting in an error indicating the device is not connected to the internet.
Actual Results: The device loses internet connectivity after the packet tunnel crashes and fails to regain it automatically, preventing the VPN from reconnecting.
Expected Results: The device should maintain internet connectivity or recover connectivity to allow the VPN to reconnect successfully after the packet tunnel process restarts.
Workaround - iPhone device needs a restart to regain internet connectivity .
I'm facing an issue where if a WiFi network is turned off and back on within a short time frame (2-4 seconds), iOS still shows the device as connected but does not send a new DHCP request. This causes a problem for my network device, which relies on the DHCP request to assign an IP address. Without the request, the device is unable to establish a socket connection properly.
Is there any way to force iOS to send a DHCP request immediately when reconnecting to the network in this scenario? Are there any known workarounds or configurations that might help ensure the DHCP process is re-triggered?
Any insights would be appreciated. Thanks!
Good day, this is a concept maybe newbie question… what would be the best approach to develop the real time app… what I want is to be able to connect one device to other one within the app, and for example, if the app has a draggable object, then if one user drags the object, the other user see the object moving in real time I his own device, maybe using a ghost mode when interacting… this way both users using the app can interact with the objects in real-time. It’s not a game, so there’s no score… could I use gamecenter? or multipeer connectivity over BT? Is there a native framework?
wich would be the easiest and less battery and system consuming approach someone could suggest?
thank you in advance….
Topic:
App & System Services
SubTopic:
Networking
We use Boost ***** (1.86.0) for WebSockets in an iOS application using a self-signed certificate.
The ***** WebSocket client works fine on iOS 18.1 and every other OS (Windows, Android, Linux, etc...) but not iOS 18.3.1 and possibly versions before 18.3.1 but later than iOS 18.1.
Has anyone else ran into this issue and how did you resolve?
What could have changed after iOS 18.1 that would prevent a WSS Websocket from connecting that works fine on iOS 18.1?
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?
Our app supports live streaming (RTSP, RTMP, WebRTC) functionality.
After updating to the 18.5 Developer Beta version, we’ve encountered an issue where streaming over LTE is not working for customers using SKT (SK Telecom) as their carrier.
Upon investigation, it seems that a similar issue might be occurring with a streaming service app called "SOOP."
I would appreciate it if you could share any information regarding this bug.
Thank you.
Hey there! I’ve got some exciting news about Apple’s virtio_net_hdr implementation on macOS 15.4. It’s making communication a lot smoother, with a noticeable improvement!
Now, I’d love to hear your thoughts on a couple of things. First, how do you think we can validate the populated values? And secondly, should we consider reusing populated values for the other endpoint, like the ‘flags’ field?
Your insights would be invaluable!
Hi
we want to use CONNECT-IP extension within the MASQUE protocol suite.
we want to be able to reroute ICMP packets from our machine and redirect them to our MASQUE proxy.
we want to avoid a creation of virtual interface or modifying the routing tables.
is it possible, if so, how can it be achieved.
thanks
I have written an App which extracts data, over WiFi, from an instrument that creates its own WiFi Hotspot.
The instrument provides no internet connection. The iPad version of this App is connects fine and is assigned an IP address by DHCP server running on a MicroChip RN171 wifi module.
iOS assigns an obscure IP address on a completely different subnet. I understand this is iOS' way of "Complaining" that is wasn't assigned an IP address.
Consequently in the case of the iPhone I am forced to manually assign an IP address for the iPhone, the mask and the gateway. Only then is the connection successful.
Anyone know why the iPhone won't talk DHCP to a WiFi module not connected to the internet? Are there perhaps some parameters that I need to adjust on either the iPhone or WiFi module?
Hi, I'm trying to setup a simple websocket connection from the project game template. Using NWWebSocket 0.5.4 or urlSession.webSocketTask on the client and Vapor on the server.
Haven't been able to connect since macOS ~14-15 with the same Xcode settings.
I can send HTTP routes but the websocket itself does not connect. The closest I've got is connect but then immediate disconnect. I know the websocket works with CLI.
Have plist allowing arbitrary loads and local networking. Also App Sandbox with network boxes checked in Debug mode.
The error I get is:
Error receiving: Error Domain=NSURLErrorDomain Code=-1011 "There was a bad response from the server." UserInfo={NSErrorFailingURLStringKey=http://localhost:8090/echo, NSErrorFailingURLKey=http://localhost:8090/echo, _NSURLErrorWebSocketHandshakeFailureReasonKey=5, NSLocalizedDescription=There was a bad response from the server.}
Failed to send message: Error Domain=NSURLErrorDomain Code=-1011 "There was a bad response from the server."
Thanks.
Topic:
App & System Services
SubTopic:
Networking
Hi there, I'm trying to build a MacOS VPN application from scratch. My VPN application is slightly from normal ones,
It will include an authentication token and underlying process information (pid, application path etc.) in each connection made to the VPN gateway. Consider it a poor man's zerotrust implementation.
NetworkExtension and PacketTunnel is a must, thus to retrieve process information via audit tokens.
However, I'm unable to find any working examples that can be built on MacOS 15.X. I tried to open an TSI case but didn't receive anything useful.
Anyone?
Does someone know how to debug ios app on mac designed for iPad?
i can debug on real iOS device but cant attach Tunnel to work for mac.
I've just watched Scott Herschel's WWDC 25 session "Use structured concurrency with Network framework" and I am more than overjoyed to see said framework offer these new features.
However, the documentation has not yet been updated (or it's not where I expect to find it) .. Is there more that I can read about the enhancements to the framework?
One specific question is whether the structured concurrency portion of the framework's enhancement is backward compatible to before "26"?
We require the following Network Extension entitlements without the -systemextension suffix:
packet-tunnel-provider
app-proxy-provider
Our application uses the legacy NetworkExtension framework, not the newer System Extensions.
Although our provisioning profile has been approved by Apple, the entitlements are still being suffixed automatically with -systemextension. Since our code is built on the legacy NetworkExtension framework, this causes VPN functionality to break.
Target platforms: macOS 14 & 15 (distributed outside the Mac App Store via a .pkg installer).
Is there a way to use the original (non-systemextension) entitlements in this setup?
Hello,
A quick background:
I am developing an App that receives a data stream from a device through its Wi-Fi network. The device itself is not connected to the internet, so the app won't be either.
Now, I am adding a new feature to the App that would require internet connection during the data stream. Consequently, my users would need to use their cellular data.
On later versions of iPhone, the phone would occasionally detect the lack of internet connection and asks the user via a pop-up if they want to use their cellular data. However, this behavior is not consistent.
So my question is- can we programmatically invoke this pop-up so the user can connect to the internet?
Or even better- can we program the App to use cellular data while still being connected to a Wi-Fi network?
Note:
I have seen mixed answers on the internet whether this is doable or not, and I know that users are able do it themselves by manually configuring their IP in their WiFi settings page, but I doubt this operation can be done through the App for security reasons.
Thanks!