Minimize radio power (conserve battery life) for long running NWConnection task

I am writing an application that will, on the high end, have a screen-on time of > 1 hour. While the app is in use, it will need to send a heartbeat to a server via an open socket every so many seconds (usually a value between 4s and 29s), as shown below.

connection = NWConnection(host: .init(combinedAddress), port: .init(integerLiteral: port), using: .tcp)
        if let ipOptions = connection.parameters.defaultProtocolStack.internetProtocol as? NWProtocolIP.Options {
            ipOptions.version = .v4
        }
        connection.parameters.preferNoProxies = true
        DispatchQueue.global(qos: .default).async  {
            self.heartbeatTimer = Timer.scheduledTimer(withTimeInterval: self.getHeartbeatInterval(), repeats: true, block: { _ in
                self.sendHeartbeat()    // eventually connection.send("heartbeat data... ", completion: {...} )
            })
            RunLoop.current.run()
        }

During periods of less user interaction, the only data going across the network will be the heartbeat. According to this page, there's a periods of high power network activity, followed by another less energy intensive period, before the energy draw drops back down to baseline levels.

I have slight control over the heartbeat interval, and if X seconds keeps the radio at full power and Y seconds can give my users a Y-X second period of lower energy state, I can increase the time between heartbeats and take advantage of the lower power state to prevent the battery from getting hammered.

Is there a document that will provide times for the values shown in the graph, or otherwise provide guidance on how long network requests can/should be delayed for an optimized battery life?

Thank you in advance.

Note: This should all happen via Wifi, and for various reasons there's no need to take cellular modems into account.

Post not yet marked as solved Up vote post of hoffmand5 Down vote post of hoffmand5
83 views