Приложение Lauching с URL-адресом (через руклопеньурл UiagplyDelegenegenegate) работая под IOS 4, но не под IOS 3.2
-
26-09-2019 - |
Вопрос
Я реализовал UIAPlicationDelegate
application:didFinishLaunchingWithOptions:
а также
application:handleOpenURL:
Согласно спецификации, то есть,
application:didFinishLaunchingWithOptions:
returns YES
а также
application:handleOpenURL: opens the URL.
Код работает под iOS 4 (в обоих случаях, т. Е. Когда приложение запущено, и когда он становится активным из подвесного состояния). Однако код не работает под IOS 3.2.
Решение
Я даю ответ на свой вопрос. Выясняя решение приняло меня некоторое время и было довольно неприятным. Если вы выполняете поиск в Интернете, вы найдете некоторые частичные ответы, но все же у меня потребовалось некоторое время, чтобы выработать следующее решение, и я надеюсь, что он добавляет некоторую ясность.
Итак, во-первых, рекомендуемое поведение вашего приложения, кажется, следующее (см. Открытие поддерживаемых типов файлов В IOS REF Lib):
- Не реализуйте
applicationDidFinishLaunching:
(см. Примечание в UiApplicationDelegate.). - Воплощать в жизнь
application:didFinishLaunchingWithOptions:
И проверьте URL, верните да, если вы можете открыть его, в противном случае нет, но не открывайте его. - Воплощать в жизнь
application:handleOpenURL:
И открыть URL, верните да, если успешно, в противном случае нет.
В 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:
, но затем возвращение нет, чтобы предотвратить этоapplication:handleOpenURL:
называется. - Открыть URL в
application:handleOpenURL:
, Если вам меньше 4.0, а приложение было в приостановленном состоянии.
Я нашел это решение в другом посте, но я был смущен, потому что это противоречило рекомендации в документации IOS Ref Lib (а именно, что мы должны вернуть да в application:didFinishLaunchingWithOptions:
). (В этот момент я не понимал, что документация противоречит себе).
Я считаю, что текущее поведение IOS 4.0 будет будущим поведением, которое я предпочитаю следующее решение:
- Не реализуйте
applicationDidFinishLaunching:
. - Воплощать в жизнь
application:didFinishLaunchingWithOptions:
И проверьте URL, верните да, если вы можете открыть его, в противном случае нет, но не открывайте его. Если мы на 3,2, откройте URL. - Воплощать в жизнь
application:handleOpenURL:
И открыть URL, верните да, если успешно, в противном случае нет.
Таким образом, в резюме я осуществляю поведение IOS 4 и добавленную следующую строку в application:didFinishLaunchingWithOptions:
if([[[UIDevice currentDevice] systemVersion] hasPrefix:@"3.2"]) {
[self application:application handleOpenURL:url];
}
которые делают код работы под 3,2.
Другие советы
application:handleOpenURL:
теперь устарел.
Начиная с iOS 4.2, вы можете использовать это для открытия URL-адресов:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
Документация:
Я начал писать приложение, которое использовал API Dropbox. Чтобы понять концепцию, я провел приложение образца, используя мой ключ / секрет, упомянутый в Dropbox / Developer документацияОтказ После того, как пример приложения началось работать, я использовал те же значения / секретные значения для моего приложения.
Для приложения приложения выполняются внедрение руклопеленна (или OpenURL на iOS 4.2). По какой-то странной причине это было не так для моего приложения. Мое приложение вошло в фоновом режиме, чтобы показать экран входа и страницу аутентификации Dropbox. После успешного входа в систему и аутентификацию мое приложение никогда не входило на передний план. Это было верно для имитатора платформы, так и для устройства (iPad)
Я пробовал почти все, перечисленное в Интернете, включая этот пост. Спасибо. Хотя не было успеха, хотя.
Наконец, это НАЧАЛ Работа для моего приложения, когда я выполнял:
- На симуляторе выберите «Симулятор iOS -> Сброс контента и настройки» и сброс.
- На устройстве я удалил файл образца приложения, связанный с исполняемым исполняемым, и который в свою очередь удаляет кэш, связанный с ним.
Добавьте следующее до конца application:DidFinishLaunchingWithOptions
:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
if (url != nil && [url isFileURL]) {
return YES;
} else return NO;
} // End of application:didFinishLaunchingWithOptions:
// New method starts
-(BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
mvc = [nc.viewControllers objectAtIndex:0];
if (url != nil && [url isFileURL]) {
[mvc handleOpenURL:url];
}
return YES;
}
где MVC является моим главным ViewController и NC мой навигационный контроллер.
Тогда в MainviewController, сделайте что-то подобное:
- (void)handleOpenURL:(NSURL *)url {
[self.navigationController popToRootViewControllerAnimated:YES];
// Next bit not relevant just left in as part of the example
NSData *jsonData = [NSData dataWithContentsOfURL:url];
NSError *error;
NSDictionary *dictionary = [[NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error] objectAtIndex:0];
[self managedObjectFromStructure:dictionary withManagedObjectContext:self.context];
...
}
После декларирования руклопеньурля в .h Конечно.
Спасибо, уходит к христианину, чтобы положить усилия для этого.