@@ -85,6 +85,57 @@ @interface AppDelegateForInfiniteLoopTest : UIResponder<UIApplicationDelegate>
8585@implementation AppDelegateForInfiniteLoopTest
8686@end
8787
88+ @interface AppDelegateForExistingSelectorsTest : UIResponder <UIApplicationDelegate> {
89+ @public NSMutableDictionary *selectorCallsDict;
90+ }
91+ @end
92+ @implementation AppDelegateForExistingSelectorsTest
93+ - (instancetype )init {
94+ self = [super init ];
95+ selectorCallsDict = [NSMutableDictionary new ];
96+ return self;
97+ }
98+
99+ - (void )application : (UIApplication *)application
100+ didReceiveRemoteNotification : (NSDictionary *)userInfo
101+ fetchCompletionHandler : (void (^)(UIBackgroundFetchResult result))completionHandler {
102+ SEL thisSelector = @selector (application:didReceiveRemoteNotification:fetchCompletionHandler: );
103+ [selectorCallsDict
104+ setObject: @(true )
105+ forKey: NSStringFromSelector (thisSelector)
106+ ];
107+ }
108+
109+ - (void )application : (UIApplication *)application
110+ didFailToRegisterForRemoteNotificationsWithError : (NSError *)err
111+ {
112+ SEL thisSelector = @selector (application:didFailToRegisterForRemoteNotificationsWithError: );
113+ [selectorCallsDict
114+ setObject: @(true )
115+ forKey: NSStringFromSelector (thisSelector)
116+ ];
117+ }
118+
119+ - (void )application : (UIApplication *)application
120+ didRegisterForRemoteNotificationsWithDeviceToken : (NSData *)data
121+ {
122+ SEL thisSelector = @selector (application:didRegisterForRemoteNotificationsWithDeviceToken: );
123+ [selectorCallsDict
124+ setObject: @(true )
125+ forKey: NSStringFromSelector (thisSelector)
126+ ];
127+ }
128+
129+ - (void )applicationWillTerminate : (UIApplication *)application
130+ {
131+ SEL thisSelector = @selector (applicationWillTerminate: );
132+ [selectorCallsDict
133+ setObject: @(true )
134+ forKey: NSStringFromSelector (thisSelector)
135+ ];
136+ }
137+ @end
138+
88139static id <UIApplicationDelegate> orignalDelegate;
89140
90141@interface UIApplicationDelegateSwizzlingTest : XCTestCase
@@ -187,4 +238,46 @@ - (void)testDoubleSwizzleInfiniteLoop {
187238 // 4. Call something to confirm we don't get stuck in an infinite call loop
188239 [localOrignalDelegate applicationWillTerminate: UIApplication.sharedApplication];
189240}
241+
242+ - (void )testSwizzleExistingSelectors {
243+ AppDelegateForExistingSelectorsTest* myAppDelegate = [AppDelegateForExistingSelectorsTest new ];
244+ UIApplication.sharedApplication .delegate = myAppDelegate;
245+ id <UIApplicationDelegate> appDelegate = UIApplication.sharedApplication .delegate ;
246+
247+ [appDelegate
248+ application: UIApplication.sharedApplication
249+ didReceiveRemoteNotification: @{}
250+ fetchCompletionHandler: ^(UIBackgroundFetchResult result){}];
251+ XCTAssertTrue ([myAppDelegate->selectorCallsDict
252+ objectForKey: NSStringFromSelector (
253+ @selector (application:didReceiveRemoteNotification:fetchCompletionHandler: )
254+ )
255+ ]);
256+
257+ [appDelegate
258+ application: UIApplication.sharedApplication
259+ didFailToRegisterForRemoteNotificationsWithError: [NSError new ]];
260+ XCTAssertTrue ([myAppDelegate->selectorCallsDict
261+ objectForKey: NSStringFromSelector (
262+ @selector (application:didFailToRegisterForRemoteNotificationsWithError: )
263+ )
264+ ]);
265+
266+ [appDelegate
267+ application: UIApplication.sharedApplication
268+ didRegisterForRemoteNotificationsWithDeviceToken: [NSData new ]];
269+ XCTAssertTrue ([myAppDelegate->selectorCallsDict
270+ objectForKey: NSStringFromSelector (
271+ @selector (application:didRegisterForRemoteNotificationsWithDeviceToken: )
272+ )
273+ ]);
274+
275+ [appDelegate
276+ applicationWillTerminate: UIApplication.sharedApplication];
277+ XCTAssertTrue ([myAppDelegate->selectorCallsDict
278+ objectForKey: NSStringFromSelector (
279+ @selector (applicationWillTerminate: )
280+ )
281+ ]);
282+ }
190283@end
0 commit comments