我尝试在后台打开通知数据,而在打开应用程序时不点击通知。
我已经将“后台模式”设置为“开”,并在“功能”中选中了“背景提取”和“远程通知”。
我已经调用了此功能
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
print(userInfo)
}
但是通知到达时该函数未触发,仅当我轻按该通知时才触发该函数。
我的期望是:打开应用程序时,我可以在后台获取通知而无需点击通知。
答案 0 :(得分:0)
为了配置项目以进行Notification后台下载,请在XCode中启用以下功能
请不要忘记在服务器发出的实际通知中将 content-available设置为1 ,以触发后台下载。如果您未在通知中包含此标志,则通知到达时,您的应用将不会收到任何协议方法调用。
您需要处理以下四种情况:
情况1和3仅在情况2和4在“ didFinishLaunchingWithOptions”的启动选项中提供了通知详细信息的情况下才调用“ didReceiveRemoteNotification”,然后调用“ didReceiveRemoteNotification”。 如果出现用户手动杀死您的应用的情况,则情况2将不会发生。在用户选择再次启动数据之前,您的应用程序永远不会在后台启动以获取数据。
我们需要以不同方式处理所有应用程序状态案例。下面是代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(NSDictionary *)launchOptions {
NSDictionary *data = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (data) {
self.appIsStarting = YES;
}
return YES
}
- (void)applicationWillResignActive:(UIApplication *)application {
self.appIsStarting = NO;
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
self.appIsStarting = NO;
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
self.appIsStarting = YES;
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
self.appIsStarting = NO;
}
- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
UIApplicationState state = [application applicationState];
if (state == UIApplicationStateBackground ||
(state == UIApplicationStateInactive &&
!self.appIsStarting)) {
NSDictionary *aps = userInfo[@”aps”];
if (aps) {
// perform the background fetch and
// call completion handler
}
}
} else if (state == UIApplicationStateInactive &&
self.appIsStarting) {
// user tapped notification
completionHandler(UIBackgroundFetchResultNewData);
} else {
// app is active
completionHandler(UIBackgroundFetchResultNoData);
}
}