diff --git a/sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h b/sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h index 1d947a0367cddf8fc3837e687d1b8143c9c71385..dd3cc146622f8966b223dd49df931769f87272f7 100644 --- a/sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h +++ b/sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h @@ -15,6 +15,8 @@ FLUTTER_EXPORT - (void)didReceiveString:(NSString*)message callback:(void(^)(NSString*))sendResponse; +@property(readonly, strong, nonatomic) NSString* messageName; + @end #endif // FLUTTER_FLUTTERASYNCMESSAGELISTENER_H_ diff --git a/sky/shell/platform/ios/framework/Headers/FlutterMessageListener.h b/sky/shell/platform/ios/framework/Headers/FlutterMessageListener.h index 945045038dc3596907fd6747d5641a092aa552f6..bbf344f2294c4c7b1d1bb6986e50d1a040afd4ae 100644 --- a/sky/shell/platform/ios/framework/Headers/FlutterMessageListener.h +++ b/sky/shell/platform/ios/framework/Headers/FlutterMessageListener.h @@ -14,6 +14,8 @@ FLUTTER_EXPORT - (NSString*)didReceiveString:(NSString*)message; +@property(readonly, strong, nonatomic) NSString* messageName; + @end #endif // FLUTTER_FLUTTERMESSAGELISTENER_H_ diff --git a/sky/shell/platform/ios/framework/Headers/FlutterViewController.h b/sky/shell/platform/ios/framework/Headers/FlutterViewController.h index 09c24e3a27aaea767de9a7a72c245985b67d5cd4..c92f0d70fa0f34eed21f577a583e447cc12e0a3f 100644 --- a/sky/shell/platform/ios/framework/Headers/FlutterViewController.h +++ b/sky/shell/platform/ios/framework/Headers/FlutterViewController.h @@ -28,11 +28,13 @@ FLUTTER_EXPORT withMessageName:(NSString*)messageName callback:(void(^)(NSString*))callback; -- (void)setMessageListener:(NSObject*)listener - forMessagesWithName:(NSString*)messageName; +- (void)addMessageListener:(NSObject*)listener; -- (void)setAsyncMessageListener:(NSObject*)listener - forMessagesWithName:(NSString*)messageName; +- (void)removeMessageListener:(NSObject*)listener; + +- (void)addAsyncMessageListener:(NSObject*)listener; + +- (void)removeAsyncMessageListener:(NSObject*)listener; @end diff --git a/sky/shell/platform/ios/framework/Source/FlutterViewController.mm b/sky/shell/platform/ios/framework/Source/FlutterViewController.mm index 81fccefd4922584edc7d51609bc99e0fe860e450..ee1bd99d5689044ccd6425609bede27ca7fbe5c9 100644 --- a/sky/shell/platform/ios/framework/Source/FlutterViewController.mm +++ b/sky/shell/platform/ios/framework/Source/FlutterViewController.mm @@ -483,20 +483,32 @@ static inline PointerTypeMapperPhase PointerTypePhaseFromUITouchPhase( }); } -- (void)setMessageListener:(NSObject*)listener - forMessagesWithName:(NSString*)messageName { +- (void)addMessageListener:(NSObject*)listener { NSAssert(listener, @"The listener must not be null"); + NSString* messageName = listener.messageName; NSAssert(messageName, @"The messageName must not be null"); - _appMessageReceiver.SetMessageListener(messageName.UTF8String, - base::scoped_nsprotocol*>(listener)); + _appMessageReceiver.SetMessageListener(messageName.UTF8String, listener); } -- (void)setAsyncMessageListener:(NSObject*)listener - forMessagesWithName:(NSString*)messageName { +- (void)removeMessageListener:(NSObject*)listener { NSAssert(listener, @"The listener must not be null"); + NSString* messageName = listener.messageName; NSAssert(messageName, @"The messageName must not be null"); - _appMessageReceiver.SetAsyncMessageListener(messageName.UTF8String, - base::scoped_nsprotocol*>(listener)); + _appMessageReceiver.SetMessageListener(messageName.UTF8String, nil); +} + +- (void)addAsyncMessageListener:(NSObject*)listener { + NSAssert(listener, @"The listener must not be null"); + NSString* messageName = listener.messageName; + NSAssert(messageName, @"The messageName must not be null"); + _appMessageReceiver.SetAsyncMessageListener(messageName.UTF8String, listener); +} + +- (void)removeAsyncMessageListener:(NSObject*)listener { + NSAssert(listener, @"The listener must not be null"); + NSString* messageName = listener.messageName; + NSAssert(messageName, @"The messageName must not be null"); + _appMessageReceiver.SetAsyncMessageListener(messageName.UTF8String, nil); } @end diff --git a/sky/shell/platform/ios/framework/Source/application_messages_impl.h b/sky/shell/platform/ios/framework/Source/application_messages_impl.h index 54f4f92900712d493011df7423969b77f59a2dec..c30329db10ef3982e63d6ec6ea37902ca832de8b 100644 --- a/sky/shell/platform/ios/framework/Source/application_messages_impl.h +++ b/sky/shell/platform/ios/framework/Source/application_messages_impl.h @@ -8,7 +8,6 @@ #include #include "base/memory/weak_ptr.h" -#include "base/mac/scoped_nsobject.h" #include "mojo/common/binding_set.h" #include "sky/services/platform/app_messages.mojom.h" #include "sky/shell/platform/ios/framework/Headers/FlutterAsyncMessageListener.h" @@ -27,11 +26,11 @@ class ApplicationMessagesImpl : public flutter::platform::ApplicationMessages { void SetMessageListener( const std::string& message_name, - base::scoped_nsprotocol*> listener); + NSObject* listener); void SetAsyncMessageListener( const std::string& message_name, - base::scoped_nsprotocol*> listener); + NSObject* listener); private: void SendString(const mojo::String& message_name, @@ -40,11 +39,9 @@ class ApplicationMessagesImpl : public flutter::platform::ApplicationMessages { mojo::BindingSet binding_; std::unordered_map< - std::string, - base::scoped_nsprotocol*>> listeners_; + std::string, NSObject*> listeners_; std::unordered_map< - std::string, - base::scoped_nsprotocol*>> async_listeners_; + std::string, NSObject*> async_listeners_; base::WeakPtrFactory weak_factory_; }; diff --git a/sky/shell/platform/ios/framework/Source/application_messages_impl.mm b/sky/shell/platform/ios/framework/Source/application_messages_impl.mm index fae177736f15a4aa0f39e8d56771e5a10d22ecb0..066f232b7a2d725e99fec81ef9b6b01e4f1341c6 100644 --- a/sky/shell/platform/ios/framework/Source/application_messages_impl.mm +++ b/sky/shell/platform/ios/framework/Source/application_messages_impl.mm @@ -26,14 +26,20 @@ void ApplicationMessagesImpl::AddBinding( void ApplicationMessagesImpl::SetMessageListener( const std::string& message_name, - base::scoped_nsprotocol*> listener) { - listeners_[message_name] = listener; + NSObject* listener) { + if (listener) + listeners_[message_name] = listener; + else + listeners_.erase(message_name); } void ApplicationMessagesImpl::SetAsyncMessageListener( const std::string& message_name, - base::scoped_nsprotocol*> listener) { - async_listeners_[message_name] = listener; + NSObject* listener) { + if (listener) + async_listeners_[message_name] = listener; + else + async_listeners_.erase(message_name); } void ApplicationMessagesImpl::SendString(