diff --git a/Core/XMPPStream.h b/Core/XMPPStream.h index d4986aa730..47f0fbff0f 100755 --- a/Core/XMPPStream.h +++ b/Core/XMPPStream.h @@ -264,7 +264,7 @@ extern const NSTimeInterval XMPPStreamTimeoutNone; #if TARGET_OS_IPHONE /** - * If set, the kCFStreamNetworkServiceTypeVoIP flags will be set on the underlying CFRead/Write streams. + * If set, kCFStreamNetworkServiceTypeVoIP (or kCFStreamNetworkServiceTypeBackground for iOS 16+) flags will be set on the underlying CFRead/Write streams. * * The default value is NO. **/ diff --git a/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h b/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h index 374bcdd89d..78ffa4d7c7 100644 --- a/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h +++ b/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h @@ -950,6 +950,9 @@ typedef enum GCDAsyncSocketError GCDAsyncSocketError; * * CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); * CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); + * If the target device is iOS and is version 16+, these will be invoked instead: + * CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeBackground); + * CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeBackground); * * Returns YES if successful, NO otherwise. * diff --git a/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m b/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m index 531a29d86c..2ef30c007a 100644 --- a/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m +++ b/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m @@ -2334,7 +2334,8 @@ - (void)didConnect:(int)aStateIndex // // Note: // There may be configuration options that must be set by the delegate before opening the streams. - // The primary example is the kCFStreamNetworkServiceTypeVoIP flag, which only works on an unopened stream. + // The primary example is the kCFStreamNetworkServiceTypeVoIP / kCFStreamNetworkServiceTypeBackground flags, + // which only works on an unopened stream. // // Thus we wait until after the socket:didConnectToHost:port: delegate method has completed. // This gives the delegate time to properly configure the streams if needed. @@ -7405,9 +7406,23 @@ - (BOOL)enableBackgroundingOnSocketWithCaveat:(BOOL)caveat BOOL r1, r2; LogVerbose(@"Enabling backgrouding on socket"); - - r1 = CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - r2 = CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + CFTypeRef networkType = kCFStreamNetworkServiceTypeVoIP; +#pragma clang diagnostic pop + +#if TARGET_OS_IPHONE + // ONLY if we are 16+, can't use kCFStreamNetworkServiceTypeVoIP or app is shot in debug mode, and does not do + // chat at all in release mode. + NSComparisonResult myDeviceTo16 = [[UIDevice currentDevice].systemVersion compare:@"16.0" options:NSNumericSearch]; + if (myDeviceTo16 == NSOrderedSame || myDeviceTo16 == NSOrderedDescending) + { + networkType = kCFStreamNetworkServiceTypeBackground; + } +#endif + r1 = CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, networkType); + r2 = CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, networkType); if (!r1 || !r2) {