2017-02-20 24 views
0

У меня есть функция глубокой привязки в моем приложении, которая отлично работает рядом с одним случаем. У меня есть 3 разных бортовых страницы в соответствии с URL-адресом, открывшим приложение. Итак, когда приложение запущено, мне нужно знать, какая ссылка (если есть) открыла приложение, а затем представила правую страницу на борту. Проблема заключается в том, что я должен знать, что экран, чтобы представить в методе:Приложение openURL вызывается через несколько секунд после того, как didFinishLaunchingWithOptions

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

, но я могу знать только если глубокая связь открыла приложение в

- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation 

который вызывается через 5 секунд после того, как сделали didFinishLaunchingWithOptions называется (я подсчитал секунды). Итак, у меня есть 5 секунд, что я вижу неправильную страницу на борту, пока не вызывается openURL (если она будет вызываться).

Так что мой вопрос: есть ли способ узнать, было ли приложение запущено с URL до или во время didFinishLaunchingWithOptions?

Кстати launchOptions в didFinishLaunchingWithOptions равна нулю, когда приложение открывается с глубокой связи

ответ

1

Опция запуска клавиатурных ищете UIApplicationLaunchOptionsURLKey (Objective-C)/UIApplicationLaunchOptionsKey.url (Swift).
Если вы ориентируетесь IOS 9 и выше у вас есть только перехватить запуск URL из

  • application:didFinishLaunchingWithOptions: (в случае, если приложение не находится в памяти пока)
  • application:openURL:options: (в случае, если приложение уже фон).

Вот минималистичный реализация UIApplicationDelegate, которые должны охватывать оба случая - обратите внимание, что много не связаны логики опущены для ясности:

Objective-C:

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    NSURL *url = launchOptions[UIApplicationLaunchOptionsURLKey]; 
    if (url) { 
     // TODO: handle URL from here 
    } 

    return YES; 
} 

- (BOOL)application:(UIApplication *)app 
      openURL:(NSURL *)url 
      options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { 

    // TODO: handle URL from here 

    return YES; 
} 

@end 

Swift 3:

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    var window: UIWindow? 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

     if let url = launchOptions?[UIApplicationLaunchOptionsKey.url] as? URL { 
      // TODO: handle URL from here 
     } 

     return true 
    } 

    func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { 

     // TODO: handle URL from here 

     return true 
    } 
} 
+0

, когда я открываю приложение из deeplink 'launchOptio ns 'is nil in didFinishLaunchingWithOptions, но' openURL 'делает triggerd (с глубоким URL-адресом ссылки). Я показываю свою домашнюю страницу внутри «didFinishLaunchingWithOptions», где, по вашему мнению, я должен показать первое ключевое окно при запуске приложения. –

+0

Хорошо, позвольте мне задать еще несколько вопросов: открываете ли вы свое приложение из веб-браузера? Какую минимальную версию iOS вы планируете? Обратите внимание, что приложение: didFinishLaunchingWithOptions: вызывается только один раз за время выполнения. Если ваше приложение уже находится в фоновом режиме, приложение: openURL: options: будет вызываться вместо этого. Мой комментарий относительно настройки окна применяется только в том случае, если вы полагаетесь на раскадровку как настройку «Основной интерфейс». Если вы настраиваете интерфейс самостоятельно из приложения: didFinishLaunchingWithOptions: все будет в порядке, пожалуйста, проигнорируйте комментарий. – Olivier

+0

Я улучшил свой ответ для ясности - он был протестирован с Xcode 8.3 на устройствах под управлением iOS 9.3.4 и iOS 10.3 для обеих систем Objective-C и Swift. Убедитесь, что вы установили значение в '' 'URL-типах' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' идентификаторами '' (например, «my-app»), создайте приложение на своем устройстве, затем запустите его, затем попробуйте открыть, например.«my-app: //» в любом веб-браузере. – Olivier