iOS: keep app alive in background

This commit is contained in:
Jonas Bark
2026-02-06 12:51:47 +01:00
parent d8ceea9c63
commit 497528c75b
8 changed files with 67 additions and 4 deletions

BIN
assets/silence.mp3 Normal file

Binary file not shown.

View File

@@ -1,4 +1,6 @@
PODS:
- audio_session (0.0.1):
- Flutter
- bluetooth_low_energy_darwin (0.0.1):
- Flutter
- FlutterMacOS
@@ -25,6 +27,9 @@ PODS:
- Flutter
- ios_receipt (0.0.1):
- Flutter
- just_audio (0.0.1):
- Flutter
- FlutterMacOS
- media_key_detector_ios (0.0.1):
- Flutter
- nsd_ios (0.0.1):
@@ -63,6 +68,7 @@ PODS:
- Flutter
DEPENDENCIES:
- audio_session (from `.symlinks/plugins/audio_session/ios`)
- bluetooth_low_energy_darwin (from `.symlinks/plugins/bluetooth_low_energy_darwin/darwin`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- Flutter (from `Flutter`)
@@ -75,6 +81,7 @@ DEPENDENCIES:
- in_app_review (from `.symlinks/plugins/in_app_review/ios`)
- integration_test (from `.symlinks/plugins/integration_test/ios`)
- ios_receipt (from `.symlinks/plugins/ios_receipt/ios`)
- just_audio (from `.symlinks/plugins/just_audio/darwin`)
- media_key_detector_ios (from `.symlinks/plugins/media_key_detector_ios/ios`)
- nsd_ios (from `.symlinks/plugins/nsd_ios/ios`)
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
@@ -96,6 +103,8 @@ SPEC REPOS:
- RevenueCatUI
EXTERNAL SOURCES:
audio_session:
:path: ".symlinks/plugins/audio_session/ios"
bluetooth_low_energy_darwin:
:path: ".symlinks/plugins/bluetooth_low_energy_darwin/darwin"
device_info_plus:
@@ -120,6 +129,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/integration_test/ios"
ios_receipt:
:path: ".symlinks/plugins/ios_receipt/ios"
just_audio:
:path: ".symlinks/plugins/just_audio/darwin"
media_key_detector_ios:
:path: ".symlinks/plugins/media_key_detector_ios/ios"
nsd_ios:
@@ -146,6 +157,7 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/wakelock_plus/ios"
SPEC CHECKSUMS:
audio_session: 19e9480dbdd4e5f6c4543826b2e8b0e4ab6145fe
bluetooth_low_energy_darwin: 50bc79258e60586e4c4bed5948bd31d925f37fac
device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
@@ -158,6 +170,7 @@ SPEC CHECKSUMS:
in_app_review: 436034b18594851a7328d7f1c2ed5ec235b79cfc
integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573
ios_receipt: c2d5b4c36953c377a024992393976214ce6951e6
just_audio: a42c63806f16995daf5b219ae1d679deb76e6a79
media_key_detector_ios: 7ff9aefdfea00bb7b71e184132381b7d0e7e1269
nsd_ios: 8c37babdc6538e3350dbed3a52674d2edde98173
package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4

View File

@@ -2,7 +2,6 @@ import 'dart:convert';
import 'dart:io';
import 'package:bike_control/bluetooth/devices/trainer_connection.dart';
import 'package:prop/prop.dart';
import 'package:bike_control/bluetooth/messages/notification.dart';
import 'package:bike_control/gen/l10n.dart';
import 'package:bike_control/utils/actions/base_actions.dart';
@@ -11,6 +10,7 @@ import 'package:bike_control/utils/keymap/buttons.dart';
import 'package:bike_control/utils/keymap/keymap.dart';
import 'package:bike_control/utils/requirements/multi.dart';
import 'package:flutter/foundation.dart';
import 'package:prop/prop.dart';
class WhooshLink extends TrainerConnection {
Socket? _socket;
@@ -66,7 +66,8 @@ class WhooshLink extends TrainerConnection {
// Accept connection
_server!.listen(
(Socket socket) {
(Socket socket) async {
await SharedLogic.keepAlive();
_socket = socket;
core.connection.signalNotification(
AlertNotification(LogLevel.LOGLEVEL_INFO, AppLocalizations.current.myWhooshLinkConnected),
@@ -89,6 +90,8 @@ class WhooshLink extends TrainerConnection {
},
onDone: () {
print('Client disconnected: $socket');
SharedLogic.stopKeepAlive();
isConnected.value = false;
core.connection.signalNotification(
AlertNotification(LogLevel.LOGLEVEL_WARNING, 'MyWhoosh Link disconnected'),

View File

@@ -119,7 +119,8 @@ class OpenBikeControlMdnsEmulator extends TrainerConnection {
// Accept connection
_server!.listen(
(Socket socket) {
(Socket socket) async {
await SharedLogic.keepAlive();
_socket = socket;
if (kDebugMode) {
@@ -153,6 +154,7 @@ class OpenBikeControlMdnsEmulator extends TrainerConnection {
}
},
onDone: () {
SharedLogic.stopKeepAlive();
core.connection.signalNotification(
AlertNotification(LogLevel.LOGLEVEL_INFO, 'Disconnected from app: ${connectedApp.value?.appId}'),
);

View File

@@ -5,6 +5,7 @@
import FlutterMacOS
import Foundation
import audio_session
import bluetooth_low_energy_darwin
import device_info_plus
import file_selector_macos
@@ -15,6 +16,7 @@ import gamepads_darwin
import in_app_purchase_storekit
import in_app_review
import ios_receipt
import just_audio
import keypress_simulator_macos
import media_key_detector_macos
import nsd_macos
@@ -28,6 +30,7 @@ import wakelock_plus
import window_manager
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin"))
BluetoothLowEnergyDarwinPlugin.register(with: registry.registrar(forPlugin: "BluetoothLowEnergyDarwinPlugin"))
DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin"))
FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin"))
@@ -38,6 +41,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
InAppPurchasePlugin.register(with: registry.registrar(forPlugin: "InAppPurchasePlugin"))
InAppReviewPlugin.register(with: registry.registrar(forPlugin: "InAppReviewPlugin"))
IosReceiptPlugin.register(with: registry.registrar(forPlugin: "IosReceiptPlugin"))
JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin"))
KeypressSimulatorMacosPlugin.register(with: registry.registrar(forPlugin: "KeypressSimulatorMacosPlugin"))
MediaKeyDetectorPlugin.register(with: registry.registrar(forPlugin: "MediaKeyDetectorPlugin"))
NsdMacosPlugin.register(with: registry.registrar(forPlugin: "NsdMacosPlugin"))

2
prop

Submodule prop updated: 3ddb11e101...585c205750

View File

@@ -80,6 +80,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.13.0"
audio_session:
dependency: transitive
description:
name: audio_session
sha256: "8f96a7fecbb718cb093070f868b4cdcb8a9b1053dce342ff8ab2fde10eb9afb7"
url: "https://pub.dev"
source: hosted
version: "0.2.2"
bluetooth_low_energy:
dependency: "direct main"
description:
@@ -868,6 +876,30 @@ packages:
url: "https://pub.dev"
source: hosted
version: "4.9.0"
just_audio:
dependency: transitive
description:
name: just_audio
sha256: "9694e4734f515f2a052493d1d7e0d6de219ee0427c7c29492e246ff32a219908"
url: "https://pub.dev"
source: hosted
version: "0.10.5"
just_audio_platform_interface:
dependency: transitive
description:
name: just_audio_platform_interface
sha256: "2532c8d6702528824445921c5ff10548b518b13f808c2e34c2fd54793b999a6a"
url: "https://pub.dev"
source: hosted
version: "4.6.0"
just_audio_web:
dependency: transitive
description:
name: just_audio_web
sha256: "6ba8a2a7e87d57d32f0f7b42856ade3d6a9fbe0f1a11fabae0a4f00bb73f0663"
url: "https://pub.dev"
source: hosted
version: "0.4.16"
keypress_simulator:
dependency: "direct main"
description:
@@ -1560,6 +1592,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.3.1"
synchronized:
dependency: transitive
description:
name: synchronized
sha256: c254ade258ec8282947a0acbbc90b9575b4f19673533ee46f2f6e9b3aeefd7c0
url: "https://pub.dev"
source: hosted
version: "3.4.0"
term_glyph:
dependency: transitive
description:

View File

@@ -104,6 +104,7 @@ flutter:
- INSTRUCTIONS_ZWIFT.md
- INSTRUCTIONS_LOCAL.md
- shorebird.yaml
- assets/silence.mp3
- icon.png
flutter_intl: