Чтобы управлять полученным push-уведомлением, когда приложение находится в фоновом режиме, необходимо выполнить несколько действий.
Сначала на стороне сервера необходимо установить {"aps":{"content-available" : 1... / $body['aps']['content-available'] =1;
в полезных данных push-уведомлений.
Во-вторых, в вашем проекте XCode вам необходимо использовать "удаленные уведомления".Это делается путем перехода к цели проекта -> возможностям, затем включению переключателя возможностей и проверки флажка удаленных уведомлений.
В-третьих, вместо использования didReceiveRemoteNotification
, вы должны вызвать application:didReceiveRemoteNotification:fetchCompletionHandler:
, этопозволит вам выполнять задачи, которые вы хотите в фоновом режиме, в момент получения уведомления:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
if(application.applicationState == UIApplicationStateInactive) {
NSLog(@"Inactive - the user has tapped in the notification when app was closed or in background");
//do some tasks
[self manageRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
else if (application.applicationState == UIApplicationStateBackground) {
NSLog(@"application Background - notification has arrived when app was in background");
NSString* contentAvailable = [NSString stringWithFormat:@"%@", [[userInfo valueForKey:@"aps"] valueForKey:@"content-available"]];
if([contentAvailable isEqualToString:@"1"]) {
// do tasks
[self manageRemoteNotification:userInfo];
NSLog(@"content-available is equal to 1");
completionHandler(UIBackgroundFetchResultNewData);
}
}
else {
NSLog(@"application Active - notication has arrived while app was opened");
//Show an in-app banner
//do tasks
[self manageRemoteNotification:userInfo];
completionHandler(UIBackgroundFetchResultNewData);
}
}
Наконец, вам нужно добавить этот тип уведомления: UIRemoteNotificationTypeNewsstandContentAvailability
в настройки уведомлений, когда выустановите его.
Кроме того, если ваше приложение было закрыто, когда пришло уведомление, вы должны управлять этим в didFinishLaunchingWithOptions
, и только если пользователь нажимает на push-уведомление: способ сделать это:
if (launchOptions != nil)
{
NSDictionary *dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (dictionary != nil)
{
NSLog(@"Launched from push notification: %@", dictionary);
[self manageRemoteNotification:dictionary];
}
}
launchOptions is! = Nil, когда вы запускаете приложение, нажав на push-уведомление, если вы получите к нему доступ, нажав на значок, launchOptions будет == nil.
Надеюсь это будет полезно. Здесь это объясняет Apple .