2015-10-09 13 views
16

Ho implementato uno schema URL e lo uso per trasferire i dati alla mia app chiamando il metodo. L'intero codice viene mostrato come di seguitoAvvio dell'app tramite URL, ma OpenUrl non chiamato

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{ 
    // Check the calling application Bundle ID 
    if ([[url scheme] isEqualToString:@"yuvitime"]) 
    { 
     NSLog(@"URL scheme:%@", [url scheme]); 
     NSString * yuvitimeRequestValue = [url query]; 
     NSDictionary * userInfor = [[NSDictionary alloc]initWithObjectsAndKeys:yuvitimeRequestValue, @"YuvitimeRequest", nil]; 
     NSNotificationCenter * notificationCentre = [NSNotificationCenter defaultCenter]; 
     [notificationCentre postNotificationName:@"URLSCHEMEACTIVATEDNOTIFICATION" object:self userInfo:userInfor]; 

     return YES; 
    } 
    else 
     return NO; 
} 

Se la mia applicazione è in background, tutto funziona bene. Quando fai clic su un URL, l'app viene riportata in primo piano e l'URL viene gestito come codificato nella funzione precedente.

Tuttavia, se l'app viene chiusa (l'app non è ancora stata avviata), facendo clic sull'URL, avvia l'app senza chiamare la funzione di gestione mostrata sopra.

Dopo la ricerca attraverso, il miglior risultato riesco a ottenere è questa applicazione

: WillFinishLaunchingWithOptions: Quando è stato chiesto di aprire un URL, il risultato restituito da questo metodo è combinato con il risultato di ritorno dal application:didFinishLaunchingWithOptions: metodo per determinare se un URL deve essere gestito. Se uno dei due metodi restituisce NO, il sistema non chiama il metodo application:openURL:options :. Se non si implementa uno dei metodi, viene considerato solo il valore restituito del metodo implementato.

- Applicazione: didFinishLaunchingWithOptions: Questo metodo rappresenta la tua ultima possibilità di elaborare le eventuali chiavi nel dizionario launchOptions. Se non hai valutato le chiavi nel tuo metodo application:willFinishLaunchingWithOptions:, dovresti esaminarle con questo metodo e fornire una risposta appropriata. Gli oggetti che non sono delegati dell'app possono accedere agli stessi valori del dizionario launchOptions osservando la notifica denominata UIApplicationDidFinishLaunchingNotification e accedendo al dizionario userInfo della notifica. Tale notifica viene inviata poco dopo il ritorno di questo metodo. Il risultato di ritorno di questo metodo è combinato con il risultato di ritorno dal metodo application:willFinishLaunchingWithOptions: per determinare se un URL deve essere gestito. Se uno dei due metodi restituisce NO, l'URL non viene gestito. Se non si implementa uno dei metodi, viene considerato solo il valore restituito del metodo implementato.

Nonostante la spiegazione, non so ancora come farlo e non ho trovato nulla di concreto online.

Grazie

saluti

+0

prova - applicazione (BOOL): openURL: sourceApplication: annotazione: – larva

+0

ho provato entrambi, penso che il problema risieda nella configurazione di LaunchOptions come la documentazione suggeriva "Questa è l'ultima possibilità di elaborare i tasti". Ma non riuscivo a capire come. – progammingBeignner

+0

sei sicuro - (BOOL) application: handleOpenURL: non viene chiamato? problema sembra che nessun oggetto ascolti notifiche quando app init. puoi mostrare un avviso qui per confermare di nuovo – larva

risposta

24

Sono d'accordo con Kaloyan, "handleOpenURL" non viene mai chiamato al momento del lancio dell'applicazione. Quindi devi cercare l'URL in "launchOptions" in didFinishLaunchingWithOptions.

TUTTAVIA

ho adottato la stessa soluzione di Apple per example code QuickActions (3D Touch). Mantengo l'URL al momento del lancio in una variabile e lo gestisco in applicationDidBecomeActive:.

@interface MyAppDelegate() 
@property (nonatomic, strong) NSURL *launchedURL; 
@end 

@implementation MyAppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.launchedURL = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey]; 
    ... 
} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    if (self.launchedURL) { 
     [self openLink:self.launchedURL]; 
     self.launchedURL = nil; 
    } 
} 

- (BOOL) application:(UIApplication *)application 
      openURL:(NSURL *)url 
sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation 
{ 
    NSURL *openUrl = url; 

    if (!openUrl) 
    { 
     return NO; 
    } 
    return [self openLink:openUrl]; 
} 

- (BOOL)openLink:(NSURL *)urlLink 
{ 
    ... 
} 

@end 
7

Hi quando l'applicazione non viene avviato prima, il metodo "handleOpenURL" non viene mai chiamato. Devi controllare "launchOptions" in didFinishLaunchingWithOptions per oggetto con il tasto "UIApplicationLaunchOptionsURLKey"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey]; 
//call function to handle the url like in handleURL, but do not call handleURL directly 

} 
6

Credo che ci sia una risposta migliore ora come,

  • application:handleOpenURL:
  • application:openURL:sourceApplication:annotation: Entrambi sono obsoleti in iOS di Apple 9. suggerimento è:

Usa application:openURL:options: anziché.

application:openURL:options: ha un comportamento diverso rispetto a quelli vecchi, in quanto verrà eseguito nel caso in cui l'applicazione è stata in background o lancerà.

Quindi, è necessario gestire l'apertura dell'URL al suo interno solo. come di seguito:

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

    // Check the calling application Bundle ID 
    if ([[url scheme] isEqualToString:@"yuvitime"]) 
    { 
     NSLog(@"URL scheme:%@", [url scheme]); 
     NSString * yuvitimeRequestValue = [url query]; 
     NSDictionary * userInfor = [[NSDictionary alloc]initWithObjectsAndKeys:yuvitimeRequestValue, @"YuvitimeRequest", nil]; 
     NSNotificationCenter * notificationCentre = [NSNotificationCenter defaultCenter]; 
     [notificationCentre postNotificationName:@"URLSCHEMEACTIVATEDNOTIFICATION" object:self userInfo:userInfor]; 

     return YES; 
    } 
    else 
     return NO; 
} 
+2

questo metodo non viene chiamato se l'app viene uccisa e l'app viene aperta dagli schemi url. Sto provando su iOS 9.1 sul simulatore IOS –

1

2.x Swift

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { 

     if (url.scheme == "yuvitime") { 
      print("URL scheme:\(url.scheme)") 
      let yuvitimeRequestValue = url.query! 
      let userInfor = [ 
       "YuvitimeRequest" : yuvitimeRequestValue 
      ] 

      let notificationCentre = NSNotificationCenter.defaultCenter() 
      notificationCentre.postNotificationName("URLSCHEMEACTIVATEDNOTIFICATION", object: self, userInfo: userInfor) 
      return true 
     } 
     else { 
      return false 
     } 

    } 
3

Per iOS 10, utilizzare

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