From b5d015b7d4e6a4feeb89f21cc82cfd6e1449ec4c Mon Sep 17 00:00:00 2001 From: Scott Corscadden Date: Tue, 11 Apr 2023 14:33:36 -0400 Subject: [PATCH 1/2] EXPERIMENTAL - maybe allows running chat in iOS 16! See: https://github.com/robbiehanson/CocoaAsyncSocket/pull/717/commits/037f4be5b08e54e3fa1b8de286f550354fc1cfed --- Core/XMPPStream.h | 2 +- Vendor/CocoaAsyncSocket/GCDAsyncSocket.h | 4 ++-- Vendor/CocoaAsyncSocket/GCDAsyncSocket.m | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Core/XMPPStream.h b/Core/XMPPStream.h index d4986aa730..d395840e87 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, the kCFStreamNetworkServiceTypeBackground 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..0e8d229405 100644 --- a/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h +++ b/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h @@ -948,8 +948,8 @@ typedef enum GCDAsyncSocketError GCDAsyncSocketError; * Configures the socket to allow it to operate when the iOS application has been backgrounded. * In other words, this method creates a read & write stream, and invokes: * - * CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - * CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); + * 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..a4334752d2 100644 --- a/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m +++ b/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m @@ -2334,7 +2334,7 @@ - (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 kCFStreamNetworkServiceTypeBackground flag, 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. @@ -7406,8 +7406,8 @@ - (BOOL)enableBackgroundingOnSocketWithCaveat:(BOOL)caveat LogVerbose(@"Enabling backgrouding on socket"); - r1 = CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - r2 = CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); + r1 = CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeBackground); + r2 = CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeBackground); if (!r1 || !r2) { From 9b8f53d8a0d7b0afca6cd80eb9d30e0a6d8e7546 Mon Sep 17 00:00:00 2001 From: Scott Corscadden Date: Tue, 11 Apr 2023 15:51:04 -0400 Subject: [PATCH 2/2] More portable fix for using kCFStreamNetworkServiceTypeBackground Now, only does so for iOS, and 16.0+. Documentation also updated. --- Core/XMPPStream.h | 2 +- Vendor/CocoaAsyncSocket/GCDAsyncSocket.h | 3 +++ Vendor/CocoaAsyncSocket/GCDAsyncSocket.m | 23 +++++++++++++++++++---- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Core/XMPPStream.h b/Core/XMPPStream.h index d395840e87..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 kCFStreamNetworkServiceTypeBackground 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 0e8d229405..78ffa4d7c7 100644 --- a/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h +++ b/Vendor/CocoaAsyncSocket/GCDAsyncSocket.h @@ -948,6 +948,9 @@ typedef enum GCDAsyncSocketError GCDAsyncSocketError; * Configures the socket to allow it to operate when the iOS application has been backgrounded. * In other words, this method creates a read & write stream, and invokes: * + * 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); * diff --git a/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m b/Vendor/CocoaAsyncSocket/GCDAsyncSocket.m index a4334752d2..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 kCFStreamNetworkServiceTypeBackground 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, kCFStreamNetworkServiceTypeBackground); - r2 = CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeBackground); + +#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) {