2016-11-03 2 views
14

У меня есть приложение, в котором я пытаюсь получить и обрабатывать SILENT push-уведомления.iOS 10 молчание push-уведомление не запускает фоновые приложения

Я регистрации для APN, следующим образом:

UNUserNotificationCenter.currentNotificationCenter().delegate = self 
UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Badge, .Sound, .Alert]) {(granted, error) in 
    if granted { 
     application.registerForRemoteNotifications() 
    } 
} 

Реализовано:

func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler:() -> Void) { 
    // Handle notification 
} 

func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) { 
    // Handle notification 
} 

Приложение имеет UIBackgroundModesfetch и remote-notification

Содержание APN выглядит следующим образом:

{ 
    "aps":{ 
     "content-available":1, 
     "badge":0 
    }, 
    "action":"shareDelete", 
    "shareId":633 
} 

Когда приложение находится на переднем плане, при получении уведомления запускается userNotificationCenter(centre:withCompletionHandler:willPresentNotification), но когда приложение находится в фойе, ничего не происходит.

Я вижу, что APN получен путем изменения номера значка, но ничего не запускается в приложении.

Что мне не хватает?

(также спросил на Apple, Дев форумах)

+0

Я не знаю причины, по вопросу выше, но если вы пытаетесь справиться с SILENT уведомления вы могли бы использовать «didReceiveRemoteNotification» метод делегата и использовать «[[UIApplication sharedApplication] applicationState] == UIApplicationStateBackground "для обработки. – Bharath

+0

Это для iOS 10 - есть новые методы делегирования (правильно?) –

+0

Нет, я имел в виду, что, поскольку вы хотите обрабатывать молчаливое уведомление, вы можете использовать существующее «didReceiveRemoteNotification» и обрабатывать его, вместо того, чтобы искать «willPresentNotification» для обрабатывайте его там. – Bharath

ответ

-1

настраиваете вы minimumBackgroundFetchInterval? Как упоминалось в документах:

Минимальное количество секунд, которое должно пройти до того, как будет выполнена другая выборка фона. Это значение является только рекомендательным и не указывает точное время, ожидаемое между операциями выборки.

Интервал выборки по умолчанию для приложений - UIApplicationBackgroundFetchIntervalNever. Поэтому вы должны вызвать этот метод и установить интервал выборки, прежде чем вашему приложению будет предоставлено время выполнения фона.

Так что, если вы не устанавливаете это, вполне возможно, что ваш обработчик fetch никогда не будет вызван в фоновом режиме.

2

Метод

func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler:() -> Void) { 
    // Handle notification 
} 

вызывается, когда пользователь нажимает на уведомление или проверить его на Apple, Watch:

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

Вы должны реализовать старый метод

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

} 
+1

Это сбивает с толку Apple. Они заменили большинство предыдущих рамок, но все же решили сохранить этот последний старый метод делегата. Я предполагаю, что основное внимание было уделено тому, когда есть взаимодействие с пользователем ... – Honey

-3

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

См. Руководство по локальным и удаленным уведомлениям.

Когда ваше приложение не работает или находится в фоновом режиме, система автоматически отправляет локальные и удаленные уведомления с использованием указанных вами взаимодействий. Если пользователь выбирает действие или выбирает одно из стандартных взаимодействий, система уведомляет ваше приложение о выборе пользователя. Затем ваш код может использовать этот выбор для выполнения дополнительных задач. Если ваше приложение работает на переднем плане, уведомления доставляются непосредственно в ваше приложение. Затем вы можете решить, следует ли обращаться с уведомлением тихо или предупредить пользователя.

Чтобы отвечать на доставку уведомлений, вы должны реализовать делегат для общего объекта UNUserNotificationCenter. Объект вашего делегата должен соответствовать протоколу UNUserNotificationCenterDelegate, который центр уведомлений использует для доставки уведомлений в ваше приложение. Делегат требуется, если ваши уведомления содержат настраиваемые действия.

здесь источник: https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/SchedulingandHandlingLocalNotifications.html#//apple_ref/doc/uid/TP40008194-CH5-SW14

+1

Это неверно. Могут быть доставлены «тихие» push-уведомления, которые не требуют взаимодействия с пользователем ... https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CreatingtheNotificationPayload.html#//apple_ref/doc/uid/TP40008194- CH10-SW1 –

+0

Да, он поставляется, но обрабатывается системой. ваше приложение не уведомляется, пока пользователь не выберет действие. –

+1

Опять же, это неверно. «молчащие» уведомления должны быть доставлены в приложение без взаимодействия с пользователем (поэтому они молчат). Следуйте ссылке в моем предыдущем комментарии. –

Смежные вопросы