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

Author: radiovisual, 2014-06-14

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
 180
Author: Madao,
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

 75
Author: zeiteisen,
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];
}
 15
Author: Kyle Clegg,
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();
}
 1
Author: Michael Kniskern,
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
 1
Author: Ilker Baltaci,
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)];
    }
 0
Author: Hussain KMR Behestee,
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];
 0
Author: Dev_Tandel,
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