Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit e96fac1

Browse files
committed
iOS Background Platform Channels
1 parent 3af330d commit e96fac1

File tree

14 files changed

+317
-115
lines changed

14 files changed

+317
-115
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,8 +1152,6 @@ FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/connection_col
11521152
FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/connection_collection_test.mm
11531153
FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/platform_message_response_darwin.h
11541154
FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/platform_message_response_darwin.mm
1155-
FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/platform_message_router.h
1156-
FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/platform_message_router.mm
11571155
FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/profiler_metrics_ios.h
11581156
FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/profiler_metrics_ios.mm
11591157
FILE: ../../../flutter/shell/platform/darwin/ios/framework/Source/vsync_waiter_ios.h
@@ -1185,6 +1183,8 @@ FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_software.h
11851183
FILE: ../../../flutter/shell/platform/darwin/ios/ios_surface_software.mm
11861184
FILE: ../../../flutter/shell/platform/darwin/ios/ios_switchable_gl_context.h
11871185
FILE: ../../../flutter/shell/platform/darwin/ios/ios_switchable_gl_context.mm
1186+
FILE: ../../../flutter/shell/platform/darwin/ios/platform_message_handler_ios.h
1187+
FILE: ../../../flutter/shell/platform/darwin/ios/platform_message_handler_ios.mm
11881188
FILE: ../../../flutter/shell/platform/darwin/ios/platform_view_ios.h
11891189
FILE: ../../../flutter/shell/platform/darwin/ios/platform_view_ios.mm
11901190
FILE: ../../../flutter/shell/platform/darwin/ios/rendering_api_selection.h

