2013-08-12 19 views
7

Piszę aplikację na iOS i chciałbym, aby wstrzymać ruch zawartości mojej aplikacji, gdy system operacyjny decyduje się pokazać Notification Banner jak ten:Jak mogę otrzymywać powiadomienia o powiadomieniach bankowych w iOS?

Banner Notification

Czy istnieje system NSNotification że Czy obserwator lub metoda, która zostanie wywołana, na którą mogę zareagować? Próbowałem już applicationWillResignActive, ale to nie jest wywoływane w tym przypadku.

+1

Tańce taniej: Czy zmienia się ramka okna? Jeśli tak, to czy możesz wypróbować KVO na granicach okna aplikacji? – Moshe

+0

Krótka odpowiedź: nic legalnego. APNS został zaprojektowany jako model klient-serwer, więc nigdy nie powinieneś być powiadamiany o baneru, który nie jest twój. Długa odpowiedź: pojawiają się banery powiadomień, dlatego muszą to być widoki lub warstwy. Tak czy siak, mam przeczucie, że hierarchia okien prawdopodobnie zmienia się po wyświetleniu banera. – CodaFi

+1

@ CodaFi- Przypuszczam jednak, że powiadomienie nie znajduje się w * twoim * oknie i jest całkowicie poza hierarchią widoku Twojej aplikacji. – BergQuester

Odpowiedz

2

Dziś rano zabrałem się do ataku i jestem skłonny powiedzieć, że nie ma tam publicznego API.

Próbowałem użyć kodu oznaczonego here i nie otrzymałem żadnych powiadomień. Następnie przeprowadziłem kilka "testów", aby sprawdzić, czy mogę coś znaleźć.

Aby przetestować, stworzyłem parę aplikacji: one to schedule notifications (GitHub link) i one to try and "catch" them (GitHub link). W mojej aplikacji Sender mogę wysyłać N powiadomień co N sekund. Wybrałem arbitralnie wysoką wartość i wysłałem je.

W moim chwytaczem próbowałem patrzeć na wartości visibleRect w górę i w dół hierarchii warstw. (Klucz keyWindow żyje w warstwie, ale to superview, a super layer.delegate są zarówno zerowe) Nie sprawdzałem ograniczeń, ale to nie powinno mieć znaczenia. Spojrzałem na okno aplikacji, to jest zero superview, to warstwa, to subviews. Granice aplikacji również nie są spełnione. Aplikacja jest tak dobrze wykonana w piaskownicy, że trampolina i centrum powiadomień nie istnieją w świecie aplikacji.

Zacząłem podążać ścieżką dostępu do prywatnych szkieletów, ale zdecydowałem, że nie było to warte wysiłku.

Otworzyłem Instrumenty i przyjrzałem się poziomom przezroczystości widoków. (Czy można zmusić wszystkie widoki w hierarchii do nieprzezroczystości, a następnie użyć tego do sprawdzenia, czy baner coś blokuje? Być może nie blokuje, jeśli jest przezroczysty?)

Próbowałem również zrzut ekranu i sprawdź kolory w górnej części ekranu, ale to nie zadziała, ponieważ musisz przekazać widok do kontekstu. Nawet gdyby to działało, nie byłoby szczególnie wydajne.

Inną moją myślą byłoby wysłuchanie powiadomień push na porcie wypychania, ale wątpię, czy Apple pozwoliłoby ci odbierać powiadomienia innej aplikacji. Jako programista nie wysyłałbym prywatnych informacji w powiadomieniu, ale nadal jest to problemem.

Prawda jest taka, że ​​banery powiadomień tak naprawdę nie powodują, że twoja aplikacja staje się nieaktywna, więc nie jestem pewien, czy to zachowanie jest złe. Jeśli jest to wygoda, zgłoś błąd. Co powiesz na zgłoszenie DeviceWillShowNotificationNotification?

Powiązane problemy