7

Mam widget, który wywołuje odpowiednią aplikację przez NSURL i extensionContext, aby aktywować określoną akcję w aplikacji.Unikaj utraty powiadomień wysyłanych przez widget ze względu na ekran spamu lub nieprawidłowy kontroler aktywny

W application:openURL:options: metody AppDelegate za mam:

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool { 
    if let path = url.path{ 
     if path.containsString("action"){ 
      NSNotificationCenter.defaultCenter().postNotificationName(MyViewController.purchasmyActionKey, object: nil) 
     } 
    } 
    return true 
} 

Gdy aplikacja jest otwarta i ma MyViewController czynną, akcja jest wykonana perfekcyjnie. Ale jeśli jestem na innym kontrolerze widoku w aplikacji lub aplikacja jest zamknięta, akcja nie jest wykonywana.

Czy ktoś może ustawić mnie na dobrej drodze?

NB: Moim głównym kontrolerem jest UITabBarController z różnymi kontrolerami widoków podrzędnych. Niektóre z nich to UINavigationControllers (które zawierają kontrolery gridowe), a druga to ListViewController.

Odpowiedz

2

Najprostszą opcją jest pokazanie kontrolera widoku, który obsługuje to jako modalny kontroler kart. Zwykle jest to najmniej skomplikowane i najczystsze, ponieważ użytkownik może łatwo powrócić do tego, co robił przed tą interakcją, kiedy skończą.

Jeśli nie można zrobić, że z jakiegoś powodu:

Trzeba wyznaczyć jakąś klasę odpowiedzialność za zapewnienie, że właściwy kontroler widoku jest pokazane i powiedział do działania żądanie, gdy zawiadomienie jest postrzegana. Może to być delegat aplikacji bezpośrednio, kontroler paska kart lub inna określona klasa, którą tworzysz i podajesz z odniesieniem do kontrolera kart.

Jego zadaniem jest sprawdzenie stanu kontrolera tabulacji i wyświetlenie odpowiedniego kontrolera widoku, jeśli jest to wymagane, a następnie nakazanie kontrolerowi widoku podjęcia działania.

Ta klasa, która jest właścicielem tej logiki, może być tą, która obserwuje Twoje powiadomienie, lub możesz po prostu przekazać wiadomość bezpośrednio, ponieważ delegat aplikacji prawdopodobnie będzie znał instancję lub tworzył nowe wystąpienie.