I have implemented UIApplicationDelegate's
application:didFinishLaunchingWithOptions:
and
application:handleOpenURL:
according to specification, i.e.,
application:didFinishLaunchingWithOptions:
returns YES
and
application:handleOpenURL: opens the URL.
The code works under iOS 4 (in both cases, i.e., when the app is launched and when it becomes active from suspended state). However, the code does not work under iOS 3.2.
I give an answer to my own question. Finding out the solution took me a while and was quite frustrating. If you do an internet search you find some partial answers, but it still took me a while to work out the following solution and I do hope it adds some clarity.
So first, the recommended behavior of your app appears to be the following (see Opening Supported File Types in iOS Ref Lib):
applicationDidFinishLaunching:(see the note at UIApplicationDelegate).application:didFinishLaunchingWithOptions:and check the URL, return YES if you can open it, otherwise NO, but do not open it.application:handleOpenURL:and open the URL, return YES if successful, otherwise NO.In iOS 4, passing an URL to an app results in one of the following two behaviors:
application:didFinishLaunchingWithOptions:is called andapplication:handleOpenURL:is called if andapplication:didFinishLaunchingWithOptions:returned YES.application:didFinishLaunchingWithOptions:is not called butapplication:handleOpenURL:is called.However, in iOS 3.2 it appears as if
application:handleOpenURL:is never called! A hint that the behavior is different under iOS 3.2 can be found in Handling URL Requests. There you find thatapplication:handleOpenURL:is called ifapplication:didFinishLaunchingWithOptions:is not implemented, butapplicationDidFinishLaunching:is implemented. Butapplication:handleOpenURL:is not called ifapplication:didFinishLaunchingWithOptions:is implemented.Hence, one solution to make the code work under 3.2 and 4.0 is:
application:didFinishLaunchingWithOptions:, but then return NO to prevent thatapplication:handleOpenURL:is called.application:handleOpenURL:, in case you are under 4.0 and the app was in suspended state.I found this solution in another post, but I was confused, because it contradicted the recommendation in iOS Ref Lib documentation (namely that we should return YES in
application:didFinishLaunchingWithOptions:). (At that point I did not realize that the documentation contradicts it self).I believe that the current iOS 4.0 behavior will be the future behavior I prefer the following solution:
applicationDidFinishLaunching:.application:didFinishLaunchingWithOptions:and check the URL, return YES if you can open it, otherwise NO, but do not open it. If we are on 3.2, open the URL.application:handleOpenURL:and open the URL, return YES if successful, otherwise NO.So in summary, I implement the iOS 4 behavior and added the following line to
application:didFinishLaunchingWithOptions:if([[[UIDevice currentDevice] systemVersion] hasPrefix:@"3.2"]) { [self application:application handleOpenURL:url]; }which make the code work under 3.2.