How to listen for QUIC connections using the new NetworkListener in iOS 26?

I was excited about the new APIs added to Network.framework in iOS 26 that offer structure concurrency support out of the box and a more modern API design in general.

However I have been unable to use them to create a device-to-device QUIC connection. The blocker I ran into is that NetworkListener's run method requires the network protocol to conform to OneToOneProtocol, whereas QUIC conforms to MultiplexProtocol. And there doesn't seem to be any way to accept an incoming MultiplexProtocol connection? Nor does it seem possible to turn a UDP connection into a QUIC connection using NetworkConnection.prependProtocols() as that also only works for network protocols conforming to OneToOneProtocol.

I suspect this is an accidental omission in the API design (?), and already filed a Feedback (FB18620438).

But maybe I am missing something and there is a workaround or a different way to listen for incoming QUIC connections using the new NetworkListener?

QUIC.TLS has methods peerAuthenticationRequired(Bool) and peerAuthenticationOptional(Bool), which makes me think that peer to peer QUIC connections are intended to be supported?

I would also love to see documentation for those methods. For example I wonder what exact effect peerAuthenticationRequired(false) and peerAuthenticationOptional(false) would have and how they differ.

Answered by DTS Engineer in 847765022

For the moment I recommend that you hold on on trying to use QUIC with the new Network framework API that we introduced at WWDC 2025. The relationship between that API and multiplexed protocols is still evolving.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

For the moment I recommend that you hold on on trying to use QUIC with the new Network framework API that we introduced at WWDC 2025. The relationship between that API and multiplexed protocols is still evolving.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Thank you Quinn! Good to know that it is still incomplete, but that this is known and (presumably) being worked on.

@DTS Engineer I was hoping the evolution of the relationship of QUIC and the new API you mentioned would happen during the 26 beta period. But at this point it seems that it will be impossible to receive QUIC connections using the new APIs in iOS/iPadOS 26 and I'll likely have to wait another year or hope for changes in a dot release? As far as I can tell there have been no changes to the API in this respect as of beta 6, correct?

I can reproduce the problem you’re seeing using Xcode 26.0b5 [1].

I had a look at our internal info about this and the run(…) method is the expected way to run a QUIC listener, so I’m not sure what’s going on. I’ve asked about it internally and I’ll update this thread when I know more.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

[1] While our OS releases are at 26.0b6, the current Xcode is still 26.0b5.

the run(…) method is the expected way to run a QUIC listener

This should work, but the fix missed the Xcode 26.0b5 bus (r. 155089395)-: I recommend that you continue to retest this as we seed new versions of Xcode 26 beta.

Share and Enjoy

Quinn “The Eskimo!” @ Developer Technical Support @ Apple
let myEmail = "eskimo" + "1" + "@" + "apple.com"

Thanks so much for looking into this and reporting back! I see run(...) now supports multicast protocols in Xcode Beta 6. Yay!

The new beta also addressed my questions about peerAuthenticationRequired(false) and peerAuthenticationOptional(false) in my initial post as these APIs were replaced with the much more sensible peerAuthentication(...) API which takes options .none, .optional and .required.

How to listen for QUIC connections using the new NetworkListener in iOS 26?
 
 
Q