Skip to content

Commit 12d63e9

Browse files
Merge current pr's (#1)
1 parent 4ad948d commit 12d63e9

File tree

9 files changed

+151
-148
lines changed

9 files changed

+151
-148
lines changed

example/lib/main.dart

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,6 @@ class _MyAppState extends State<MyApp> {
224224
Workmanager().registerPeriodicTask(
225225
simplePeriodic1HourTask,
226226
simplePeriodic1HourTask,
227-
flexInterval: Duration(minutes: 15),
228227
frequency: Duration(hours: 1),
229228
);
230229
}
@@ -272,17 +271,6 @@ class _MyAppState extends State<MyApp> {
272271
: null,
273272
),
274273
SizedBox(height: 16),
275-
ElevatedButton(
276-
child: Text("isscheduled (Android)"),
277-
onPressed: Platform.isAndroid
278-
? () async {
279-
final workInfo =
280-
await Workmanager().isScheduledByUniqueName(
281-
simplePeriodicTask,
282-
);
283-
print('isscheduled = $workInfo');
284-
}
285-
: null),
286274
SizedBox(height: 8),
287275
Text(
288276
"Task cancellation",

workmanager/ios/Classes/BackgroundTaskOperation.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class BackgroundTaskOperation: Operation {
2424
self.backgroundMode = backgroundMode
2525
}
2626

27+
2728
override func main() {
2829
let semaphore = DispatchSemaphore(value: 0)
2930
let worker = BackgroundWorker(mode: self.backgroundMode,
@@ -37,4 +38,4 @@ class BackgroundTaskOperation: Operation {
3738

3839
semaphore.wait()
3940
}
40-
}
41+
}

workmanager/ios/Classes/BackgroundWorker.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class BackgroundWorker {
113113

114114
backgroundMethodChannel?.invokeMethod(
115115
BackgroundChannel.onResultSendCommand,
116-
arguments: arguments,
116+
arguments:arguments,
117117
result: { flutterResult in
118118
cleanupFlutterResources()
119119
let taskSessionCompleter = Date()
@@ -137,4 +137,4 @@ class BackgroundWorker {
137137

138138
return true
139139
}
140-
}
140+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
//
2+
// CheckBackgroundRefreshPermission.swift
3+
// workmanager
4+
//
5+
// Created by Lars Huth on 03/11/2022.
6+
//
7+
import Foundation
8+
9+
func checkBackgroundRefreshPermission(result: @escaping FlutterResult) -> BackgroundRefreshPermissionState {
10+
switch UIApplication.shared.backgroundRefreshStatus {
11+
case .available:
12+
result(BackgroundRefreshPermissionState.available.rawValue)
13+
return BackgroundRefreshPermissionState.available
14+
case .denied:
15+
result(BackgroundRefreshPermissionState.denied.rawValue)
16+
return BackgroundRefreshPermissionState.denied
17+
case .restricted:
18+
result(BackgroundRefreshPermissionState.restricted.rawValue)
19+
return BackgroundRefreshPermissionState.restricted
20+
default:
21+
result(
22+
FlutterError(
23+
code: "103",
24+
message: "BGAppRefreshTask - Probably you have restricted background refresh permission. " +
25+
"\n" +
26+
"BackgroundRefreshStatus is unknown\n",
27+
details: nil
28+
)
29+
)
30+
return BackgroundRefreshPermissionState.unknown
31+
}
32+
}
33+
34+
func requestBackgroundPermission() {
35+
// Request for permission
36+
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!)
37+
}
38+
39+
enum BackgroundRefreshPermissionState: String {
40+
/// Background app refresh is enabled in iOS Setting
41+
case available
42+
43+
/// Background app refresh is disabled in iOS Setting. Permission should be requested from user
44+
case denied
45+
46+
/// iOS Setting is under parental control etc. Can't be changed by user
47+
case restricted
48+
49+
/// Unknown state
50+
case unknown
51+
52+
/// Convenience constructor to build a [BackgroundRefreshPermissionState] from a Dart enum.
53+
init?(fromDart: String) {
54+
self.init(rawValue: fromDart.camelCased(with: "_"))
55+
}
56+
}
57+
58+
private extension String {
59+
func camelCased(with separator: Character) -> String {
60+
return self.lowercased()
61+
.split(separator: separator)
62+
.enumerated()
63+
.map { $0.offset > 0 ? $0.element.capitalized : $0.element.lowercased() }
64+
.joined()
65+
}
66+
}

workmanager/ios/Classes/SwiftWorkmanagerPlugin.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ public class SwiftWorkmanagerPlugin: FlutterPluginAppLifeCycleDelegate {
2626
}
2727
}
2828

29+
struct CheckBackgroundRefreshPermission {
30+
static let name = "\(CheckBackgroundRefreshPermission.self)".lowercasingFirst
31+
}
32+
2933
struct RegisterOneOffTask {
3034
static let name = "\(RegisterOneOffTask.self)".lowercasingFirst
3135
enum Arguments: String {
@@ -144,7 +148,7 @@ public class SwiftWorkmanagerPlugin: FlutterPluginAppLifeCycleDelegate {
144148

145149
/// Immediately starts a one off task
146150
@available(iOS 13.0, *)
147-
public static func startOneOffTask(identifier: String, taskIdentifier: UIBackgroundTaskIdentifier, inputData: String, delaySeconds: Int64) {
151+
public static func startOneOffTask(identifier: String, taskIdentifier: UIBackgroundTaskIdentifier, inputData:String, delaySeconds: Int64) {
148152
let operationQueue = OperationQueue()
149153
// Create an operation that performs the main part of the background task
150154
let operation = BackgroundTaskOperation(
@@ -267,6 +271,9 @@ extension SwiftWorkmanagerPlugin: FlutterPlugin {
267271
case (ForegroundMethodChannel.Methods.Initialize.name, let .some(arguments)):
268272
initialize(arguments: arguments, result: result)
269273
return
274+
case (ForegroundMethodChannel.Methods.CheckBackgroundRefreshPermission.name, .some):
275+
_ = checkBackgroundRefreshPermission(result: result)
276+
return
270277
case (ForegroundMethodChannel.Methods.RegisterOneOffTask.name, let .some(arguments)):
271278
registerOneOffTask(arguments: arguments, result: result)
272279
return
@@ -325,6 +332,7 @@ extension SwiftWorkmanagerPlugin: FlutterPlugin {
325332
let inputData =
326333
arguments[method.Arguments.inputData.rawValue] as? String
327334

335+
328336
taskIdentifier = UIApplication.shared.beginBackgroundTask(withName: uniqueTaskIdentifier, expirationHandler: {
329337
// Mark the task as ended if time is expired, otherwise iOS might terminate and will throttle future executions
330338
UIApplication.shared.endBackgroundTask(taskIdentifier)
@@ -395,8 +403,8 @@ extension SwiftWorkmanagerPlugin: FlutterPlugin {
395403
SwiftWorkmanagerPlugin.scheduleBackgroundProcessingTask(
396404
withIdentifier: uniqueTaskIdentifier,
397405
earliestBeginInSeconds: delaySeconds,
398-
requiresNetworkConnectivity: requiresNetwork,
399-
requiresExternalPower: requiresCharging)
406+
requiresNetworkConnectivity: requiresCharging,
407+
requiresExternalPower: requiresNetwork)
400408

401409
result(true)
402410
return
@@ -492,4 +500,4 @@ extension SwiftWorkmanagerPlugin {
492500
return worker.performBackgroundRequest(completionHandler)
493501
}
494502

495-
}
503+
}

workmanager/ios/Classes/WorkmanagerPlugin.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@
2828
+ (void)registerBGProcessingTaskWithIdentifier:(NSString *) taskIdentifier;
2929

3030

31-
@end
31+
@end

workmanager/lib/src/options.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,23 @@ class Constraints {
101101
this.requiresStorageNotLow,
102102
});
103103
}
104+
105+
/// Background App Refresh permission states. Currently only available in iOS.
106+
///
107+
/// On iOS user can disable Background App Refresh permission anytime, hence
108+
/// background tasks can only run if user has granted the permission.
109+
/// [Workmanager().checkBackgroundRefreshPermission()] can be used to check the
110+
/// permission.
111+
enum BackgroundRefreshPermissionState {
112+
/// Background app refresh is enabled in OS Setting
113+
available,
114+
115+
/// Background app refresh is disabled in OS Setting. Permission should be requested from user
116+
denied,
117+
118+
/// OS setting is under parental control etc. Can't be changed by user
119+
restricted,
120+
121+
/// Unknown state
122+
unknown
123+
}

0 commit comments

Comments
 (0)