Podczas próby rejestracji powiadomień wypychanych w systemie iOS 8.x:
application.registerForRemoteNotificationTypes(UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound)
Otrzymuję następujący błąd:
registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later.
Jakieś pomysły, jaki jest nowy sposób? Działa, gdy uruchomię tę aplikację Swift na iOS 7.x.
EDYTOWAĆ
Na iOS 7.x, gdy dołączam kod warunkowy, który otrzymuję (albo SystemVersion warunkowy, albo # if __IPHONE_OS_VERSION_MAX_ALLOWED> = 80000)
dyld: Symbol not found: _OBJC_CLASS_$_UIUserNotificationSettings
objective-c
ios8
apple-push-notifications
dyld
Wojtek Turowicz
źródło
źródło
Odpowiedzi:
Jak opisano, będziesz musiał użyć innej metody opartej na różnych wersjach iOS. Jeśli Twój zespół używa zarówno Xcode 5 (który nie wie o żadnych selektorach iOS 8), ani Xcode 6, musisz użyć kompilacji warunkowej w następujący sposób:
Jeśli używasz tylko Xcode 6, możesz trzymać się tylko tego:
Powodem jest to, że sposób uzyskiwania uprawnień do powiadomień zmienił się w iOS 8. A
UserNotification
jest komunikatem wyświetlanym użytkownikowi, zarówno ze zdalnego, jak i lokalnego. Musisz uzyskać pozwolenie, aby je pokazać. Jest to opisane w filmie WWDC 2014 „Co nowego w powiadomieniach iOS”źródło
__IPHONE_OS_VERSION_MAX_ALLOWED
sprawdzić, ponieważ jest to sprawdzanie czasu kompilacji.registerUserNotificationSettings:
jest tutajDla iOS <10
Dla iOS10
źródło
systemVersion
, powinieneś sprawdzić[[UIApplication sharedApplication] respondsToSelector:@selector(isRegisteredForRemoteNotifications)]
[[UIApplication sharedApplication] registerForRemoteNotifications];
nie przejdzie doapplication:didRegisterForRemoteNotificationsWithDeviceToken:
lubapplication:didFailToRegisterForRemoteNotificationsWithError:
jeśli użytkownik wyłączy „Zezwalaj na powiadomienia” w Ustawieniach -> Powiadomienia -> <Moja aplikacja>.Opierając się na odpowiedzi @ Prasath. Oto jak to robisz w Swift :
źródło
iOS 8 zmienił rejestrację powiadomień w sposób niezgodny wstecz. Chociaż musisz obsługiwać iOS 7 i 8 (i chociaż aplikacje zbudowane z 8 SDK nie są akceptowane), możesz sprawdzić potrzebne selektory i warunkowo wywołać je poprawnie dla działającej wersji.
Oto kategoria dotycząca aplikacji UIApplication, która ukryje tę logikę za czystym interfejsem, który będzie działał zarówno w Xcode 5, jak i Xcode 6.
Nagłówek:
Realizacja:
źródło
Settings
i wyłączę powiadomienia,isRegisteredForRemoteNotifications
nadal wracaYES
Myślę, że jest to lepszy sposób na zachowanie kompatybilności wstecznej, jeśli zastosujemy to podejście, działa ono w moim przypadku i mam nadzieję, że zadziała. Również dość łatwe do zrozumienia.
źródło
if ([UIApplication instancesRespondToSelector:@selector(registerForRemoteNotifications)])
jak pokazano tutajDla osób skłonnych do szybkiego:
źródło
Nie mogłem ustalić, do czego należy ustawić zmienną NSSet „kategorie”, więc jeśli ktoś mógłby mnie wypełnić, chętnie zredaguję ten post. Jednak poniższe okno dialogowe wyświetla powiadomienie wypychane.
Edycja: Otrzymałem powiadomienie push, aby wysłać na mój telefon ten kod, więc nie jestem pewien, czy parametr kategorii jest konieczny.
źródło
categories
służy do konfigurowania działań powiadomień w iOS 8. Możesz zobaczyć wideo WWDC 2014 „Co nowego w powiadomieniach iOS”, aby uzyskać więcej informacjiOkazuje się więc, że ponieważ AnyObject jest duchowym następcą id, możesz wywołać dowolną wiadomość na AnyObject. Jest to odpowiednik wysłania wiadomości do id. Ok, w porządku. Ale teraz dodajemy koncepcję, że wszystkie metody są opcjonalne w AnyObject i mamy coś, z czym możemy pracować.
Biorąc pod uwagę powyższe, miałem nadzieję, że mogę po prostu przesłać UIApplication.sharedApplication () do AnyObject, a następnie utworzyć zmienną równą sygnaturze metody, ustawić tę zmienną na opcjonalną metodę, a następnie przetestować zmienną. To nie działało. Domyślam się, że po kompilacji z zestawem SDK systemu iOS 8.0 kompilator wie, gdzie według niego powinna być ta metoda , więc optymalizuje to wszystko do wyszukiwania pamięci. Wszystko działa dobrze, dopóki nie spróbuję przetestować zmiennej, w którym to momencie otrzymam EXC_BAD_ACCESS.
Jednak w tym samym przemówieniu WWDC, w którym znalazłem klejnot o tym, że wszystkie metody są opcjonalne, używają Łańcucha Opcjonalnego, aby wywołać metodę opcjonalną - i wydaje się, że to działa. Słaba część polega na tym, że musisz faktycznie wywołać metodę, aby dowiedzieć się, czy ona istnieje, co w przypadku rejestrowania powiadomień stanowi problem, ponieważ próbujesz dowiedzieć się, czy ta metoda istnieje przed utworzeniem metody Obiekt UIUserNotificationSettings. Wygląda na to, że wywołanie tej metody na zero jest w porządku, więc rozwiązaniem, które wydaje się dla mnie działać, jest:
Po wielu związanych z tym poszukiwaniach kluczowe informacje pochodzą z tego przemówienia WWDC https://developer.apple.com/videos/wwdc/2014/#407 w środkowej części w sekcji o „Opcjonalnych metodach w protokołach”
W Xcode 6.1 beta powyższy kod już nie działa, poniższy kod działa:
źródło
Jeśli chcesz dodać obsługę IOS7 IOS8, możesz zastosować ten kod w swoim projekcie.
źródło
Po Xcode 6.1 Beta poniższy kod działa, nieznaczna edycja kodu Tom S, który przestał działać z wersją beta 6.1 (działał z poprzednią wersją beta):
źródło
Możesz tego użyć
źródło
Swift 2.0
źródło
Jeśli wszystko, czego potrzebujesz, to kod ios 8, to powinno to zrobić.
źródło
To jest czystszy sposób, który robię i po prostu działa świetnie
źródło
dla iOS 8 i nowszych
źródło