Я даю ответ на свой вопрос.Поиск решения занял у меня некоторое время и был довольно разочаровывающим.Если вы выполняете поиск в Интернете, вы найдете некоторые частичные ответы, но мне все еще потребовалось некоторое время, чтобы разработать следующее решение, и я надеюсь, что оно внесет некоторую ясность.
Итак, сначала появится рекомендуемое поведение вашего приложения.быть следующим (см. Открытие поддерживаемых типов файлов в iOS Ref Lib):
- Не реализовывать
applicationDidFinishLaunching:
(см. примечание на UIApplicationDelegate ). - Реализуйте
application:didFinishLaunchingWithOptions:
и проверьте URL, верните YES, если вы можете открыть его, иначе НЕТ, но не открывайте его. - Реализуйте
application:handleOpenURL:
и откройте URL, верните YESв случае успеха, в противном случае НЕТ.
В iOS 4 передача URL-адреса приложению приводит к одному из следующих двух вариантов поведения:
- Если приложение запускается, тогда
application:didFinishLaunchingWithOptions:
вызывается и application:handleOpenURL:
вызывается, если application:didFinishLaunchingWithOptions:
возвращает ДА. - Если приложение становится активным из приостановленного состояния, то
application:didFinishLaunchingWithOptions:
не вызывается, но application:handleOpenURL:
вызывается.
Однако в iOS 3.2 это выглядит так, как будто application:handleOpenURL:
это называется!Подсказка, что поведение под iOS 3.2 отличается, можно найти в Обработка запросов URL .Там вы обнаружите, что application:handleOpenURL:
вызывается, если application:didFinishLaunchingWithOptions:
не реализовано, но applicationDidFinishLaunching:
реализовано.Но application:handleOpenURL:
не вызывается, если реализовано application:didFinishLaunchingWithOptions:
.
Следовательно, одно из решений, обеспечивающих работу кода в версиях 3.2 и 4.0:
- Откройте URL-адрес в
application:didFinishLaunchingWithOptions:
, но затем верните NO, чтобы предотвратить вызов application:handleOpenURL:
. - Откройте URL-адрес в
application:handleOpenURL:
, если вы находитесь под 4.0 и приложение находится в приостановленном состоянии.
Я нашел это решение в другом посте, но я был смущен, потому что оно противоречило рекомендации в документации iOS Ref Lib (а именно, что мы должны вернуть YES в application:didFinishLaunchingWithOptions:
).(В тот момент я не осознавал, что документация сама по себе противоречит).
Я считаю, что текущее поведение iOS 4.0 будет будущим поведением. Я предпочитаю следующее решение:
- Не реализуйте
applicationDidFinishLaunching:
. - Реализуйте
application:didFinishLaunchingWithOptions:
и проверьте URL, верните YES, если вы можете открыть его, в противном случае NO, но не открывайте его.Если мы находимся на 3.2, откройте URL. - Реализуйте
application:handleOpenURL:
и откройте URL, верните ДА в случае успеха, в противном случае НЕТ.
Итак, в целом, я реализую iOS4 и добавили следующую строку в application:didFinishLaunchingWithOptions:
<PRE>
if([[[UIDevice currentDevice] systemVersion] hasPrefix:@"3.2"]) {
[self application:application handleOpenURL:url];
}
</PRE>
, что заставляет код работать под 3.2.