我不是在后台处理推送通知。
对于以下步骤中的处理推送通知: -
UNUserNotificationCenter
。userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler
但我的问题是app在后台然后没有调用任何方法。所以任何人有想法或解决方案的背景为ios 10处理推送通知然后请帮助我。
谢谢。
当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 */
}
这是我的解决方案:
{
"aps" : {
"content-available" : 1
},
"acme1" : "bar",
"acme2" : 42
}
重要的是将内容可用于1。
当收到包含alert
密钥的推送通知时,iOS将向用户显示通知。如果用户与警报交互,您的应用程序将启动到前台模式。
无提示通知是包含content-available
密钥的推送通知。这些通知不会呈现给用户,也不能包含alert
,sound
或badge
密钥。当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;
}