Скачать увеличенные изображения в UNNotificationServiceExtension
Я использую UNNotificationServiceExtension
создавать богатые уведомления на iOS 10 с вложенным изображением. Все отлично работает с небольшими изображениями, за исключением случаев, когда изображение для загрузки немного больше ( например, 7 МБ).
В этом случае загрузка начинается, но никогда не заканчивается, и уведомление о "наилучшей попытке" отображается почти сразу после начала загрузки.
Согласно документам Apple, изображения могут быть размером до 10 МБ, поэтому размер не должен иметь значения:)
Я реализовал serviceExtensionTimeWillExpire
где iOS должна уведомить меня о том, что я должен доставить контент как можно скорее, но этот метод не вызывается, поэтому мне интересно, что происходит.
Обновление 1 Я также заметил, что то же изображение отлично работает, когда оно хранится локально. Похоже, проблема заключается в загрузке изображения. Но, как уже говорилось ранее, загрузка прекращается практически сразу.
Реализация прямо вперед
- (BOOL)handleNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent *_Nonnull))contentHandler
{
self.bestAttemptContent = (UNMutableNotificationContent *) [request.content mutableCopy];
UNMutableNotificationContent *content = [self.bestAttemptContent mutableCopy];
NSString *urlString = [content.userInfo valueForKeyPath:@"attachment-url"];
NSLog(@"Downloading notification attachment completed with: %@", url.absoluteString);
NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:url completionHandler:^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) {
NSLog(@"Downloading notification attachment %@", error == nil ? @"success" : [NSString stringWithFormat:@"error: %@", error]);
NSError *fileError;
UNNotificationAttachment *attachment = [UNNotificationAttachment d360_createWithFileName:url.lastPathComponent identifier:url.absoluteString data:data options:nil error:&fileError];
if (!attachment) {
NSLog(@"Could not create local attachment file: %@", fileError);
contentHandler(content);
return;
}
NSLog(@"Adding attachment: %@", attachment);
NSMutableArray *attachments = content.attachments ? [content.attachments mutableCopy] : [NSMutableArray array];
[attachments addObject:attachment];
content.attachments = attachments;
contentHandler(content);
}];
[task resume];
return YES;
}
- (void)serviceExtensionTimeWillExpire
{
NSLog(@"Service extension expired. Using best attempt content %@", self.bestAttemptContent);
self.contentHandler(self.bestAttemptContent);
}
Когда я отлаживаю это в XCode, я вижу следующие журналы:
2017-03-30 14:51:43.723669 D360TestAppNotificationExtension[3393:398992] [D360Extension]: Handling notification request content
2017-03-30 14:51:43.724103 D360TestAppNotificationExtension[3393:398992] [D360Extension]: Downloading notification attachment: https://upload.wikimedia.org/wikipedia/commons/b/b2/Bled_Castle_05.jpg
Program ended with exit code: 0
Program ended with exit code: 0
подозрительно Есть идеи, что происходит?
спасибо Ян
1 ответ
Таким образом, решение заключается в использовании NSURLSessionDownloadTask
вместо NSURLSessionDataTask
, В этом случае загружаемый контент сохраняется во временном местоположении и использует меньше памяти. UNNotificationAttachment
может быть создан непосредственно из временного файла.
Просто отметьте, что UNNotificationAttachment
необходимо прочитать файл с поддерживаемым расширением, поэтому я просто добавляю имя удаленного файла в локальный URL временного файла
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionDownloadTask *task = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
NSLog(@"Downloading notification attachment completed with %@", error == nil ? @"success" : [NSString stringWithFormat:@"error: %@", error]);
NSError *fileError;
// create a local URL with extension
NSURL *urlWithExtension = [NSURL fileURLWithPath:[location.path stringByAppendingString:url.lastPathComponent]];
if (![[NSFileManager defaultManager] moveItemAtURL:location toURL:urlWithExtension error:&fileError]) {
NSLog(@"Could not append local attachment file name: %@", fileError);
contentHandler(content);
return;
}
UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:url.absoluteString
URL:urlWithExtension options:nil
error:&fileError];
if (!attachment) {
NSLog(@"Could not create local attachment file: %@", fileError);
contentHandler(content);
return;
}
NSLog(@"Adding attachment: %@", attachment);
NSMutableArray *attachments = content.attachments ? [content.attachments mutableCopy] : [NSMutableArray array];
[attachments addObject:attachment];
content.attachments = attachments;
contentHandler(content);
}];
[task resume];