Nano Hash - криптовалюты, майнинг, программирование

iOS 8 Silent Push Notification не запускает метод didReceiveRemoteNotification, когда приложение не подключено к xcode

Я видел слишком много вопросов о том, что тихое push-уведомление не работает, если устройство не подключено к xcode, но я не мог найти реального ответа. Я использую Silent APN для запуска процесса в фоновом режиме, а затем запускаю локальное push-уведомление

  1. Сервер отправляет эту информацию:

    "_metadata" =     {
        bagde = 1;
        pushText = "semeone has sent you a message!!";
        sender = "semeone";
    };
    aps =     {
        "content-available" = 1;
    };
    

    И _metadata - это настроенная информация для запуска локального уведомления, я не включил значок, pushText ... в aps, потому что это тихое push-уведомление.

  2. Клиент должен получить информацию в didReceiveRemoteNotification,

    -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    {
    if(application.applicationState != UIApplicationStateActive ){
            if([userInfo[@"aps"][@"content-available"] intValue]== 1) //it's the silent notification
            {
                //start a background task 
                UIBackgroundTaskIdentifier preLoadPNTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
                    NSLog(@"Background task to start a process ");
                }];
                //end completionHandler regarding to fetchCompletionHandler
                completionHandler(UIBackgroundFetchResultNewData);
    
                // doing my process...... and fire a local notification
    
                if(preLoadPNTask){
                    NSLog(@"End Background task ");
                    [[UIApplication sharedApplication] endBackgroundTask:preLoadPNTask];
                    preLoadPNTask = 0;
                }
                return;
            }
            else
            {
                NSLog(@"didReceiveRemoteNotification it's NOT the silent notification ");
                completionHandler(UIBackgroundFetchResultNoData);
                return;
            }
    
        }
    else {
        if(preLoadPNTask){
            NSLog(@"End Background task ");
            [[UIApplication sharedApplication] endBackgroundTask:preLoadPNTask];
            preLoadPNTask = 0;
        }
        completionHandler(UIBackgroundFetchResultNewData);
    }
    
    }
    

Он отлично работает, когда устройство подключается к xcode, но когда это не так, didReceiveRemoteNotification не запускается :(

Любые идеи?

Заранее спасибо!!


  • Какую задачу вы выполняете при получении уведомления? 24.12.2014
  • Я добавляю в NSMutableDictionary идентификатор и отправителя, затем отправляю данные в Worklight [[WL sharedInstance] sendActionToJS: @silentNotification withData: dictionary]; а затем я отпускаю локальное уведомление localNotif.soundName = UILocalNotificationDefaultSoundName; localNotif.applicationIconBadgeNumber = значок; localNotif.alertBody = textAlert; localNotif.userInfo = userInfoData; [[UIApplication sharedApplication] scheduleLocalNotification: localNotif]; [выпуск localNotif]; 24.12.2014
  • как узнать, вызывается ли метод didReceiveRemoteNotification? 24.12.2014
  • Потому что я вижу в журналах устройств этот NSLog (задача @Background для запуска процесса); и запускает локальное push-уведомление, но если устройство не подключено, оно не запускает локальное push-уведомление 26.12.2014
  • Я столкнулся с такой же ситуацией с вами, @jan. Пока не могу решить. (iOS 8.1.2) 11.01.2015
  • У меня такая же проблема. Я использую Xamarin для создания приложения для iPhone, а в iOS 8.1.x метод DidReceiveRemoteNotification () надежно вызывается только тогда, когда телефон подключен к компьютеру. Одного подключения к зарядному устройству недостаточно. Когда не подключено, событие вызывается только иногда, с небольшим или отсутствующим очевидным шаблоном. Кроме того, даже немые уведомления тоже не всегда работают, так что проблема не только в тихих (которые, как я понимаю, могут быть ограничены по скорости, хотя я не отправляю достаточно, чтобы нарушить какой-либо разумный предел) iOS 7.x похоже, не имеет такой же проблемы 02.03.2015
  • Я тестировал это на устройствах iOS 7 и iOS 8. Я столкнулся с той же проблемой с устройствами iOS 8 и не мог понять, что происходит. На моем устройстве iOS 7 все работает - приходят тихие уведомления (с xcode или без). На моем устройстве iOS 8 тихие уведомления вообще не принимаются (без Xcode). Однако он работает на 100% с Xcode. Если кто-нибудь из вас найдет решение, дайте мне знать. 04.03.2015
  • Вы нашли решение этого? 10.03.2015
  • Я убежден, что вам нужно пойти в Apple и пожать кому-нибудь руку или принести кофе, а затем они устанавливают флаг, который позволяет некоему скрытому флагу в APNS сказать «ОК», пусть приложение просыпается от толчка. У простых смертных разработчиков это просто не работает. Я только что создал пустую оболочку приложения с помощью простого кода push, запустил новое приложение в Parse, регулярные нажатия работают отлично. Отправки в неработающее приложение просто не работают, и все, что я когда-либо читал, было адресовано. Вздох. Хорошая идея, Apple, но (и я готов ошибаться) она просто не работает, как описано. 26.04.2015

Ответы:


1

В итоге у меня был кабель USB, который, по-видимому, вызывал у меня некоторые проблемы, по-видимому, каждый раз, когда я подключал устройство iphone, сказал, что «этот аксессуар может не поддерживаться», но он продолжает работать нормально, поэтому я заменяю его на новый, но это не решить мою проблему, однако могу быть частью этого. поэтому я просмотрел код и внес некоторые изменения после получения 2 или более тихих push-уведомлений, которые preLoadPNTask (UIBackgroundTaskIdentifier) ​​создавал много раз, поэтому я добавил проверку перед ее запуском,

if(!preLoadPNTask){
//start a background task 
            UIBackgroundTaskIdentifier preLoadPNTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
                NSLog(@"Background task to start a process ");
            }];

 }

Надеюсь, это поможет вам С уважением

11.03.2015
  • Также не забудьте закрыть preLoadPNTask (BackgroundTask) до 3 минут, иначе приложение выйдет из строя. 11.03.2015

  • 2

    В ios 8 вам необходимо выполнить следующие шаги, чтобы запустить didReceiveRemoteNotification: метод

    1. Выберите цель проекта перейти на вкладку Возможности
    2. Выберите «Фоновые режимы», чтобы включить.
    3. Он добавит ключ (обязательные фоновые режимы) в ваш проект info.plist

    После этих изменений, когда вы получаете push-уведомление Apple, и если приложение уже находится в фоновом режиме, то didReceiveRemoteNotification будет запущен.

    23.03.2015

    3

    Вероятно, потому что в iOS 8 вам нужно по-другому запрашивать push-уведомления. Попробуй это:

    -(void) registerForPushNotifications {
    
    UIApplication* application=[UIApplication sharedApplication] ;
    
    // Register for Push Notitications, if running iOS 8
    if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound);
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:userNotificationTypes categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    
    } else {
        // Register for Push Notifications before iOS 8
        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound)];
    }
    

    }

    01.04.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..