Revert "Removed the email warning about notifications entitlement" (#30330)
diff --git a/shell/platform/darwin/ios/framework/Headers/FlutterPluginAppLifeCycleDelegate.h b/shell/platform/darwin/ios/framework/Headers/FlutterPluginAppLifeCycleDelegate.h
index 17a18a7..dd6489c 100644
--- a/shell/platform/darwin/ios/framework/Headers/FlutterPluginAppLifeCycleDelegate.h
+++ b/shell/platform/darwin/ios/framework/Headers/FlutterPluginAppLifeCycleDelegate.h
@@ -53,28 +53,20 @@
/**
* Calls all plugins registered for `UIApplicationDelegate` callbacks.
- *
- * At runtime this is also mapped to
- * `application:didRegisterForRemoteNotificationsWithDeviceToken:`.
*/
-- (void)performApplication:(UIApplication*)application
+- (void)application:(UIApplication*)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken;
/**
* Calls all plugins registered for `UIApplicationDelegate` callbacks.
- * At runtime this is also mapped to
- * `application:didFailToRegisterForRemoteNotificationsWithError:`.
*/
-- (void)performApplication:(UIApplication*)application
+- (void)application:(UIApplication*)application
didFailToRegisterForRemoteNotificationsWithError:(NSError*)error;
/**
* Calls all plugins registered for `UIApplicationDelegate` callbacks.
- *
- * At runtime this is also mapped to
- * `application:didReceiveRemoteNotification:fetchCompletionHandler:`.
*/
-- (void)performApplication:(UIApplication*)application
+- (void)application:(UIApplication*)application
didReceiveRemoteNotification:(NSDictionary*)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterAppDelegate.mm b/shell/platform/darwin/ios/framework/Source/FlutterAppDelegate.mm
index bd2eafe..a50924e 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterAppDelegate.mm
+++ b/shell/platform/darwin/ios/framework/Source/FlutterAppDelegate.mm
@@ -15,12 +15,6 @@
static NSString* const kRemoteNotificationCapabitiliy = @"remote-notification";
static NSString* const kBackgroundFetchCapatibility = @"fetch";
static NSString* const kRestorationStateAppModificationKey = @"mod-date";
-static NSString* const kApplicationDidReceiveRemoteNotificationFetchCompletionHandler =
- @"application:didReceiveRemoteNotification:fetchCompletionHandler:";
-
-static SEL ApplicationDidReceiveRemoteNotificationFetchCompletionHandlerSelector() {
- return NSSelectorFromString(kApplicationDidReceiveRemoteNotificationFetchCompletionHandler);
-}
@interface FlutterAppDelegate ()
@property(nonatomic, copy) FlutterViewController* (^rootFlutterViewControllerGetter)(void);
@@ -96,6 +90,18 @@
}
#pragma GCC diagnostic pop
+- (void)application:(UIApplication*)application
+ didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {
+ [_lifeCycleDelegate application:application
+ didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
+}
+
+- (void)application:(UIApplication*)application
+ didFailToRegisterForRemoteNotificationsWithError:(NSError*)error {
+ [_lifeCycleDelegate application:application
+ didFailToRegisterForRemoteNotificationsWithError:error];
+}
+
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
- (void)application:(UIApplication*)application
@@ -290,7 +296,7 @@
NSArray* backgroundModesArray =
[[NSBundle mainBundle] objectForInfoDictionaryKey:kUIBackgroundMode];
NSSet* backgroundModesSet = [[[NSSet alloc] initWithArray:backgroundModesArray] autorelease];
- if (selector == ApplicationDidReceiveRemoteNotificationFetchCompletionHandlerSelector()) {
+ if (selector == @selector(application:didReceiveRemoteNotification:fetchCompletionHandler:)) {
if (![backgroundModesSet containsObject:kRemoteNotificationCapabitiliy]) {
NSLog(
@"You've implemented -[<UIApplicationDelegate> "
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterAppDelegateTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterAppDelegateTest.mm
index 4c37499..33b4e42 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterAppDelegateTest.mm
+++ b/shell/platform/darwin/ios/framework/Source/FlutterAppDelegateTest.mm
@@ -13,16 +13,6 @@
FLUTTER_ASSERT_ARC
-@interface FlutterAppDelegate ()
-- (void)application:(UIApplication*)application
- didReceiveRemoteNotification:(NSDictionary*)userInfo
- fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
-- (void)application:(UIApplication*)application
- didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken;
-- (void)application:(UIApplication*)application
- didFailToRegisterForRemoteNotificationsWithError:(NSError*)error;
-@end
-
@interface FlutterAppDelegateTest : XCTestCase
@property(strong) FlutterAppDelegate* appDelegate;
@@ -165,59 +155,4 @@
arguments:@"/custom/route?query=test"]);
}
-- (void)testDidReceiveRemoteNotificationTrue {
- id delegate = OCMProtocolMock(@protocol(FlutterApplicationLifeCycleDelegate));
- [self.appDelegate addApplicationLifeCycleDelegate:delegate];
- XCTAssertTrue([self.appDelegate
- respondsToSelector:@selector(application:
- didReceiveRemoteNotification:fetchCompletionHandler:)]);
- NSDictionary* info = @{};
- void (^handler)(UIBackgroundFetchResult) = ^(UIBackgroundFetchResult result) {
- };
- [self.appDelegate application:[UIApplication sharedApplication]
- didReceiveRemoteNotification:info
- fetchCompletionHandler:handler];
- [(NSObject<FlutterApplicationLifeCycleDelegate>*)[delegate verify]
- application:[UIApplication sharedApplication]
- didReceiveRemoteNotification:info
- fetchCompletionHandler:handler];
-}
-
-- (void)testDidRegisterForRemoteNotificationsWithDeviceTokenTrue {
- id delegate = OCMProtocolMock(@protocol(FlutterApplicationLifeCycleDelegate));
- [self.appDelegate addApplicationLifeCycleDelegate:delegate];
- XCTAssertTrue([self.appDelegate
- respondsToSelector:@selector(application:didRegisterForRemoteNotificationsWithDeviceToken:)]);
- NSData* token = [[NSData alloc] init];
- [self.appDelegate application:[UIApplication sharedApplication]
- didRegisterForRemoteNotificationsWithDeviceToken:token];
- [(NSObject<FlutterApplicationLifeCycleDelegate>*)[delegate verify]
- application:[UIApplication sharedApplication]
- didRegisterForRemoteNotificationsWithDeviceToken:token];
-}
-
-- (void)testDidReceiveRemoteNotificationFalse {
- XCTAssertFalse([self.appDelegate
- respondsToSelector:@selector(application:
- didReceiveRemoteNotification:fetchCompletionHandler:)]);
-}
-
-- (void)testDidRegisterForRemoteNotificationsWithDeviceTokenFalse {
- XCTAssertFalse([self.appDelegate
- respondsToSelector:@selector(application:didRegisterForRemoteNotificationsWithDeviceToken:)]);
-}
-
-- (void)testDidFailToRegisterForRemoteNotificationsWithError {
- id delegate = OCMProtocolMock(@protocol(FlutterApplicationLifeCycleDelegate));
- [self.appDelegate addApplicationLifeCycleDelegate:delegate];
- XCTAssertTrue([self.appDelegate
- respondsToSelector:@selector(application:didFailToRegisterForRemoteNotificationsWithError:)]);
- NSError* error = [[NSError alloc] init];
- [self.appDelegate application:[UIApplication sharedApplication]
- didFailToRegisterForRemoteNotificationsWithError:error];
- [(NSObject<FlutterApplicationLifeCycleDelegate>*)[delegate verify]
- application:[UIApplication sharedApplication]
- didFailToRegisterForRemoteNotificationsWithError:error];
-}
-
@end
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPluginAppLifeCycleDelegate.mm b/shell/platform/darwin/ios/framework/Source/FlutterPluginAppLifeCycleDelegate.mm
index cab7697..2ea4fe2 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterPluginAppLifeCycleDelegate.mm
+++ b/shell/platform/darwin/ios/framework/Source/FlutterPluginAppLifeCycleDelegate.mm
@@ -4,7 +4,6 @@
#import "flutter/shell/platform/darwin/ios/framework/Headers/FlutterPluginAppLifeCycleDelegate.h"
-#import <objc/runtime.h>
#include "flutter/fml/logging.h"
#include "flutter/fml/paths.h"
#include "flutter/lib/ui/plugins/callback_cache.h"
@@ -12,17 +11,9 @@
#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterCallbackCache_Internal.h"
static const char* kCallbackCacheSubDir = "Library/Caches/";
-static NSString* const kApplicationDidReceiveRemoteNotificationFetchCompletionHandler =
- @"application:didReceiveRemoteNotification:fetchCompletionHandler:";
-static NSString* const kApplicationDidRegisterForRemoteNotificationsWithDeviceToken =
- @"application:didRegisterForRemoteNotificationsWithDeviceToken:";
-static NSString* const kApplicationDidFailToRegisterForRemoteNotificationsWithError =
- @"application:didFailToRegisterForRemoteNotificationsWithError:";
static const SEL selectorsHandledByPlugins[] = {
- NSSelectorFromString(kApplicationDidReceiveRemoteNotificationFetchCompletionHandler),
- NSSelectorFromString(kApplicationDidRegisterForRemoteNotificationsWithDeviceToken),
- NSSelectorFromString(kApplicationDidFailToRegisterForRemoteNotificationsWithError),
+ @selector(application:didReceiveRemoteNotification:fetchCompletionHandler:),
@selector(application:performFetchWithCompletionHandler:)};
@interface FlutterPluginAppLifeCycleDelegate ()
@@ -41,35 +32,6 @@
NSPointerArray* _delegates;
}
-static void RemapMethod(Class thisClass, SEL originalSelector, SEL addedSelector) {
- Method originalMethod = class_getInstanceMethod(thisClass, originalSelector);
- IMP originalImp = method_getImplementation(originalMethod);
- class_addMethod(thisClass, addedSelector, originalImp, method_getTypeEncoding(originalMethod));
-}
-
-+ (void)load {
- // Swap out
- // `performApplication:didReceiveRemoteNotification:fetchCompletionHandler:`
- // for `application:didReceiveRemoteNotification:fetchCompletionHandler:`.
- // This has to be done to avoid a potential false positive "Missing Push
- // Notification Entitlement" validation failure when uploading apps to the App
- // Store. Linked NSPlugin implementations that have
- // `application:didReceiveRemoteNotification:fetchCompletionHandler:` defined
- // will cause the failure to happen correctly if the entitlements are missing.
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- RemapMethod(
- self, @selector(performApplication:didReceiveRemoteNotification:fetchCompletionHandler:),
- NSSelectorFromString(kApplicationDidReceiveRemoteNotificationFetchCompletionHandler));
- RemapMethod(self,
- @selector(performApplication:didRegisterForRemoteNotificationsWithDeviceToken:),
- NSSelectorFromString(kApplicationDidRegisterForRemoteNotificationsWithDeviceToken));
- RemapMethod(self,
- @selector(performApplication:didFailToRegisterForRemoteNotificationsWithError:),
- NSSelectorFromString(kApplicationDidFailToRegisterForRemoteNotificationsWithError));
- });
-}
-
- (void)addObserverFor:(NSString*)name selector:(SEL)selector {
[[NSNotificationCenter defaultCenter] addObserver:self selector:selector name:name object:nil];
__block NSObject* blockSelf = self;
@@ -273,7 +235,7 @@
}
#pragma GCC diagnostic pop
-- (void)performApplication:(UIApplication*)application
+- (void)application:(UIApplication*)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {
for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in _delegates) {
if (!delegate) {
@@ -286,7 +248,7 @@
}
}
-- (void)performApplication:(UIApplication*)application
+- (void)application:(UIApplication*)application
didFailToRegisterForRemoteNotificationsWithError:(NSError*)error {
for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in _delegates) {
if (!delegate) {
@@ -298,9 +260,7 @@
}
}
-// This will get swapped into `application:didReceiveRemoteNotification:fetchCompletionHandler:`
-// in +[FlutterPluginAppLifeCycleDelegate load].
-- (void)performApplication:(UIApplication*)application
+- (void)application:(UIApplication*)application
didReceiveRemoteNotification:(NSDictionary*)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
for (NSObject<FlutterApplicationLifeCycleDelegate>* delegate in _delegates) {
diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPluginAppLifeCycleDelegateTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterPluginAppLifeCycleDelegateTest.mm
index 0022533..9891f52 100644
--- a/shell/platform/darwin/ios/framework/Source/FlutterPluginAppLifeCycleDelegateTest.mm
+++ b/shell/platform/darwin/ios/framework/Source/FlutterPluginAppLifeCycleDelegateTest.mm
@@ -10,31 +10,6 @@
FLUTTER_ASSERT_ARC
-@interface FlutterPluginAppLifeCycleDelegate ()
-- (void)application:(UIApplication*)application
- didReceiveRemoteNotification:(NSDictionary*)userInfo
- fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;
-- (void)application:(UIApplication*)application
- didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken;
-- (void)application:(UIApplication*)application
- didFailToRegisterForRemoteNotificationsWithError:(NSError*)error;
-@end
-
-@interface FlutterPluginAppLifeCycleDelegateSubclass : FlutterPluginAppLifeCycleDelegate
-@property(nonatomic, strong) XCTestExpectation* didReceiveRemoteNotificationExpectation;
-@end
-
-@implementation FlutterPluginAppLifeCycleDelegateSubclass
-- (void)performApplication:(UIApplication*)application
- didReceiveRemoteNotification:(NSDictionary*)userInfo
- fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
- [self.didReceiveRemoteNotificationExpectation fulfill];
- [super performApplication:application
- didReceiveRemoteNotification:userInfo
- fetchCompletionHandler:completionHandler];
-}
-@end
-
@interface FlutterPluginAppLifeCycleDelegateTest : XCTestCase
@end
@@ -114,68 +89,4 @@
OCMVerify([plugin applicationWillTerminate:[UIApplication sharedApplication]]);
}
-- (void)testDidReceiveRemoteNotification {
- FlutterPluginAppLifeCycleDelegate* delegate = [[FlutterPluginAppLifeCycleDelegate alloc] init];
- id plugin = OCMProtocolMock(@protocol(FlutterPlugin));
- [delegate addDelegate:plugin];
- NSDictionary* info = @{};
- void (^handler)(UIBackgroundFetchResult) = ^(UIBackgroundFetchResult result) {
- };
- XCTAssertTrue([delegate respondsToSelector:@selector
- (application:didReceiveRemoteNotification:fetchCompletionHandler:)]);
- [delegate application:[UIApplication sharedApplication]
- didReceiveRemoteNotification:info
- fetchCompletionHandler:handler];
- [(NSObject<FlutterPlugin>*)[plugin verify] application:[UIApplication sharedApplication]
- didReceiveRemoteNotification:info
- fetchCompletionHandler:handler];
-}
-
-- (void)flutterPluginAppLifeCycleDelegateSubclass {
- FlutterPluginAppLifeCycleDelegateSubclass* delegate =
- [[FlutterPluginAppLifeCycleDelegateSubclass alloc] init];
- XCTestExpectation* expecation = [self expectationWithDescription:@"subclass called"];
- delegate.didReceiveRemoteNotificationExpectation = expecation;
- id plugin = OCMProtocolMock(@protocol(FlutterPlugin));
- [delegate addDelegate:plugin];
- NSDictionary* info = @{};
- void (^handler)(UIBackgroundFetchResult) = ^(UIBackgroundFetchResult result) {
- };
- XCTAssertTrue([delegate respondsToSelector:@selector
- (application:didReceiveRemoteNotification:fetchCompletionHandler:)]);
- [delegate application:[UIApplication sharedApplication]
- didReceiveRemoteNotification:info
- fetchCompletionHandler:handler];
- [(NSObject<FlutterPlugin>*)[plugin verify] application:[UIApplication sharedApplication]
- didReceiveRemoteNotification:info
- fetchCompletionHandler:handler];
- [self waitForExpectationsWithTimeout:1.0 handler:nil];
-}
-
-- (void)testDidRegisterForRemoteNotificationsWithDeviceToken {
- FlutterPluginAppLifeCycleDelegate* delegate = [[FlutterPluginAppLifeCycleDelegate alloc] init];
- id plugin = OCMProtocolMock(@protocol(FlutterPlugin));
- [delegate addDelegate:plugin];
- NSData* token = [[NSData alloc] init];
- XCTAssertTrue([delegate
- respondsToSelector:@selector(application:didRegisterForRemoteNotificationsWithDeviceToken:)]);
- [delegate application:[UIApplication sharedApplication]
- didRegisterForRemoteNotificationsWithDeviceToken:token];
- [(NSObject<FlutterPlugin>*)[plugin verify] application:[UIApplication sharedApplication]
- didRegisterForRemoteNotificationsWithDeviceToken:token];
-}
-
-- (void)testDidFailToRegisterForRemoteNotificationsWithError {
- FlutterPluginAppLifeCycleDelegate* delegate = [[FlutterPluginAppLifeCycleDelegate alloc] init];
- id plugin = OCMProtocolMock(@protocol(FlutterPlugin));
- [delegate addDelegate:plugin];
- NSError* error = [[NSError alloc] init];
- XCTAssertTrue([delegate
- respondsToSelector:@selector(application:didFailToRegisterForRemoteNotificationsWithError:)]);
- [delegate application:[UIApplication sharedApplication]
- didFailToRegisterForRemoteNotificationsWithError:error];
- [(NSObject<FlutterPlugin>*)[plugin verify] application:[UIApplication sharedApplication]
- didFailToRegisterForRemoteNotificationsWithError:error];
-}
-
@end