iOS 通知服务扩展会从设备中删除附件吗?

Will iOS Notification Service Extension delete attached file from device?

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

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

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

查看下面的代码:

1.Schedule本地通知

+ (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 没有从磁盘和内存中找到缓存。

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

现在,我临时解决了这个问题,在安排本地通知时,复制缓存的图像并另存为另一个名称,然后将其附加到本地通知中。即使是 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.