2017-02-20 155 views
0

後叫了幾秒鐘我在我的應用程序一個深層鏈接功能,其工作一例旁邊的罰款。 根據打開應用程序的url,我有3個不同的入門頁面。 因此,當應用程序啓動時,我需要知道什麼鏈接(如果有)打開應用程序,然後提出正確的入職頁面。問題是,我需要知道的方法來呈現什麼屏幕:應用的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被稱爲(如果它會被稱爲)。

所以我的問題是:有沒有辦法知道,如果應用程序是從之前或期間didFinishLaunchingWithOptions一個URL啓動?

順便說一句launchOptionsdidFinishLaunchingWithOptions是零,當應用程序從一個深層鏈接

回答

1

您正在查找的啓動選項鍵是UIApplicationLaunchOptionsURLKey(的Objective-C)/ ​​(SWIFT)打開。
如果您定位的iOS 9及以上的,你只需要從

  • application:didFinishLaunchingWithOptions:攔截啓動URL(如果應用程序是不是在內存還)
  • 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 

斯威夫特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

當我打開我的應用程序從一個深層鏈接「launchOptio ns'在didFinishLaunchingWithOptions中爲零,但'openURL'確實被觸發(使用深層鏈接url)。我展示我的入職頁面內「didFinishLaunchingWithOptions」,在那裏你覺得我應該給第一個關鍵窗口時,應用程序啓動 –

+0

好讓我問了幾個其他問題:你是從Web瀏覽器打開你的應用程序?您定位的是哪個最低iOS版本? 注意的application:didFinishLaunchingWithOptions:只有每次運行時調用一次。如果你的應用程序已經在後臺,應用程序:openURL:options:將被調用。 我關於窗口設置註釋只有當你依靠一個故事板作爲「主界面」設置適用。如果你是從application:didFinishLaunchingWithOptions中自己設置界面的話:你會沒事的,請忽略評論。 – Olivier

+0

我提高了我的答案清晰 - 它已經和Xcode 8.3上運行iOS 9.3.4和iOS設備10.3經測試,對於Objective-C和斯威夫特的基礎之上。確保您在Info.plist的「URL Types'>'URL Schemes」(例如「my-app」)中設置了值,然後在您的設備上構建應用程序然後將其殺死,然後嘗試打開例如「my-app://」在任何網頁瀏覽器中。 – Olivier

相關問題