在UNNotificationServiceExtension中下载放大的图像

时间:2017-03-30 12:55:01

标签: objective-c ios10 unnotificationattachment

我正在使用UNNotificationServiceExtension在iOS 10上使用图片附件创建丰富的通知。除了要下载的图像稍大(e.g. 7MB)之外,所有内容都能正常工作。

在这种情况下,下载开始但从未结束,并且在下载开始后几乎立即显示“最佳尝试”通知。

根据Apple's docs,图片最多可达10MB,因此尺寸无关紧要:)

我确实实现了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 个答案:

答案 0 :(得分:3)

因此解决方案是使用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];