it-swarm-eu.dev

zařízení se systémem iOS 8, které nepřijímá oznámení Push po aktualizaci kódu

Nedávno jsem upgradoval jeden z mých testovacích iphones na iOS 8 a pak aktualizoval Push registrační kód Jak je uvedeno níže (pomocí xCode 6)

-(BOOL)hasNotificationsEnabled {

    NSString *iOSversion = [[UIDevice currentDevice] systemVersion];
    NSString *prefix = [[iOSversion componentsSeparatedByString:@"."] firstObject];
    float versionVal = [prefix floatValue];


    if (versionVal >= 8)
    {

        NSLog(@"%@", [[UIApplication sharedApplication]  currentUserNotificationSettings]);
        //The output of this log shows that the app is registered for Push so should receive them

        if ([[UIApplication sharedApplication] currentUserNotificationSettings].types != UIUserNotificationTypeNone) {

            return YES;

        }

    }
    else
    {
        UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
        if (types != UIRemoteNotificationTypeNone){
            return YES;
        }

    }

    return NO;
}

-(void)registerForPUSHNotifications {

    NSString *iOSversion = [[UIDevice currentDevice] systemVersion];
    NSString *prefix = [[iOSversion componentsSeparatedByString:@"."] firstObject];
    float versionVal = [prefix floatValue];


    if (versionVal >= 8)
    {


            //for iOS8
        UIUserNotificationSettings *settings =
        [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert |
         UIUserNotificationTypeBadge |
         UIUserNotificationTypeSound categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];


    }
    else
    {

            [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];


    }
}

Navzdory tomuto upgradu a skutečnosti, že [[UIApplication sharedApplication] currentUserNotificationSettings] ukazuje, že je pro zařízení aktivováno Push, není přijímám Push notifikace. 

Používám Parse a dělám vše podle knihy, pokud se jich týkají ( https://parse.com/tutorials/ios-Push-notifications ).

Má někdo stejný problém? Existuje něco, co mi může chybět?

31
Zigglzworth

Způsob registrace oznámení Push byl změněn v systému iOS 8: Níže je uveden kód pro všechny verze do iOS 9:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)])
{
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];

}
else
{
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}

V případě, že chcete zkontrolovat, zda jsou Push notifikace povoleny nebo nepoužívají, pod kódem:

- (BOOL) pushNotificationOnOrOff
{
    if ([UIApplication instancesRespondToSelector:@selector(isRegisteredForRemoteNotifications)]) {
        return ([[UIApplication sharedApplication] isRegisteredForRemoteNotifications]);
    } else {
        UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
        return (types & UIRemoteNotificationTypeAlert);
    }
}

#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

Výše uvedený kód bude fungovat pouze na Xcode 6+ ...

70
pankaj

Přidat tento řádek v horní části souboru .m

 #define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)

1) Když se zaregistrujete pro Push notifikaci v IOS8, musíte dát podmínku. Přidat tento kód do aplikace did finish launch.

if(IS_IOS_8_OR_LATER) {
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes: (UIRemoteNotificationTypeBadge
                                                                                         |UIRemoteNotificationTypeSound
                                                                                       |UIRemoteNotificationTypeAlert) categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
 } else {
    //register to receive notifications
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
 }

2) Poté přidejte tyto metody pro IOS8

#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

Poté bude vyvolána metoda oznámení delegátem. doufám, že to vám pomůže !!!

12
Nits007ak

Runtime a staré bezpečné kompilátory kompilátoru ... pokud spouštíte ve starém xcode (5.0 nebo starší)

    // changes of API in iOS 8.0
- (void) registerForPushNotification
{
    NSLog(@"registerForPushNotification");
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    {

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_8_0 //__IPHONE_8_0 is not defined in old xcode (==0). Then use 80000

        NSLog(@"registerForPushNotification: For iOS >= 8.0");

        [[UIApplication sharedApplication] registerUserNotificationSettings:
            [UIUserNotificationSettings settingsForTypes:
                (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge)
                                              categories:nil]];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
#endif
    } else {
        NSLog(@"registerForPushNotification: For iOS < 8.0");
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
    }
}
4
karim
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    // For iOS 8

[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];

 [[UIApplication sharedApplication] registerForRemoteNotifications];
} 

else 
{
    // For iOS < 8
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}

