【问题标题】:Fetch notification data on background without tap the notification无需点击通知即可在后台获取通知数据
【发布时间】:2020-01-01 07:36:00
【问题描述】:

当我打开应用程序时,我尝试在不点击通知的情况下在后台获取通知数据。

我已经将后台模式设置为 ON,并在 Capabilities 中选中了“Background Fetch”和“Remote Notifications”。

我已经调用了这个函数

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

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

但是当通知到来时该功能没有触发,只有当我点击通知时才触发该功能。

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

【问题讨论】:

    标签: ios swift swift3


    【解决方案1】:

    为了将您的项目配置为通知后台下载,请在 XCode 中启用以下功能

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

    你需要处理四种情况:

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

    案例 1 和 3 仅调用“didReceiveRemoteNotification”,而案例 2 和 4 在“didFinishLaunchingWithOptions”的启动选项中提供通知详细信息,然后调用“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);
        }
    }
    

    【讨论】:

    • 你好 Armit,如何设置“content-available 为 1”?是否在通知正文中?
    • 是的,它是通知负载,例如:{ "aps" : { "content-available" : 1 }, "acme1" : "bar", "acme2" : 42 } 更多信息请访问APS 字典键部分:developer.apple.com/library/archive/documentation/…
    • 嘿,你搞定了吗。如果是,请投票给我的答案
    猜你喜欢
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2018-03-22
    • 2019-01-10
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多