在后台获取通知数据,而无需点击通知

时间:2019-08-28 06:27:57

标签: ios swift swift3

我尝试在后台打开通知数据,而在打开应用程序时不点击通知。

我已经将“后台模式”设置为“开”,并在“功能”中选中了“背景提取”和“远程通知”。

我已经调用了此功能

func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {

   let userInfo = response.notification.request.content.userInfo
        print(userInfo)
}

但是通知到达时该函数未触发,仅当我轻按该通知时才触发该函数。

我的期望是:打开应用程序时,我可以在后台获取通知而无需点击通知。

1 个答案:

答案 0 :(得分:0)

为了配置项目以进行Notification后台下载,请在XCode中启用以下功能

enter image description here

请不要忘记在服务器发出的实际通知中将 content-available设置为1 ,以触发后台下载。如果您未在通知中包含此标志,则通知到达时,您的应用将不会收到任何协议方法调用。

您需要处理以下四种情况:

  • 案例1:通知到达,应用程序在后台运行。
  • 第2种情况:通知到达,应用未在后台运行。
  • 案例3:用户点击通知,应用程序在后台运行。
  • 案例4:用户点击通知,应用未在后台运行。

情况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);
    }
}