Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Core/XMPPStream.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
**/
Expand Down
3 changes: 3 additions & 0 deletions Vendor/CocoaAsyncSocket/GCDAsyncSocket.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
23 changes: 19 additions & 4 deletions Vendor/CocoaAsyncSocket/GCDAsyncSocket.m
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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)
{
Expand Down