gpt4 book ai didi

ios - 无需点击通知即可在后台获取通知数据

转载 作者:行者123 更新时间:2023-11-29 05:30:07 43 4
gpt4 key购买 nike

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

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

我已经调用了这个函数

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

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

但是当通知到来时该函数不会触发,并且只有当我点击通知时该函数才会触发。

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

最佳答案

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

enter image description here

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

您需要处理四种情况:

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

关于ios - 无需点击通知即可在后台获取通知数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57686226/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com