Skip to content

Commit f89e393

Browse files
committed
feat(apple): complete iOS Dart layer migration to Pigeon
- Replace MethodChannel with WorkmanagerHostApi in workmanager_apple.dart - Migrate all API calls to use Pigeon request objects - Remove flutter/services.dart dependency as it's no longer needed - Maintain full feature parity with previous MethodChannel implementation - Add proper support for all constraints and parameters This completes the Pigeon migration for the iOS platform, bringing: - Type-safe communication between Dart and Swift - Automatic serialization/deserialization - Better error handling and debugging - Consistent API across Android and iOS platforms
1 parent f65ebea commit f89e393

2 files changed

Lines changed: 52 additions & 37 deletions

File tree

workmanager_apple/ios/Classes/WorkmanagerPlugin.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ public class WorkmanagerPlugin: FlutterPluginAppLifeCycleDelegate, FlutterPlugin
129129
request.earliestBeginDate = Date(timeIntervalSinceNow: begin)
130130
request.requiresNetworkConnectivity = requiresNetworkConnectivity
131131
request.requiresExternalPower = requiresExternalPower
132+
132133
do {
133134
try BGTaskScheduler.shared.submit(request)
134135
logInfo("BGProcessingTask submitted \(uniqueTaskIdentifier) earliestBeginInSeconds:\(begin)")
Lines changed: 51 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
11
import 'dart:ui';
2-
import 'package:flutter/services.dart';
32
import 'package:workmanager_platform_interface/workmanager_platform_interface.dart';
43

54
/// Apple (iOS/macOS) implementation of [WorkmanagerPlatform].
65
class WorkmanagerApple extends WorkmanagerPlatform {
7-
/// The method channel used to interact with the native platform.
8-
static const MethodChannel _channel = MethodChannel(
9-
'dev.fluttercommunity.workmanager/foreground_channel_work_manager',
10-
);
6+
/// The Pigeon API instance for type-safe communication.
7+
final WorkmanagerHostApi _api = WorkmanagerHostApi();
118

129
/// Constructs a WorkmanagerApple instance.
1310
WorkmanagerApple() : super();
@@ -23,10 +20,10 @@ class WorkmanagerApple extends WorkmanagerPlatform {
2320
bool isInDebugMode = false,
2421
}) async {
2522
final callback = PluginUtilities.getCallbackHandle(callbackDispatcher);
26-
await _channel.invokeMethod('initialize', {
27-
'callbackHandle': callback!.toRawHandle(),
28-
'isInDebugMode': isInDebugMode,
29-
});
23+
await _api.initialize(InitializeRequest(
24+
callbackHandle: callback!.toRawHandle(),
25+
isInDebugMode: isInDebugMode,
26+
));
3027
}
3128

3229
@override
@@ -42,12 +39,22 @@ class WorkmanagerApple extends WorkmanagerPlatform {
4239
String? tag,
4340
OutOfQuotaPolicy? outOfQuotaPolicy,
4441
}) async {
45-
await _channel.invokeMethod('registerOneOffTask', {
46-
'uniqueName': uniqueName,
47-
'taskName': taskName,
48-
'inputData': inputData,
49-
'initialDelaySeconds': initialDelay?.inSeconds,
50-
});
42+
await _api.registerOneOffTask(OneOffTaskRequest(
43+
uniqueName: uniqueName,
44+
taskName: taskName,
45+
inputData: inputData?.cast<String?, Object?>(),
46+
initialDelaySeconds: initialDelay?.inSeconds,
47+
constraints: constraints,
48+
existingWorkPolicy: existingWorkPolicy,
49+
backoffPolicy: backoffPolicyDelay != null && backoffPolicy != null
50+
? BackoffPolicyConfig(
51+
backoffPolicy: backoffPolicy,
52+
backoffDelayMillis: backoffPolicyDelay.inMilliseconds,
53+
)
54+
: null,
55+
tag: tag,
56+
outOfQuotaPolicy: outOfQuotaPolicy,
57+
));
5158
}
5259

5360
@override
@@ -64,12 +71,23 @@ class WorkmanagerApple extends WorkmanagerPlatform {
6471
Duration? backoffPolicyDelay,
6572
String? tag,
6673
}) async {
67-
await _channel.invokeMethod('registerPeriodicTask', {
68-
'uniqueName': uniqueName,
69-
'taskName': taskName,
70-
'inputData': inputData,
71-
'initialDelaySeconds': initialDelay?.inSeconds,
72-
});
74+
await _api.registerPeriodicTask(PeriodicTaskRequest(
75+
uniqueName: uniqueName,
76+
taskName: taskName,
77+
frequencySeconds: frequency?.inSeconds ?? 900, // Default 15 minutes
78+
flexIntervalSeconds: flexInterval?.inSeconds,
79+
inputData: inputData?.cast<String?, Object?>(),
80+
initialDelaySeconds: initialDelay?.inSeconds,
81+
constraints: constraints,
82+
existingWorkPolicy: existingWorkPolicy,
83+
backoffPolicy: backoffPolicyDelay != null && backoffPolicy != null
84+
? BackoffPolicyConfig(
85+
backoffPolicy: backoffPolicy,
86+
backoffDelayMillis: backoffPolicyDelay.inMilliseconds,
87+
)
88+
: null,
89+
tag: tag,
90+
));
7391
}
7492

7593
@override
@@ -80,21 +98,19 @@ class WorkmanagerApple extends WorkmanagerPlatform {
8098
Map<String, dynamic>? inputData,
8199
Constraints? constraints,
82100
}) async {
83-
await _channel.invokeMethod('registerProcessingTask', {
84-
'uniqueName': uniqueName,
85-
'taskName': taskName,
86-
'inputData': inputData,
87-
'initialDelaySeconds': initialDelay?.inSeconds,
88-
'networkType': constraints?.networkType?.name,
89-
'requiresCharging': constraints?.requiresCharging,
90-
});
101+
await _api.registerProcessingTask(ProcessingTaskRequest(
102+
uniqueName: uniqueName,
103+
taskName: taskName,
104+
inputData: inputData?.cast<String?, Object?>(),
105+
initialDelaySeconds: initialDelay?.inSeconds,
106+
networkType: constraints?.networkType,
107+
requiresCharging: constraints?.requiresCharging,
108+
));
91109
}
92110

93111
@override
94112
Future<void> cancelByUniqueName(String uniqueName) async {
95-
await _channel.invokeMethod('cancelTaskByUniqueName', {
96-
'uniqueName': uniqueName,
97-
});
113+
await _api.cancelByUniqueName(uniqueName);
98114
}
99115

100116
@override
@@ -105,18 +121,16 @@ class WorkmanagerApple extends WorkmanagerPlatform {
105121

106122
@override
107123
Future<void> cancelAll() async {
108-
await _channel.invokeMethod('cancelAllTasks');
124+
await _api.cancelAll();
109125
}
110126

111127
@override
112128
Future<bool> isScheduledByUniqueName(String uniqueName) async {
113-
// This functionality is not available on iOS
114-
throw UnsupportedError('isScheduledByUniqueName is not supported on iOS');
129+
return await _api.isScheduledByUniqueName(uniqueName);
115130
}
116131

117132
@override
118133
Future<String> printScheduledTasks() async {
119-
final result = await _channel.invokeMethod<String>('printScheduledTasks');
120-
return result ?? 'No scheduled tasks information available';
134+
return await _api.printScheduledTasks();
121135
}
122136
}

0 commit comments

Comments
 (0)