shell/platform/darwin/common/framework/Headers/FlutterBinaryMessenger.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ typedef void (^FlutterBinaryMessageHandler)(NSData* _Nullable message, FlutterBi
3131

3232
typedef int64_t FlutterBinaryMessengerConnection;
3333

34+
@protocol FlutterTaskQueue;
35+
3436
/**
3537
* A facility for communicating with the Flutter side using asynchronous message
3638
* passing with binary messages.
@@ -44,6 +46,16 @@ typedef int64_t FlutterBinaryMessengerConnection;
4446
*/
4547
FLUTTER_DARWIN_EXPORT
4648
@protocol FlutterBinaryMessenger <NSObject>
49+
/// TODO(gaaclarke): Remove optional when macos supports Background Platform Channels.
50+
@optional
51+
- (NSObject<FlutterTaskQueue>*)makeBackgroundTaskQueue;
52+
53+
- (FlutterBinaryMessengerConnection)
54+
setMessageHandlerOnChannel:(NSString*)channel
55+
binaryMessageHandler:(FlutterBinaryMessageHandler _Nullable)handler
56+
taskQueue:(NSObject<FlutterTaskQueue>* _Nullable)taskQueue;
57+
58+
@required
4759
/**
4860
* Sends a binary message to the Flutter side on the specified channel, expecting
4961
* no reply.

shell/platform/darwin/common/framework/Headers/FlutterChannels.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#import "FlutterBinaryMessenger.h"
99
#import "FlutterCodecs.h"
1010

11+
@protocol FlutterTaskQueue;
12+
1113
NS_ASSUME_NONNULL_BEGIN
1214
/**
1315
* A message reply callback.
@@ -88,6 +90,11 @@ FLUTTER_DARWIN_EXPORT
8890
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
8991
codec:(NSObject<FlutterMessageCodec>*)codec;
9092

93+
- (instancetype)initWithName:(NSString*)name
94+
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
95+
codec:(NSObject<FlutterMessageCodec>*)codec
96+
taskQueue:(NSObject<FlutterTaskQueue>* _Nullable)taskQueue;
97+
9198
/**
9299
* Sends the specified message to the Flutter side, ignoring any reply.
93100
*
@@ -213,6 +220,11 @@ FLUTTER_DARWIN_EXPORT
213220
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
214221
codec:(NSObject<FlutterMethodCodec>*)codec;
215222

223+
- (instancetype)initWithName:(NSString*)name
224+
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
225+
codec:(NSObject<FlutterMethodCodec>*)codec
226+
taskQueue:(NSObject<FlutterTaskQueue>* _Nullable)taskQueue;
227+
216228
// clang-format off
217229
/**
218230
* Invokes the specified Flutter method with the specified arguments, expecting
@@ -371,6 +383,11 @@ FLUTTER_DARWIN_EXPORT
371383
- (instancetype)initWithName:(NSString*)name
372384
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
373385
codec:(NSObject<FlutterMethodCodec>*)codec;
386+
387+
- (instancetype)initWithName:(NSString*)name
388+
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
389+
codec:(NSObject<FlutterMethodCodec>*)codec
390+
taskQueue:(NSObject<FlutterTaskQueue>* _Nullable)taskQueue;
374391
/**
375392
* Registers a handler for stream setup requests from the Flutter side.
376393
*

shell/platform/darwin/common/framework/Source/FlutterChannels.mm

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,30 @@ static void ResizeChannelBuffer(NSObject<FlutterBinaryMessenger>* binaryMessenge
1616
[binaryMessenger sendOnChannel:FlutterChannelBuffersChannel message:message];
1717
}
1818

19+
static FlutterBinaryMessengerConnection SetMessageHandler(
20+
NSObject<FlutterBinaryMessenger>* messenger,
21+
NSString* name,
22+
FlutterBinaryMessageHandler handler,
23+
NSObject<FlutterTaskQueue>* taskQueue) {
24+
if (taskQueue) {
25+
NSCAssert([messenger respondsToSelector:@selector(setMessageHandlerOnChannel:
26+
binaryMessageHandler:taskQueue:)],
27+
@"");
28+
return [messenger setMessageHandlerOnChannel:name
29+
binaryMessageHandler:handler
30+
taskQueue:taskQueue];
31+
} else {
32+
return [messenger setMessageHandlerOnChannel:name binaryMessageHandler:handler];
33+
}
34+
}
35+
36+
////////////////////////////////////////////////////////////////////////////////
1937
@implementation FlutterBasicMessageChannel {
2038
NSObject<FlutterBinaryMessenger>* _messenger;
2139
NSString* _name;
2240
NSObject<FlutterMessageCodec>* _codec;
2341
FlutterBinaryMessengerConnection _connection;
42+
NSObject<FlutterTaskQueue>* _taskQueue;
2443
}
2544
+ (instancetype)messageChannelWithName:(NSString*)name
2645
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger {
@@ -40,18 +59,28 @@ + (instancetype)messageChannelWithName:(NSString*)name
4059
- (instancetype)initWithName:(NSString*)name
4160
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
4261
codec:(NSObject<FlutterMessageCodec>*)codec {
62+
self = [self initWithName:name binaryMessenger:messenger codec:codec taskQueue:nil];
63+
return self;
64+
}
65+
66+
- (instancetype)initWithName:(NSString*)name
67+
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
68+
codec:(NSObject<FlutterMessageCodec>*)codec
69+
taskQueue:(NSObject<FlutterTaskQueue>*)taskQueue {
4370
self = [super init];
4471
NSAssert(self, @"Super init cannot be nil");
4572
_name = [name retain];
4673
_messenger = [messenger retain];
4774
_codec = [codec retain];
75+
_taskQueue = [taskQueue retain];
4876
return self;
4977
}
5078

5179
- (void)dealloc {
5280
[_name release];
5381
[_messenger release];
5482
[_codec release];
83+
[_taskQueue release];
5584
[super dealloc];
5685
}
5786

@@ -84,7 +113,7 @@ - (void)setMessageHandler:(FlutterMessageHandler)handler {
84113
callback([codec encode:reply]);
85114
});
86115
};
87-
_connection = [_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:messageHandler];
116+
_connection = SetMessageHandler(_messenger, _name, messageHandler, _taskQueue);
88117
}
89118

90119
- (void)resizeChannelBuffer:(NSInteger)newSize {
@@ -95,6 +124,7 @@ - (void)resizeChannelBuffer:(NSInteger)newSize {
95124

96125
#pragma mark - Method channel
97126

127+
////////////////////////////////////////////////////////////////////////////////
98128
@implementation FlutterError
99129
+ (instancetype)errorWithCode:(NSString*)code message:(NSString*)message details:(id)details {
100130
return [[[FlutterError alloc] initWithCode:code message:message details:details] autorelease];
@@ -133,6 +163,7 @@ - (NSUInteger)hash {
133163
}
134164
@end
135165

166+
////////////////////////////////////////////////////////////////////////////////
136167
@implementation FlutterMethodCall
137168
+ (instancetype)methodCallWithMethodName:(NSString*)method arguments:(id)arguments {
138169
return [[[FlutterMethodCall alloc] initWithMethodName:method arguments:arguments] autorelease];
@@ -170,11 +201,13 @@ - (NSUInteger)hash {
170201

171202
NSObject const* FlutterMethodNotImplemented = [NSObject new];
172203

204+
////////////////////////////////////////////////////////////////////////////////
173205
@implementation FlutterMethodChannel {
174206
NSObject<FlutterBinaryMessenger>* _messenger;
175207
NSString* _name;
176208
NSObject<FlutterMethodCodec>* _codec;
177209
FlutterBinaryMessengerConnection _connection;
210+
NSObject<FlutterTaskQueue>* _taskQueue;
178211
}
179212

180213
+ (instancetype)methodChannelWithName:(NSString*)name
@@ -193,18 +226,27 @@ + (instancetype)methodChannelWithName:(NSString*)name
193226
- (instancetype)initWithName:(NSString*)name
194227
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
195228
codec:(NSObject<FlutterMethodCodec>*)codec {
229+
self = [self initWithName:name binaryMessenger:messenger codec:codec taskQueue:nil];
230+
return self;
231+
}
232+
- (instancetype)initWithName:(NSString*)name
233+
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
234+
codec:(NSObject<FlutterMethodCodec>*)codec
235+
taskQueue:(NSObject<FlutterTaskQueue>*)taskQueue {
196236
self = [super init];
197237
NSAssert(self, @"Super init cannot be nil");
198238
_name = [name retain];
199239
_messenger = [messenger retain];
200240
_codec = [codec retain];
241+
_taskQueue = [taskQueue retain];
201242
return self;
202243
}
203244

204245
- (void)dealloc {
205246
[_name release];
206247
[_messenger release];
207248
[_codec release];
249+
[_taskQueue release];
208250
[super dealloc];
209251
}
210252

@@ -250,7 +292,7 @@ - (void)setMethodCallHandler:(FlutterMethodCallHandler)handler {
250292
callback([codec encodeSuccessEnvelope:result]);
251293
});
252294
};
253-
_connection = [_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:messageHandler];
295+
_connection = SetMessageHandler(_messenger, _name, messageHandler, _taskQueue);
254296
}
255297

256298
- (void)resizeChannelBuffer:(NSInteger)newSize {
@@ -263,10 +305,12 @@ - (void)resizeChannelBuffer:(NSInteger)newSize {
263305

264306
NSObject const* FlutterEndOfEventStream = [NSObject new];
265307

308+
////////////////////////////////////////////////////////////////////////////////
266309
@implementation FlutterEventChannel {
267310
NSObject<FlutterBinaryMessenger>* _messenger;
268311
NSString* _name;
269312
NSObject<FlutterMethodCodec>* _codec;
313+
NSObject<FlutterTaskQueue>* _taskQueue;
270314
}
271315
+ (instancetype)eventChannelWithName:(NSString*)name
272316
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger {
@@ -284,25 +328,35 @@ + (instancetype)eventChannelWithName:(NSString*)name
284328
- (instancetype)initWithName:(NSString*)name
285329
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
286330
codec:(NSObject<FlutterMethodCodec>*)codec {
331+
return [self initWithName:name binaryMessenger:messenger codec:codec taskQueue:nil];
332+
}
333+
334+
- (instancetype)initWithName:(NSString*)name
335+
binaryMessenger:(NSObject<FlutterBinaryMessenger>*)messenger
336+
codec:(NSObject<FlutterMethodCodec>*)codec
337+
taskQueue:(NSObject<FlutterTaskQueue>* _Nullable)taskQueue {
287338
self = [super init];
288339
NSAssert(self, @"Super init cannot be nil");
289340
_name = [name retain];
290341
_messenger = [messenger retain];
291342
_codec = [codec retain];
343+
_taskQueue = [taskQueue retain];
292344
return self;
293345
}
294346

295347
- (void)dealloc {
296348
[_name release];
297349
[_codec release];
298350
[_messenger release];
351+
[_taskQueue release];
299352
[super dealloc];
300353
}
301354

302355
static void SetStreamHandlerMessageHandlerOnChannel(NSObject<FlutterStreamHandler>* handler,
303356
NSString* name,
304357
NSObject<FlutterBinaryMessenger>* messenger,
305-
NSObject<FlutterMethodCodec>* codec) {
358+
NSObject<FlutterMethodCodec>* codec,
359+
NSObject<FlutterTaskQueue>* taskQueue) {
306360
__block FlutterEventSink currentSink = nil;
307361
FlutterBinaryMessageHandler messageHandler = ^(NSData* message, FlutterBinaryReply callback) {
308362
FlutterMethodCall* call = [codec decodeMethodCall:message];
@@ -344,14 +398,14 @@ static void SetStreamHandlerMessageHandlerOnChannel(NSObject<FlutterStreamHandle
344398
callback(nil);
345399
}
346400
};
347-
[messenger setMessageHandlerOnChannel:name binaryMessageHandler:messageHandler];
401+
SetMessageHandler(messenger, name, messageHandler, taskQueue);
348402
}
349403

350404
- (void)setStreamHandler:(NSObject<FlutterStreamHandler>*)handler {
351405
if (!handler) {
352406
[_messenger setMessageHandlerOnChannel:_name binaryMessageHandler:nil];
353407
return;
354408
}
355-
SetStreamHandlerMessageHandlerOnChannel(handler, _name, _messenger, _codec);
409+
SetStreamHandlerMessageHandlerOnChannel(handler, _name, _messenger, _codec, _taskQueue);
356410
}
357411
@end

shell/platform/darwin/ios/BUILD.gn

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,6 @@ source_set("flutter_framework_source") {
101101
"framework/Source/connection_collection.mm",
102102
"framework/Source/platform_message_response_darwin.h",
103103
"framework/Source/platform_message_response_darwin.mm",
104-
"framework/Source/platform_message_router.h",
105-
"framework/Source/platform_message_router.mm",
106104
"framework/Source/profiler_metrics_ios.h",
107105
"framework/Source/profiler_metrics_ios.mm",
108106
"framework/Source/vsync_waiter_ios.h",
@@ -127,6 +125,8 @@ source_set("flutter_framework_source") {
127125
"ios_surface_software.mm",
128126
"ios_switchable_gl_context.h",
129127
"ios_switchable_gl_context.mm",
128+
"platform_message_handler_ios.h",
129+
"platform_message_handler_ios.mm",
130130
"platform_view_ios.h",
131131
"platform_view_ios.mm",
132132
"rendering_api_selection.h",

shell/platform/darwin/ios/framework/Source/FlutterBinaryMessengerRelay.mm

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,24 @@ - (void)sendOnChannel:(NSString*)channel
3535
}
3636
}
3737

38+
- (NSObject<FlutterTaskQueue>*)makeBackgroundTaskQueue {
39+
if (self.parent) {
40+
return [self.parent makeBackgroundTaskQueue];
41+
} else {
42+
return nil;
43+
};
44+
}
45+
3846
- (FlutterBinaryMessengerConnection)setMessageHandlerOnChannel:(NSString*)channel
3947
binaryMessageHandler:
4048
(FlutterBinaryMessageHandler)handler {
49+
return [self setMessageHandlerOnChannel:channel binaryMessageHandler:handler taskQueue:nil];
50+
}
51+
52+
- (FlutterBinaryMessengerConnection)setMessageHandlerOnChannel:(NSString*)channel
53+
binaryMessageHandler:(FlutterBinaryMessageHandler)handler
54+
taskQueue:
55+
(NSObject<FlutterTaskQueue>*)taskQueue {
4156
if (self.parent) {
4257
return [self.parent setMessageHandlerOnChannel:channel binaryMessageHandler:handler];
4358
} else {

shell/platform/darwin/ios/framework/Source/FlutterEngine.mm

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -925,12 +925,24 @@ - (void)sendOnChannel:(NSString*)channel
925925
_shell->GetPlatformView()->DispatchPlatformMessage(std::move(platformMessage));
926926
}
927927

928+
- (NSObject<FlutterTaskQueue>*)makeBackgroundTaskQueue {
929+
return flutter::PlatformMessageHandlerIos::MakeBackgroundTaskQueue();
930+
}
931+
928932
- (FlutterBinaryMessengerConnection)setMessageHandlerOnChannel:(NSString*)channel
929933
binaryMessageHandler:
930934
(FlutterBinaryMessageHandler)handler {
935+
return [self setMessageHandlerOnChannel:channel binaryMessageHandler:handler taskQueue:nil];
936+
}
937+
938+
- (FlutterBinaryMessengerConnection)
939+
setMessageHandlerOnChannel:(NSString*)channel
940+
binaryMessageHandler:(FlutterBinaryMessageHandler)handler
941+
taskQueue:(NSObject<FlutterTaskQueue>* _Nullable)taskQueue {
931942
NSParameterAssert(channel);
932943
if (_shell && _shell->IsSetup()) {
933-
self.iosPlatformView->GetPlatformMessageRouter().SetMessageHandler(channel.UTF8String, handler);
944+
self.iosPlatformView->GetPlatformMessageHandlerIos()->SetMessageHandler(channel.UTF8String,
945+
handler, taskQueue);
934946
return _connections->AquireConnection(channel.UTF8String);
935947
} else {
936948
NSAssert(!handler, @"Setting a message handler before the FlutterEngine has been run.");
@@ -943,7 +955,8 @@ - (void)cleanUpConnection:(FlutterBinaryMessengerConnection)connection {
943955
if (_shell && _shell->IsSetup()) {
944956
std::string channel = _connections->CleanupConnection(connection);
945957
if (!channel.empty()) {
946-
self.iosPlatformView->GetPlatformMessageRouter().SetMessageHandler(channel.c_str(), nil);
958+
self.iosPlatformView->GetPlatformMessageHandlerIos()->SetMessageHandler(channel.c_str(), nil,
959+
nil);
947960
}
948961
}
949962
}

shell/platform/darwin/ios/framework/Source/FlutterViewController.mm

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1591,12 +1591,24 @@ - (void)sendOnChannel:(NSString*)channel
15911591
[_engine.get().binaryMessenger sendOnChannel:channel message:message binaryReply:callback];
15921592
}
15931593

1594+
- (NSObject<FlutterTaskQueue>*)makeBackgroundTaskQueue {
1595+
return [_engine.get().binaryMessenger makeBackgroundTaskQueue];
1596+
}
1597+
15941598
- (FlutterBinaryMessengerConnection)setMessageHandlerOnChannel:(NSString*)channel
15951599
binaryMessageHandler:
15961600
(FlutterBinaryMessageHandler)handler {
1601+
return [self setMessageHandlerOnChannel:channel binaryMessageHandler:handler taskQueue:nil];
1602+
}
1603+
1604+
- (FlutterBinaryMessengerConnection)
1605+
setMessageHandlerOnChannel:(NSString*)channel
1606+
binaryMessageHandler:(FlutterBinaryMessageHandler _Nullable)handler
1607+
taskQueue:(NSObject<FlutterTaskQueue>* _Nullable)taskQueue {
15971608
NSAssert(channel, @"The channel must not be null");
15981609
return [_engine.get().binaryMessenger setMessageHandlerOnChannel:channel
1599-
binaryMessageHandler:handler];
1610+
binaryMessageHandler:handler
1611+
taskQueue:taskQueue];
16001612
}
16011613

16021614
- (void)cleanUpConnection:(FlutterBinaryMessengerConnection)connection {

0 commit comments

Comments
 (0)