Skip to content

Commit 1c02a95

Browse files
authored
Replace SystemConfiguration with a more recent Apple provided network monitoring API. (#13091)
1 parent 901844a commit 1c02a95

File tree

6 files changed

+57
-38
lines changed

6 files changed

+57
-38
lines changed

FirebasePerformance.podspec

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ Firebase Performance library to measure performance of Mobile and Web Apps.
5858

5959
s.ios.framework = 'CoreTelephony'
6060
s.framework = 'QuartzCore'
61-
s.framework = 'SystemConfiguration'
6261
s.dependency 'FirebaseCore', '~> 10.5'
6362
s.dependency 'FirebaseInstallations', '~> 10.0'
6463
s.dependency 'FirebaseRemoteConfig', '~> 10.0'

FirebasePerformance/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Unreleased
22
- Fix Crash from InstrumentUploadTaskWithStreamedRequest (#12983).
3+
- Replace SystemConfiguration with a more available network monitoring API by Apple (#13079).
34

45
# 10.25.0
56
- [changed] Removed usages of user defaults API to eliminate required reason impact.

FirebasePerformance/Sources/AppActivity/FPRAppActivityTracker.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
#import "FirebasePerformance/Sources/Protogen/nanopb/perf_metric.nanopb.h"
1516
#import "FirebasePerformance/Sources/Public/FirebasePerformance/FIRTrace.h"
1617

1718
FOUNDATION_EXTERN NSString *__nonnull const kFPRAppStartTraceName;
@@ -50,6 +51,9 @@ NS_EXTENSION_UNAVAILABLE("Firebase Performance is not supported for extensions."
5051
/** Current running state of the application. */
5152
@property(nonatomic, readonly) FPRApplicationState applicationState;
5253

54+
/** Current network connection type of the application. */
55+
@property(nonatomic, readonly) firebase_perf_v1_NetworkConnectionInfo_NetworkType networkType;
56+
5357
/** Accesses the singleton instance.
5458
* @return Reference to the shared object if successful; <code>nil</code> if not.
5559
*/

FirebasePerformance/Sources/AppActivity/FPRAppActivityTracker.m

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#import "FirebasePerformance/Sources/AppActivity/FPRAppActivityTracker.h"
1616

1717
#import <Foundation/Foundation.h>
18+
#import <Network/Network.h>
1819
#import <UIKit/UIKit.h>
1920

2021
#import "FirebasePerformance/Sources/AppActivity/FPRSessionManager.h"
@@ -55,6 +56,15 @@ @interface FPRAppActivityTracker ()
5556
/** Current running state of the application. */
5657
@property(nonatomic, readwrite) FPRApplicationState applicationState;
5758

59+
/** Current network connection type of the application. */
60+
@property(nonatomic, readwrite) firebase_perf_v1_NetworkConnectionInfo_NetworkType networkType;
61+
62+
/** Network monitor object to track network movements. */
63+
@property(nonatomic, readwrite) nw_path_monitor_t monitor;
64+
65+
/** Queue used to track the network monitoring changes. */
66+
@property(nonatomic, readwrite) dispatch_queue_t monitorQueue;
67+
5868
/** Trace to measure the app start performance. */
5969
@property(nonatomic) FIRTrace *appStartTrace;
6070

@@ -122,9 +132,12 @@ + (instancetype)sharedInstance {
122132
*/
123133
- (instancetype)initAppActivityTracker {
124134
self = [super init];
125-
_applicationState = FPRApplicationStateUnknown;
126-
_appStartGaugeMetricDispatched = NO;
127-
_configurations = [FPRConfigurations sharedInstance];
135+
if (self != nil) {
136+
_applicationState = FPRApplicationStateUnknown;
137+
_appStartGaugeMetricDispatched = NO;
138+
_configurations = [FPRConfigurations sharedInstance];
139+
[self startTrackingNetwork];
140+
}
128141
return self;
129142
}
130143

@@ -147,6 +160,35 @@ - (FIRTrace *)activeTrace {
147160
return self.backgroundSessionTrace;
148161
}
149162

163+
- (void)startTrackingNetwork {
164+
self.networkType = firebase_perf_v1_NetworkConnectionInfo_NetworkType_NONE;
165+
166+
if (@available(iOS 12, tvOS 12, *)) {
167+
dispatch_queue_attr_t attrs = dispatch_queue_attr_make_with_qos_class(
168+
DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY, DISPATCH_QUEUE_PRIORITY_DEFAULT);
169+
self.monitorQueue = dispatch_queue_create("com.google.firebase.perf.network.monitor", attrs);
170+
171+
self.monitor = nw_path_monitor_create();
172+
nw_path_monitor_set_queue(self.monitor, self.monitorQueue);
173+
__weak FPRAppActivityTracker *weakSelf = self;
174+
nw_path_monitor_set_update_handler(self.monitor, ^(nw_path_t _Nonnull path) {
175+
BOOL isWiFi = nw_path_uses_interface_type(path, nw_interface_type_wifi);
176+
BOOL isCellular = nw_path_uses_interface_type(path, nw_interface_type_cellular);
177+
BOOL isEthernet = nw_path_uses_interface_type(path, nw_interface_type_wired);
178+
179+
if (isWiFi) {
180+
weakSelf.networkType = firebase_perf_v1_NetworkConnectionInfo_NetworkType_WIFI;
181+
} else if (isCellular) {
182+
weakSelf.networkType = firebase_perf_v1_NetworkConnectionInfo_NetworkType_MOBILE;
183+
} else if (isEthernet) {
184+
weakSelf.networkType = firebase_perf_v1_NetworkConnectionInfo_NetworkType_ETHERNET;
185+
}
186+
});
187+
188+
nw_path_monitor_start(self.monitor);
189+
}
190+
}
191+
150192
/**
151193
* Checks if the prewarming feature is available on the current device.
152194
*
@@ -286,6 +328,10 @@ - (void)appWillResignActiveNotification:(NSNotification *)notification {
286328
}
287329

288330
- (void)dealloc {
331+
if (@available(iOS 12, tvOS 12, *)) {
332+
nw_path_monitor_cancel(self.monitor);
333+
}
334+
289335
[[NSNotificationCenter defaultCenter] removeObserver:self
290336
name:UIApplicationDidBecomeActiveNotification
291337
object:[UIApplication sharedApplication]];

FirebasePerformance/Sources/FPRNanoPbUtils.m

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
#import <CoreTelephony/CTCarrier.h>
1919
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
2020
#endif
21-
#import <SystemConfiguration/SystemConfiguration.h>
2221

22+
#import "FirebasePerformance/Sources/AppActivity/FPRAppActivityTracker.h"
2323
#import "FirebasePerformance/Sources/Common/FPRConstants.h"
2424
#import "FirebasePerformance/Sources/FIRPerformance+Internal.h"
2525
#import "FirebasePerformance/Sources/FPRDataUtils.h"
@@ -34,7 +34,6 @@
3434

3535
static firebase_perf_v1_NetworkRequestMetric_HttpMethod FPRHTTPMethodForString(
3636
NSString *methodString);
37-
static firebase_perf_v1_NetworkConnectionInfo_NetworkType FPRNetworkConnectionInfoNetworkType(void);
3837
#ifdef TARGET_HAS_MOBILE_CONNECTIVITY
3938
static firebase_perf_v1_NetworkConnectionInfo_MobileSubtype FPRCellularNetworkType(void);
4039
#endif
@@ -72,36 +71,6 @@ static firebase_perf_v1_NetworkRequestMetric_HttpMethod FPRHTTPMethodForString(
7271
return HTTPMethod.intValue;
7372
}
7473

75-
/** Get the current network connection type in firebase_perf_v1_NetworkConnectionInfo_NetworkType
76-
* format.
77-
* @return Current network connection type.
78-
*/
79-
static firebase_perf_v1_NetworkConnectionInfo_NetworkType FPRNetworkConnectionInfoNetworkType(
80-
void) {
81-
firebase_perf_v1_NetworkConnectionInfo_NetworkType networkType =
82-
firebase_perf_v1_NetworkConnectionInfo_NetworkType_NONE;
83-
84-
static SCNetworkReachabilityRef reachabilityRef = 0;
85-
static dispatch_once_t onceToken;
86-
dispatch_once(&onceToken, ^{
87-
reachabilityRef = SCNetworkReachabilityCreateWithName(kCFAllocatorSystemDefault, "google.com");
88-
});
89-
90-
SCNetworkReachabilityFlags reachabilityFlags = 0;
91-
SCNetworkReachabilityGetFlags(reachabilityRef, &reachabilityFlags);
92-
93-
// Parse the network flags to set the network type.
94-
if (reachabilityFlags & kSCNetworkReachabilityFlagsReachable) {
95-
if (reachabilityFlags & kSCNetworkReachabilityFlagsIsWWAN) {
96-
networkType = firebase_perf_v1_NetworkConnectionInfo_NetworkType_MOBILE;
97-
} else {
98-
networkType = firebase_perf_v1_NetworkConnectionInfo_NetworkType_WIFI;
99-
}
100-
}
101-
102-
return networkType;
103-
}
104-
10574
#ifdef TARGET_HAS_MOBILE_CONNECTIVITY
10675
/** Get the current cellular network connection type in
10776
* firebase_perf_v1_NetworkConnectionInfo_MobileSubtype format.
@@ -233,7 +202,8 @@ firebase_perf_v1_ApplicationInfo FPRGetApplicationInfoMessage(void) {
233202
iosAppInfo.bundle_short_version =
234203
FPREncodeString([mainBundle infoDictionary][@"CFBundleShortVersionString"]);
235204
iosAppInfo.sdk_version = FPREncodeString([NSString stringWithUTF8String:kFPRSDKVersion]);
236-
iosAppInfo.network_connection_info.network_type = FPRNetworkConnectionInfoNetworkType();
205+
iosAppInfo.network_connection_info.network_type =
206+
[FPRAppActivityTracker sharedInstance].networkType;
237207
iosAppInfo.has_network_connection_info = true;
238208
iosAppInfo.network_connection_info.has_network_type = true;
239209
#ifdef TARGET_HAS_MOBILE_CONNECTIVITY

Package.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -949,7 +949,6 @@ let package = Package(
949949
.define("FIRPerformance_LIB_VERSION", to: firebaseVersion),
950950
],
951951
linkerSettings: [
952-
.linkedFramework("SystemConfiguration", .when(platforms: [.iOS, .tvOS])),
953952
.linkedFramework("MobileCoreServices", .when(platforms: [.iOS, .tvOS])),
954953
.linkedFramework("QuartzCore", .when(platforms: [.iOS, .tvOS])),
955954
]

0 commit comments

Comments
 (0)