Skip to content

Commit f78ce05

Browse files
authored
Make NetworkUtility a singleton (#10)
* Make NetworkUtility as singleton - Improves Reachability performance for connection type * Enable MacCatalyst for Demo * Use Integer instead of Double * Replace deprecated method * Exclude some CoreTelephony features from MacCatalyst * Add some Swift Lint excludes
1 parent 04459bd commit f78ce05

File tree

8 files changed

+72
-44
lines changed

8 files changed

+72
-44
lines changed

Dev/iOSAgentExample.xcodeproj/project.pbxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
72109EBF23E178EC00441D87 /* iosAgent */ = {isa = PBXFileReference; lastKnownFileType = folder; name = iosAgent; path = ..; sourceTree = "<group>"; };
3838
7247F62523E200970064CA8D /* Webserver.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Webserver.swift; path = ../../tools/Webserver/Webserver.swift; sourceTree = "<group>"; };
3939
728CF9DB2387F01200BEE2F9 /* iOSAgentExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iOSAgentExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
40+
72B5BA7A249A98BD00B7F261 /* iOSAgentExample.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = iOSAgentExample.entitlements; sourceTree = "<group>"; };
4041
72C7A9D723E049FF00041782 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
4142
72C7A9D823E049FF00041782 /* JSONViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONViewController.swift; sourceTree = "<group>"; };
4243
72C7A9D923E049FF00041782 /* Icon.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Icon.xcassets; sourceTree = "<group>"; };
@@ -103,6 +104,7 @@
103104
72C7A9D623E049FF00041782 /* iOSAgentExample */ = {
104105
isa = PBXGroup;
105106
children = (
107+
72B5BA7A249A98BD00B7F261 /* iOSAgentExample.entitlements */,
106108
72C7A9D723E049FF00041782 /* ViewController.swift */,
107109
72C7A9D823E049FF00041782 /* JSONViewController.swift */,
108110
72C7A9D923E049FF00041782 /* Icon.xcassets */,
@@ -471,6 +473,7 @@
471473
buildSettings = {
472474
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
473475
BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
476+
CODE_SIGN_ENTITLEMENTS = iOSAgentExample/iOSAgentExample.entitlements;
474477
CODE_SIGN_IDENTITY = "Apple Development";
475478
CODE_SIGN_STYLE = Automatic;
476479
CURRENT_PROJECT_VERSION = 1578416283;
@@ -484,6 +487,7 @@
484487
PRODUCT_BUNDLE_IDENTIFIER = net.tapwork.instana.sdkexample;
485488
PRODUCT_NAME = "$(TARGET_NAME)";
486489
PROVISIONING_PROFILE_SPECIFIER = "";
490+
SUPPORTS_MACCATALYST = YES;
487491
SWIFT_VERSION = 5.0;
488492
TARGETED_DEVICE_FAMILY = "1,2";
489493
};
@@ -494,6 +498,7 @@
494498
buildSettings = {
495499
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
496500
BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
501+
CODE_SIGN_ENTITLEMENTS = iOSAgentExample/iOSAgentExample.entitlements;
497502
CODE_SIGN_IDENTITY = "iPhone Distribution";
498503
CODE_SIGN_STYLE = Manual;
499504
CURRENT_PROJECT_VERSION = 1578416283;
@@ -507,6 +512,7 @@
507512
PRODUCT_BUNDLE_IDENTIFIER = net.tapwork.instana.sdkexample;
508513
PRODUCT_NAME = "$(TARGET_NAME)";
509514
PROVISIONING_PROFILE_SPECIFIER = "Instana Demo Project";
515+
SUPPORTS_MACCATALYST = YES;
510516
SWIFT_VERSION = 5.0;
511517
TARGETED_DEVICE_FAMILY = "1,2";
512518
};

Dev/iOSAgentExample/ImageViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class ImageViewViewController: UIViewController {
3232
override func viewDidAppear(_ animated: Bool) {
3333
super.viewDidAppear(animated)
3434
Instana.setView(name: "ImageView")
35-
Instana.reportEvent(name: "Custom Event", duration: 1001, backendTracingID: nil, error: NSError(domain: "Domain", code: 0, userInfo: nil), meta: ["Key": "Val"], viewName:"Image")
35+
Instana.reportEvent(name: "Custom Event", duration: "1001", backendTracingID: nil, error: NSError(domain: "Domain", code: 0, userInfo: nil), meta: ["Key": "Val"], viewName:"Image")
3636
}
3737

3838
@objc func downloadImage() {
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>com.apple.security.app-sandbox</key>
6+
<true/>
7+
<key>com.apple.security.network.client</key>
8+
<true/>
9+
</dict>
10+
</plist>

Sources/InstanaAgent/Beacons/Reporter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public class Reporter {
2828

2929
init(_ session: InstanaSession,
3030
batterySafeForNetworking: @escaping () -> Bool = { InstanaSystemUtils.battery.safeForNetworking },
31-
networkUtility: NetworkUtility = NetworkUtility(),
31+
networkUtility: NetworkUtility = NetworkUtility.shared,
3232
queue: InstanaPersistableQueue<CoreBeacon>? = nil,
3333
send: @escaping NetworkLoader = InstanaNetworking().send(request:completion:)) {
3434
self.networkUtility = networkUtility

Sources/InstanaAgent/Monitors/HTTP/HTTPMarker.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,9 @@ extension HTTPMarker {
155155

156156
internal convenience init(_ response: URLResponse) {
157157
var headerBytes: Instana.Types.Bytes = 0
158-
if let headerFields = (response as? HTTPURLResponse)?.allHeaderFields {
159-
headerBytes = Instana.Types.Bytes(NSKeyedArchiver.archivedData(withRootObject: headerFields).count)
158+
if let headerFields = (response as? HTTPURLResponse)?.allHeaderFields,
159+
let data = try? NSKeyedArchiver.archivedData(withRootObject: headerFields, requiringSecureCoding: false) {
160+
headerBytes = Instana.Types.Bytes(data.count)
160161
}
161162
self.init(header: headerBytes, body: response.expectedContentLength, bodyAfterDecoding: 0)
162163
}

Sources/InstanaAgent/Utils/InstanaSystemUtils.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class InstanaSystemUtils {
1616
return identifier
1717
}()
1818

19-
static var networkUtility = { NetworkUtility() }()
19+
static var networkUtility = { NetworkUtility.shared }()
2020

2121
/// Returns iOS version (for ex. "12.1")
2222
static var systemVersion: String = { UIDevice.current.systemVersion }()

Sources/InstanaAgent/Utils/NetworkUtility.swift renamed to Sources/InstanaAgent/Utils/Networking/NetworkUtility.swift

Lines changed: 47 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ class NetworkUtility {
1111
}
1212

1313
var connectionUpdateHandler: (ConnectionType) -> Void = { _ in }
14-
1514
private let reachability: Reachability?
1615

16+
static let shared = NetworkUtility()
17+
1718
init(reachability: Reachability? = nil) {
1819
let reachability = reachability ?? (try? Reachability())
1920
self.reachability = reachability
@@ -37,6 +38,19 @@ class NetworkUtility {
3738
}
3839

3940
extension NetworkUtility {
41+
enum ConnectionType: String, CustomStringConvertible {
42+
case undetermined, none, wifi, cellular
43+
var cellular: CellularType { CellularType.current }
44+
var description: String {
45+
switch self {
46+
case .none: return "None"
47+
case .wifi: return "Wifi"
48+
case .cellular: return CellularType.current.rawValue
49+
case .undetermined: return "Unknown"
50+
}
51+
}
52+
}
53+
4054
enum CellularType: String {
4155
case none, twoG, threeG, fourG, unknown
4256
var rawValue: String {
@@ -50,53 +64,48 @@ extension NetworkUtility {
5064
}
5165

5266
var carrierName: String {
67+
var name = "None"
5368
if ProcessInfo.isRunningDebugSessionSimulator {
54-
return "Simulator"
69+
name = "Simulator"
5570
} else {
56-
let networkInfo = CTTelephonyNetworkInfo()
57-
let carrier = networkInfo.subscriberCellularProvider
58-
return carrier?.carrierName ?? "None"
71+
#if os(iOS) && !targetEnvironment(macCatalyst)
72+
let networkInfo = CTTelephonyNetworkInfo()
73+
let carrier = networkInfo.subscriberCellularProvider
74+
name = carrier?.carrierName ?? name
75+
#endif
5976
}
77+
return name
6078
}
6179

6280
static var current: CellularType {
6381
if ProcessInfo.isRunningDebugSessionSimulator {
6482
return .none
6583
} else {
66-
guard let radioAccessTechnology = CTTelephonyNetworkInfo().currentRadioAccessTechnology else {
84+
#if os(iOS) && !targetEnvironment(macCatalyst)
85+
guard let radioAccessTechnology = CTTelephonyNetworkInfo().currentRadioAccessTechnology else {
86+
return .none
87+
}
88+
switch radioAccessTechnology {
89+
case CTRadioAccessTechnologyGPRS,
90+
CTRadioAccessTechnologyEdge,
91+
CTRadioAccessTechnologyCDMA1x:
92+
return .twoG
93+
case CTRadioAccessTechnologyWCDMA,
94+
CTRadioAccessTechnologyHSDPA,
95+
CTRadioAccessTechnologyHSUPA,
96+
CTRadioAccessTechnologyCDMAEVDORev0,
97+
CTRadioAccessTechnologyCDMAEVDORevA,
98+
CTRadioAccessTechnologyCDMAEVDORevB,
99+
CTRadioAccessTechnologyeHRPD:
100+
return .threeG
101+
case CTRadioAccessTechnologyLTE:
102+
return .fourG
103+
default:
104+
return .unknown
105+
}
106+
#else
67107
return .none
68-
}
69-
switch radioAccessTechnology {
70-
case CTRadioAccessTechnologyGPRS,
71-
CTRadioAccessTechnologyEdge,
72-
CTRadioAccessTechnologyCDMA1x:
73-
return .twoG
74-
case CTRadioAccessTechnologyWCDMA,
75-
CTRadioAccessTechnologyHSDPA,
76-
CTRadioAccessTechnologyHSUPA,
77-
CTRadioAccessTechnologyCDMAEVDORev0,
78-
CTRadioAccessTechnologyCDMAEVDORevA,
79-
CTRadioAccessTechnologyCDMAEVDORevB,
80-
CTRadioAccessTechnologyeHRPD:
81-
return .threeG
82-
case CTRadioAccessTechnologyLTE:
83-
return .fourG
84-
default:
85-
return .unknown
86-
}
87-
}
88-
}
89-
}
90-
91-
enum ConnectionType: String, CustomStringConvertible {
92-
case undetermined, none, wifi, cellular
93-
var cellular: CellularType { CellularType.current }
94-
var description: String {
95-
switch self {
96-
case .none: return "None"
97-
case .wifi: return "Wifi"
98-
case .cellular: return CellularType.current.rawValue
99-
case .undetermined: return "Unknown"
108+
#endif
100109
}
101110
}
102111
}

Sources/InstanaAgent/Utils/Reachability.swift renamed to Sources/InstanaAgent/Utils/Networking/Reachability.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public enum ReachabilityError: Error {
3737
}
3838

3939
@available(*, unavailable, renamed: "Notification.Name.reachabilityChanged")
40-
public let ReachabilityChangedNotification = NSNotification.Name("ReachabilityChangedNotification")
40+
public let reachabilityChangedNotification = NSNotification.Name("ReachabilityChangedNotification")
4141

4242
public extension Notification.Name {
4343
static let reachabilityChanged = Notification.Name("reachabilityChanged")
@@ -277,6 +277,8 @@ private extension Reachability {
277277
}
278278
}
279279

280+
// swiftlint:disable identifier_name
281+
280282
extension SCNetworkReachabilityFlags {
281283
typealias Connection = Reachability.Connection
282284

0 commit comments

Comments
 (0)