Zdalne powiadomienie iOS 8
Jak mogę uzyskać Token urządzenia do zdalnego powiadamiania w systemie iOS 8?
Użyłem metody didRegisterForRemoteNotificationsWithDeviceToken
w AppDelegate
w iOS
7 answers
Odczytaj kod w aplikacji.h.
Będziesz wiedział, jak to zrobić.Pierwszy:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
Dodaj taki kod
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
#ifdef __IPHONE_8_0
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert
| UIUserNotificationTypeBadge
| UIUserNotificationTypeSound) categories:nil];
[application registerUserNotificationSettings:settings];
#endif
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
Jeśli nie używasz zarówno Xcode 5, jak i Xcode 6 ,wypróbuj ten kod
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
|UIRemoteNotificationTypeSound
|UIRemoteNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
(Dzięki za przypomnienie @ zeiteisen @ dmur)
Drugi:
Dodaj tę funkcję
#ifdef __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
//register to receive notifications
[application registerForRemoteNotifications];
}
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void(^)())completionHandler
{
//handle the actions
if ([identifier isEqualToString:@"declineAction"]){
}
else if ([identifier isEqualToString:@"answerAction"]){
}
}
#endif
I można dostać urządzenie w
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
Jeśli nadal nie działa, użyj tej funkcji i NSLog błąd
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-30 08:56:09
[6]} sposób, aby zarejestrować się na iOS 8 i utrzymać obsługę starszych wersji
UIApplication *application = [UIApplication sharedApplication];
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge
|UIUserNotificationTypeSound
|UIUserNotificationTypeAlert) categories:nil];
[application registerUserNotificationSettings:settings];
} else {
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
[application registerForRemoteNotificationTypes:myTypes];
}
I w aplikacji Dodaj
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
IOS8 może otrzymywać ciche powiadomienia bez pytania o zgodę. Call
- (void)registerForRemoteNotifications
. Po tym application:didRegisterForRemoteNotificationsWithDeviceToken:
będzie nazywany
Uwaga: wywołanie zwrotne z tokenem jest wywoływane tylko wtedy, gdy aplikacja pomyślnie zarejestrowała powiadomienia Użytkownika za pomocą poniższej funkcji lub jeśli włączone jest Odświeżanie aplikacji w tle.
Sprawdź ustawienia dla aplikacji, jeśli są Typ powiadomienia jest włączony. Jeśli nie, nie otrzymasz tokena urządzenia.
Możesz teraz otrzymywać ciche powiadomienia za pomocą
aps {
content-available: 1
}
W zgłoszeniu
Ale powiadomienia, które się pojawiają, nadal wymagają pozwolenia. Call
UIUserNotificationType types = UIUserNotificationTypeSound | UIUserNotificationTypeBadge | UIUserNotificationTypeAlert;
UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
[application registerUserNotificationSettings:notificationSettings];
Ten kod powinien poprosić o pozwolenie.
Teraz powinieneś być gotowy do otrzymywania powiadomień push
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-26 11:44:46
W moim przypadku zrobiłem niezbędne aktualizacje, aby zażądać dostępu powiadomień push dla iOS 7 i iOS 8, jednak nie zaimplementowałem nowego wywołania zwrotnego, gdy użytkownik iOS 8 przyznaje dostęp. Musiałem dodać tę metodę do mojego delegata aplikacji.
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[application registerForRemoteNotifications];
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-27 23:02:22
Jeśli pacjent stosuje lek Xamarin.iOS aby zbudować swoją aplikację mobilną, Możesz użyć tego fragmentu kodu, aby zażądać rejestracji powiadomień push]}
if (UIDevice.CurrentDevice.CheckSystemVersion(8,0))
{
UIUserNotificationType userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound;
UIUserNotificationSettings settings = UIUserNotificationSettings.GetSettingsForTypes(userNotificationTypes, null);
UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
}
else
{
UIRemoteNotificationType notificationTypes = UIRemoteNotificationType.Alert | UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound;
UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(notificationTypes);
}
Będziesz musiał również nadpisać metodę DidRegisterUserNotificationSettings
, aby uzyskać token urządzenia zwrócony z serwera APNS:
public override void DidRegisterUserNotificationSettings(UIApplication application, UIUserNotificationSettings notificationSettings)
{
application.RegisterForRemoteNotifications();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-30 22:02:26
Odpowiedź Madao ( https://stackoverflow.com/a/24488562/859742 ) ma rację, ale....
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
Powinno być bardziej "poprawne"
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert) categories:nil];
Te znaczniki mają te same wartości maski bitowej i dlatego oba mają działać, ale UIUserNotificationSettings
wymaga UIUserNotificationType
, a nie UIRemoteNotificationType
.
Poza tym nazwałbym
[application registerUserNotificationSettings:settings];
W metodzie AppDelegate
(w zależności od przyznanych praw),
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:02
Myślę, że lepszym sposobem na zachowanie kompatybilności wstecznej możemy iść z tym podejściem, to działa dla mojego przypadku nadzieję, że praca dla Ciebie. Również dość łatwe do zrozumienia.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-04 07:48:18
UIUserNotificationType types = UIUserNotificationTypeBadge |
UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
UIUserNotificationSettings *mySettings =
[UIUserNotificationSettings settingsForTypes:types categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
[application registerForRemoteNotifications];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-30 08:58:10