diff --git a/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm b/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm index f9b70ba89c03c..dd61dd345d81d 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterEngine.mm @@ -678,9 +678,12 @@ - (void)sendOnChannel:(NSString*)channel - (void)setMessageHandlerOnChannel:(NSString*)channel binaryMessageHandler:(FlutterBinaryMessageHandler)handler { NSParameterAssert(channel); - NSAssert(_shell && _shell->IsSetup(), - @"Setting a message handler before the FlutterEngine has been run."); - self.iosPlatformView->GetPlatformMessageRouter().SetMessageHandler(channel.UTF8String, handler); + if (_shell && _shell->IsSetup()) { + self.iosPlatformView->GetPlatformMessageRouter().SetMessageHandler(channel.UTF8String, handler); + } else { + NSAssert(!handler, @"Setting a message handler before the FlutterEngine has been run."); + // Setting a handler to nil for a not setup channel is a noop. + } } #pragma mark - FlutterTextureRegistry diff --git a/shell/platform/darwin/ios/framework/Source/FlutterEngineTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterEngineTest.mm index 4071d26f7e7cf..d18d76167b5c6 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterEngineTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterEngineTest.mm @@ -47,6 +47,14 @@ - (void)testSetMessageHandlerBeforeRun { }]); } +- (void)testNilSetMessageHandlerBeforeRun { + id project = OCMClassMock([FlutterDartProject class]); + FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"foobar" project:project]; + XCTAssertNotNil(engine); + XCTAssertNoThrow([engine.binaryMessenger setMessageHandlerOnChannel:@"foo" + binaryMessageHandler:nil]); +} + - (void)testNotifyPluginOfDealloc { id plugin = OCMProtocolMock(@protocol(FlutterPlugin)); OCMStub([plugin detachFromEngineForRegistrar:[OCMArg any]]);