Требуется ли для удаленных push-уведомлений добавить UIBackgroundModes в Info.plist?

105

Я интегрировал удаленные push-уведомления, но получаю это предупреждение:

didReceiveRemoteNotification:fetchCompletionHandler:], но вам все равно нужно добавить " remote-notification" в список поддерживаемых UIBackgroundModeв вашем Info.plist.

Моя версия Xcode - 8.3.1. Я действительно хочу добавить это в Info.plist. Я тоже следил за некоторыми учебниками, но они тоже не упоминали об этом. Что мне на самом деле делать?

user1960169
источник

Ответы:

247

Да, вы должны включить фоновые режимы / удаленные уведомления, чтобы иметь возможность использовать удаленные уведомления для фоновых обновлений.

Проще всего это сделать через настройки проекта. Перейдите в Цели -> Ваше приложение -> Возможности -> Фоновые режимы и отметьте Удаленные уведомления . Это автоматически активирует необходимые настройки.

Выпадающий список фоновых режимов в настройках проекта

Тамаш Сенгель
источник
3
Я уже проверял это поле, но все равно получаю ту же ошибку.
Anuj
Анудж см. Мой ответ ниже
Джошуа Клит
1
Я не согласен с этим ответом. Вы должны включать Фоновые режимы -> Удаленные уведомления только в том случае, если вы используете удаленное уведомление для фонового обновления. См. Документацию здесь Настройка уведомления об обновлении в
фоновом режиме
1
@jzeferino Спасибо за уведомление, я добавил пояснение к своему ответу. Обратите внимание, что исходный вопрос касался application(_:didReceiveRemoteNotification:fetchCompletionHandler:)функции, которая используется для обработки выборки данных.
Tamás Sengel
Это здорово, но отвечает на вопрос, нужна ли вам возможность фоновых обновлений, что, конечно, вам нужно. Я опубликовал ответ о том, нужно ли вам устанавливать возможность фоновых режимов просто для push-уведомлений (спойлер, вам этого не нужно).
mobob
30

Вы также можете отредактировать необходимый info.plist (Открыть как -> Исходный код) и вставить:

<dict>
<key>UIBackgroundModes</key>
    <array>
        <string>remote-notification</string>
    </array>
Александр Б.
источник
7
Теперь он автоматически добавляется Xcode при проверке удаленных уведомлений в фоновых режимах
Винот Вино
2
Не для меня: версия 11.4.1 (11E503a)
paiego
4

Фактически, вам не нужно добавлять UIBackgroundModes в .plist просто для использования удаленных уведомлений.

Я знаю, что немного разделяю наследников (другой ответ в основном отличный, и, возможно, что-то новое в iOS 11), но вопрос касается push-уведомлений, требующих фоновых обновлений, а они этого не делают.

Различие здесь в том, что есть два разных метода, которые принимают уведомления в AppDelegate;

Это не требует использования UIBackgroundModes:

optional func userNotificationCenter(_ center: UNUserNotificationCenter, 
                         willPresent notification: UNNotification, 
               withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)

Приведенное выше заменяет устаревшее в iOS 11:

optional func application(_ application: UIApplication, 
didReceiveRemoteNotification userInfo: [AnyHashable : Any])

И для этого требуется возможность фоновых режимов:

optional func application(_ application: UIApplication, 
didReceiveRemoteNotification userInfo: [AnyHashable : Any], 
   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)

Ключевым моментом здесь является то, что прежний (и устаревший, который он заменил) запускается только тогда, когда приложение находится на переднем плане. Последний будет работать, если приложение находится на переднем плане ИЛИ в фоновом режиме. Смотрите спецификации для этого конкретного самородка:

Используйте этот метод для обработки входящих удаленных уведомлений для вашего приложения. В отличие от метода application (_: didReceiveRemoteNotification :), который вызывается только тогда, когда ваше приложение работает на переднем плане, система вызывает этот метод, когда ваше приложение работает на переднем плане или в фоновом режиме.

Следовательно, если вам нужны push-уведомления, тогда решите, нужно ли вам работать в фоновом режиме - только если вам нужны оба, вы должны реализовать метод, предложенный предупреждением.

мобоб
источник
3

Со мной такое случилось даже после установки в возможностях фонового режима удаленных уведомлений. Проблема заключалась в том, что у меня было три цели: одна для производства, одна для контроля качества и одна для постановки. Мне пришлось установить удаленные уведомления для всех трех целей, и это устранило предупреждение.

Джошуа Клит
источник