2016-05-22 27 views
2

Dies ist die Situation: wenn ich auf einen der Links, die ich mit benutzerdefinierten Schlüssel/Werte zugeordnet habe, wird mein Rückruf von initSessionWithLaunchOptions:andRegisterDeepLinkHandler wird ok ausgelöst, aber ' params 'enthalten nur die benutzerdefinierten Schlüssel/Werte, falls die App über den Link neu geöffnet wird. Wenn die App bereits im Hintergrund ausgeführt wurde und ich auf die Verknüpfung klicke, wird der Rückruf aufgerufen, aber es sind keine Parameter vorhanden. Das funktionierte vor ein paar Wochen und scheint jetzt zu funktionieren. Ich habe auch versucht auf iOS SDK 0.12.1 zu upgraden, aber noch kein Glück.Branch.io-Deep-Link-Handler wird nicht mit geeigneten Metadaten aufgerufen

Als Workaround versuche ich eine verzögerte Sequenz von Anrufen zu Branch.getInstance().getLatestReferringParams(), nachdem die App aktiv wird und manchmal bekomme ich die Parameter von dort, aber es ist nicht deterministisch, manchmal dauert es 2 Sekunden, manchmal 10 Sekunden , manchmal nie. @AlexBauer Hier sind die Teile des App-Delegaten. Btw, ich habe keine Facebook-Integration in der App:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

    let branch: Branch = Branch.getInstance() 
    branch.initSessionWithLaunchOptions(launchOptions, andRegisterDeepLinkHandler: { params, error in 
     if (error == nil) { 
      print(params) 
      self.tryInviteFlow(params) 
     } else { 
      print(error.localizedDescription) 
     } 
    }) 
} 

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool { 
    // pass the url to the handle deep link call 
    return Branch.getInstance().continueUserActivity(userActivity); 
} 
+0

Alex mit Branch.io hier: das ist definitiv merkwürdig! Könnten wir die relevanten Abschnitte Ihres AppDelegate und ein Beispiel für einen Link sehen, der nicht richtig funktioniert? –

+0

Nutzen Sie auch das Facebook SDK? Wir haben jetzt einen bekannten Edge-Fall, aber es gibt einen Workaround –

+0

@AlexBauer mit Code von App-Delegierten aktualisiert – vorterixe

Antwort

0

Hier ist eine schnelle Fehlerbehebung Primer für Fragen, bei denen Zweig Links von Kaltstart ordnungsgemäß, aber nicht, wenn die App immer aktiv nach backgrounded worden .. .

Wenn eine App aus einem Zweig Link geöffnet wird:

  • Wenn die App (dh es war nicht im Hintergrund), der Einstiegspunkt ist didFinishLaunchingWithOptions
  • Wenn die App war kalt gestartet werden ich Im Hintergrund und wird über Universal Linking geöffnet (dies ist der Fall, wenn das Gerät iOS 9.2+ läuft), der Einstiegspunkt ist die continuUserActivity Funktion
  • Wenn die App über das URI-Schema geöffnet wird (dies wird Dies ist der Fall, wenn das Gerät vor iOS 9 läuft und möglicherweise für Versionen von iOS 9 bis 9.2). Der Einstiegspunkt ist die openURL-Funktion
  • Derselbe Branch-Initialisierungs-Callback, der in definiert ist didFinishLaunchingWithOptions wird auch vom Branch-Code aufgerufen, der in die Funktionen openURL und continueUserActivity eingefügt wird:

  • In OpenURL ist das: Branch.getInstance(). HandleDeepLink (url);
  • In continueUserActivity dies: Branch.getInstance() fortsetzen (userActivity)

Wenn diese Zweig Funktionen nicht genannt werden, würde die Branche init Rückruf, den Verbindungsparameter empfängt nicht aufgerufen werden, wenn Sie den App und Link wieder aufzunehmen. Parameter wären daher nicht verfügbar.

Auch wenn diese Funktionen aufgerufen werden, kann anderer Code in den Funktionen openURL und continueUserActivity verhindern, dass der Branch-Code erreicht wird. Wenn Sie anderen Code in diesen Codepfaden haben, vergewissern Sie sich, dass die entsprechenden Branch-Funktionen tatsächlich aufgerufen werden, indem Sie einen Breakpoint testen, der entweder auf der Verzweigungsfunktion oder einer Codezeile im Init-Callback festgelegt ist. Ein anderes mögliches Szenario, das zu Problemen beim Warmstart, aber nicht beim Kaltstart führen könnte, wäre, wenn der Code, der Branch-Parameter liest, außerhalb des Branch-Initialisierungs-Callbacks aufgerufen wird und bevor dieser Rückruf abgeschlossen wurde. Wenn die App in didFinishLaunchingWithOptions ausreichend ausgelastet ist, wird der init-Callback möglicherweise so lange verzögert, bis der init-Callback abgeschlossen ist, bevor die Parameter überprüft werden. Später, wenn die App fortgesetzt wird, kann weniger in der App passieren und der Code, der die Parameter überprüft, kann überprüft werden, bevor der Init-Rückruf abgeschlossen ist. Dies ist kein wahrscheinliches Szenario, aber es kann passieren.

Um diese "Race Condition" Art der Situation zu vermeiden, überprüfen Sie nur Branch Link Parameter aus dem Init Callback oder nach Erhalt einer Benachrichtigung, die konfiguriert wurde, um zu signalisieren, dass der Init Callback abgeschlossen ist (Sie können ein Beispiel sehen Verwenden von Benachrichtigungen auf diese Weise im TestBed-Swift-Projekt, das im SDK enthalten ist (hier: https://github.com/BranchMetrics/ios-branch-deep-linking/tree/master/Branch-TestBed-Swift).