如何在ios 10中处理后台推送通知?

问题描述 投票:7回答:3

我不是在后台处理推送通知。

对于以下步骤中的处理推送通知: -

  1. 在功能 - >启用远程通知。
  2. 在功能 - >后台模式 - >启用远程通知。
  3. 在didFinishLaunchingWithOptions中给出了ios 10的所有权限。
  4. 对于推送通知使用UNUserNotificationCenter
  5. App In Foreground然后推送通知工作正常并且在方法调用之下: userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler

但我的问题是app在后台然后没有调用任何方法。所以任何人有想法或解决方案的背景为ios 10处理推送通知然后请帮助我。

谢谢。

ios objective-c push-notification ios10
3个回答
6
投票

当app在前台时调用willPresentNotification。看看他们的文档

 - (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler {
    // The method will be called on the delegate only if the application is in the foreground.
    // If the method is not implemented or the handler is not called in a timely manner then the notification will not be presented.
    // The application can choose to have the notification presented as a sound, badge, alert and/or in the notification list.
    // This decision should be based on whether the information in the notification is otherwise visible to the user.

}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)())completionHandler {
    // The method will be called on the delegate when the user responded to the notification by opening the application,
    // dismissing the notification or choosing a UNNotificationAction.
    // The delegate must be set before the application returns from applicationDidFinishLaunching:.

}

尝试检查didReceiveNotificationResponse你会得到你需要的。

另外如果需要获取任何数据或任何处理,请在后台模式下启用后台获取并使用以下方法

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler{

    completionHandler(UIBackgroundFetchResultNewData);
}

根据应用程序状态处理APNS

   if(application.applicationState == UIApplicationStateInactive)
     {
        /* 
        # App is transitioning from background to foreground (user taps notification), do what you need when user taps here!
         */    
    }
    else if(application.applicationState == UIApplicationStateActive)
    {
        /*
         # App is currently active, can update badges count here
       */
    }
    else if(application.applicationState == UIApplicationStateBackground)
    {
        /* # App is in background, if content-available key of your notification is set to 1, poll to your backend to retrieve data and update your interface here */
    }

1
投票

这是我的解决方案:

{  
    "aps" : {  
        "content-available" : 1  
    },  
    "acme1" : "bar",  
    "acme2" : 42  
}  

重要的是将内容可用于1。


1
投票

当收到包含alert密钥的推送通知时,iOS将向用户显示通知。如果用户与警报交互,您的应用程序将启动到前台模式。

无提示通知是包含content-available密钥的推送通知。这些通知不会呈现给用户,也不能包含alertsoundbadge密钥。当iOS发出静默通知时,您的应用程序将启动到后台模式。应用程序可以在后台执行非常有限的工作量以响应静默通知。

静默通知如下所示:

{
    "aps" : {
        "content-available" : 1
    },
    "com.yourcompany.something.something" : "something"
}

在交付时,调用应用程序委托方法application:didReceiveRemoteNotification:fetchCompletionHandler:。您对该方法的实现有30秒的时间来调用fetchCompletionHandler参数中传递的块。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {  
    completionHandler(UIBackgroundFetchResultNoData);
    return;
}
© www.soinside.com 2019 - 2024. All rights reserved.