ios - iOS Notification Service Extension 会从设备中删除附加文件吗?

标签 ios apple-push-notifications unnotificationserviceextension

我遇到了一个奇怪的问题。 iOS 通知服务扩展将从设备中删除附件。

我使用 SDWebImage 来显示和缓存图像,我实现了一个通知服务扩展来在通知警报 View 中显示图像。

在我的例子中,图像已经缓存在本地。然后,我单击主页按钮,我的应用程序在后台运行,应用程序安排了一个本地通知,并将缓存的图像附加到通知内容中。

查看下面的代码:

1.安排本地通知

+ (void)postLocalNotificationGreaterThanOrEqualToiOS10:(LNotification)module body:(NSDictionary *)body {
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
UNMutableNotificationContent* content = [[UNMutableNotificationContent alloc] init];
content.sound = [UNNotificationSound defaultSound];
content.body = @"body";
content.userInfo = @{};

//get the image in device to attach into notification
NSError *error;
NSString* imgURL = [body valueForKey:kLocalNotification_Image];
NSString *filePath = [[SDImageCache sharedImageCache] defaultCachePathForKey:imgURL];
NSURL *url = [NSURL URLWithString:[@"file://" stringByAppendingString:filePath]];
UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:@"Image" URL:url options:nil error:&error];
if (attachment) {
    content.attachments = @[attachment];
}

UNTimeIntervalNotificationTrigger* trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO];

UNNotificationRequest* request = [UNNotificationRequest requestWithIdentifier:@"FiveSecond"
                                                                      content:content trigger:trigger];

[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
    if (error) {
        NSLog(@"error: %@", error.localizedDescription);
    }
}];
} 

2.Notification Service Extension(其实对于本地通知,只调用了didReceiveNotificationRequest:withContentHandler:,什么也没做。)

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];

NSDictionary *aps = [self.bestAttemptContent.userInfo objectForKey:@"aps"];
if (aps) {
    ....//For remote notification, modify the notification content here
}
else {
    //For local notification, do nothing
}

self.contentHandler(self.bestAttemptContent);
}

- (void)serviceExtensionTimeWillExpire {
// Called just before the extension will be terminated by the system.
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
self.contentHandler(self.bestAttemptContent);
}

- (NSString *)downloadImageWithURL:(NSString *)imageURLString imageName:(NSString *)imageName {
    ....//code will not execute for local notification
}

我发现,我附加到本地通知中的图像将从设备中删除。我的意思是,在我单击通知警报以从后台启动应用程序到前台后,我尝试显示图像,不幸的是,SDWebImageCache 没有从磁盘和内存中找到缓存。

看了iOS API 的preference,没有发现附件会被删除。有谁知道我在哪里可以找到这个问题的任何线索?也许我只是忽略了一些重要的内容,请参阅通知服务扩展。

现在,我临时解决了这个问题,在安排本地通知时,复制缓存图像并另存为另一个名称,然后将其附加到本地通知中。即使 Notification Service Extension 会删除附件,它只会删除副本文件,应用程序会从缓存中找到图像。

但是,我真的很想知道为什么会出现这个问题。提前致谢。

最佳答案

刚刚在文档中找到

UNNotificationAttachment:

The system validates the content of attached files before scheduling the corresponding notification request. If an attached file is corrupted, invalid, or of an unsupported file type, the notification request is not scheduled for delivery. Once validated, attached files are moved into the attachment data store so that they can be accessed by the appropriate processes. Attachments located inside an app’s bundle are copied instead of moved.

关于ios - iOS Notification Service Extension 会从设备中删除附加文件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45999859/

相关文章:

ios - UNNotificationServiceExtension didReceive 未调用

ios - 一个应用程序中的多个Notification Service Extension

ios - 无法显示弹出 Controller

ios - 是否可以通过 pubnub 在多个应用程序上发送 IOS 推送通知?

php - 发送 APNS 千台设备 php 花费太多时间

Python截断国际字符串

ios - 触摸列表项仅触摸其他所有单元格

ios - 如何在 Xcode Storyboard上显示一段文字?

ios - Swift 3 - 用于 selectionIndicatorImage 的 UITabBarItem 的全宽

ios - 使用某些断点进行调试时,iOS Extension中的EXC_BREAKPOINT崩溃