Приложение Lauching с URL-адресом (через руклопеньурл UiagplyDelegenegenegate) работая под IOS 4, но не под IOS 3.2

StackOverflow https://stackoverflow.com/questions/3612460

Вопрос

Я реализовал 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

Документация:

https://developer.apple.com/library/ios/#documentation/uikit/reference/uiacaphicationDelegate_protocol/reference/reference.html.

Я начал писать приложение, которое использовал 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 Конечно.

Спасибо, уходит к христианину, чтобы положить усилия для этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top