Starten App mit URL (via UIApplicationDelegate handleOpenURL) arbeitet unter iOS 4, aber nicht unter iOS 3.2

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

Frage

Ich habe UIApplicationDelegate der

implementiert
application:didFinishLaunchingWithOptions:

und

application:handleOpenURL:

gemäß der Spezifikation, das heißt,

application:didFinishLaunchingWithOptions:
returns YES 

und

application:handleOpenURL: opens the URL. 

Der Code funktioniert unter IOS 4 (in beiden Fällen, das heißt, wenn die Anwendung gestartet wird, und wenn es wird von suspendierten Zustand aktiv ist). Allerdings ist der Code nicht funktioniert unter iOS 3.2.

War es hilfreich?

Lösung

ich eine Antwort auf meine eigene Frage geben. Herauszufinden, nahm die Lösung eine Weile, und war ziemlich frustrierend. Wenn Sie eine Internet-Suche starten Sie einige Teilantworten finden, aber es hat mich noch eine Weile, um Arbeit aus der folgenden Lösung, und ich hoffe, dass es einige Klarheit hinzufügt.

So zuerst, das empfohlene Verhalten der App erscheint die folgende (siehe Öffnen Unterstützte Dateitypen in iOS Ref Lib):

  • nicht implementieren applicationDidFinishLaunching: (siehe Hinweis unter UIApplicationDelegate )
  • Implementieren application:didFinishLaunchingWithOptions: und überprüfen Sie die URL, Rückkehr JA, wenn Sie es öffnen kann, sonst nein, es aber nicht öffnen.
  • Implementieren application:handleOpenURL: und öffnen Sie die URL, Rückkehr JA, wenn erfolgreich, andernfalls NO.

In iOS 4, eine URL zu einem App Ergebnissen in einem der beiden folgenden Verhaltensweisen übergeben:

  • Wenn die App dann gestartet wird application:didFinishLaunchingWithOptions: genannt wird und application:handleOpenURL: wird aufgerufen, wenn und application:didFinishLaunchingWithOptions: JA zurückgegeben.
  • Wenn die App immer aktiv von suspendierten Zustand dann wird application:didFinishLaunchingWithOptions: nicht genannt, aber application:handleOpenURL: genannt wird.

Doch in iOS 3.2 scheint es, als ob application:handleOpenURL: nie aufgerufen wird! Ein Hinweis, dass das Verhalten unter iOS 3.2 unterscheidet, kann unter Umgang mit URL-Anforderungen . Dort finden Sie, dass application:handleOpenURL: aufgerufen, wenn application:didFinishLaunchingWithOptions: nicht implementiert ist, aber applicationDidFinishLaunching: umgesetzt wird. Aber application:handleOpenURL: wird nicht aufgerufen, wenn application:didFinishLaunchingWithOptions: umgesetzt wird.

Damit eine Lösung den Code Arbeit unter 3.2 und 4.0 zu machen ist:

  • Öffnen Sie die URL in application:didFinishLaunchingWithOptions:, aber dann kein Zurück mehr gibt, dass application:handleOpenURL: zu verhindern aufgerufen wird.
  • Öffnen Sie die URL in application:handleOpenURL:, falls Sie sind unter 4.0 und die App war in haltenen Zustand.

Ich fand diese Lösung in einem anderen Beitrag, aber ich war verwirrt, weil es die Empfehlung in iOS Ref Lib Dokumentation wider (nämlich, dass wir in application:didFinishLaunchingWithOptions: zurückkehren JA sollen). (An diesem Punkt habe ich nicht erkennen, dass die Dokumentation widerspricht sie sich selbst).

Ich glaube, dass die aktuellen iOS 4.0 Verhalten das zukünftige Verhalten sein werden ich die folgende Lösung bevorzugen:

  • Do applicationDidFinishLaunching: nicht implementieren.
  • Implementieren application:didFinishLaunchingWithOptions: und überprüfen Sie die URL, Rückkehr JA, wenn Sie es öffnen kann, sonst nein, es aber nicht öffnen. Wenn wir auf 3.2, öffnen Sie die URL sind.
  • Implementieren application:handleOpenURL: und öffnen Sie die URL, Rückkehr JA, wenn erfolgreich, andernfalls NO.

Also zusammenfassend, implementiere ich die iOS 4 Verhalten und die folgende Zeile application:didFinishLaunchingWithOptions: hinzugefügt

    if([[[UIDevice currentDevice] systemVersion] hasPrefix:@"3.2"]) {
        [self application:application handleOpenURL:url];
    }

, die den Code Arbeit unter 3.2 zu machen.

Andere Tipps

application:handleOpenURL: ist jetzt veraltet.

Wie von iOS 4.2, können Sie diese zum Öffnen URLs verwenden:

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

Dokumentation:

https://developer.apple .com / library / ios / # DOKUMENTATION / UIKit / Reference / UIApplicationDelegate_Protocol / Reference / reference.html

Ich begann Anwendung zu schreiben, die Dropbox api verwendet. Um zu verstehen, Konzept, lief ich eine Beispielanwendung mit meinem Key / secret bei Dropbox / developer erwähnt Dokumentation . Sobald Beispielanwendung arbeiten begann, habe ich denselben Schlüssel / geheimen Werte für meine Anwendung.

Für Beispielanwendung, die Umsetzung von handleOpenURL (oder openURL auf iOS 4.2) wird wie erwartet ausgeführt. Aus irgendeinem Grund war es nicht der Fall für meine Anwendung. Meine App eingegeben Hintergrund, um Login-Bildschirm und Authentifizierungsseite von Dropbox zu zeigen. Nach der erfolgreichen Anmeldung und Authentifizierung, meine app nie Vordergrund getreten. Es galt für beide Plattform Simulator und Gerät (iPad)

Ich habe alles versucht fast aufgeführt im Internet einschließlich diesem Beitrag. Vielen Dank. Es war kein Erfolg, aber.

Endlich, es SCHRITTE Arbeit für meine Anwendung, wenn ich habe folgende:

  • Ein Simulator, wählen. "IOS Simulator -> Zurücksetzen Inhalt und Einstellungen", und setzen
  • Ein Gerät, das ich gelöscht hat Beispielanwendung im Zusammenhang ausführbare Datei und die wiederum löschen Cache verknüpft.

Fügen Sie Folgendes am Ende 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;
}

wo mvc mein Hauptviewcontroller ist, und nc meine Navigationssteuerung.

Dann in der Mainviewcontroller, etwas zu tun, wie folgt aus:

- (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];
    ...
}

nach handleOpenURL im .h natürlich erklärt.

Dank geht an Christian für dafür in der Bemühung setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top