Po tomto:

  1. Smazat aplikace, které nemají Push oznámení již tvoří zařízení.
  2. Zařízení zcela vypněte a znovu zapněte.
  3. Přejděte na nastavení a nastavte datum a čas dopředu na den
  4. Zařízení opět vypněte a otočte zpět
  5. Nainstalovat aplikace znovu a bude požádat o oznámení, jako při prvním instalaci.
  6. Znovu nastavte datum a čas, pokud není automaticky nastaven.

Tím se obnoví nastavení oznámení. Znovu nainstalujte aplikaci a vše bude fungovat dobře :)

4
Muzammil

Zkuste to, pokud máte verze iOS 8 i starší verze:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
    // For iOS 8
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
    [[UIApplication sharedApplication] registerForRemoteNotifications];
} else {
    // For iOS < 8
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}

Z webu společnosti Apple:

UIUserNotificationSettings

Objekt UIUserNotificationSettings zapouzdří typy oznámení , Které mohou být uživateli zobrazeny vaší aplikací. Aplikace, které Používají viditelné nebo zvukové výstrahy ve spojení s lokálním nebo Push Upozorněním, musí zaregistrovat typy výstrah, které používají. UIKit Koriguje informace, které poskytnete, s preferencemi uživatele, aby Určily, jaké typy výstrah může aplikace používat.

Tuto třídu použijte k zahrnutí počáteční žádosti o registraci a zobrazení výsledků požadavku. Po vytvoření instance této třídy a zadání upřednostňovaného nastavení zavolejte metodu registerUserNotificationSettings: třídy UIApplication a zaregistrujte tato nastavení. Po kontrole požadavku proti uživatelským preferencím aplikace doručí výsledky do metody application:didRegisterUserNotificationSettings: svého delegáta aplikace. Objekt předaný této metodě určuje typy oznámení, která může aplikace používat.

Kromě registrace typů výstrah vaší aplikace můžete tuto třídu použít také k registraci skupin vlastních akcí, které se budou zobrazovat ve spojení s místními nebo Push notifikacemi. Vlastní akce představují okamžité úkoly, které může vaše aplikace provést v reakci na oznámení. Definujete skupiny akcí a spojíte celou skupinu s daným oznámením. Když se zobrazí odpovídající upozornění, systém přidá tlačítka pro každou zadanou akci. Když uživatel klepne na tlačítko pro jednu z akcí, systém probudí vaši aplikaci a zavolá metodu application:handleActionWithIdentifier:forRemoteNotification:completionHandler: nebo application:handleActionWithIdentifier:forLocalNotification:completionHandler: svého delegáta aplikace. K provedení požadované akce použijte tyto metody.

1
Sujith Thankachan

Velmi jednoduché:

Přidejte následující řádek v didFinishLaunchingWithOptions vašeho projektu v xcode6

 [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
 [[UIApplication sharedApplication] registerForRemoteNotifications];
1
Divya Bharathi

Snažil jsem se získat informace o typu objektu nastavení a zjistil jsem, že vlastnost type je v podstatě bitmask. Zde je návod, jak můžete získat informace.

Můj příklad je v Swift a> = iOS 8.0.

    let settings = UIApplication.sharedApplication().currentUserNotificationSettings()

    if settings.types.rawValue & UIUserNotificationType.Alert.rawValue == UIUserNotificationType.Alert.rawValue
    {
       // can receive alert!
    }
    else
    {
       // if the user is not even able to receive alerts, show him a hint on how to reenable notifications in system settings
    }

    if settings.types.rawValue & UIUserNotificationType.Badge.rawValue == UIUserNotificationType.Badge.rawValue
    {
        // can receive badge!
    }
    if settings.types.rawValue & UIUserNotificationType.Sound.rawValue == UIUserNotificationType.Sound.rawValue
    {
        // can receive sound!
    }
0
Raphael
The code below resolved:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
{
    UIUserNotificationType types;
    types = [[UIApplication sharedApplication] currentUserNotificationSettings].types;
    if (types & UIUserNotificationTypeAlert)
        pushEnabled=YES;
    else
        pushEnabled=NO;
}
else
{
    UIRemoteNotificationType types;
    types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
    if (types & UIRemoteNotificationTypeAlert)
       pushEnabled=YES;
    else
       pushEnabled=NO;

}
0
Adelmo Júnior