2017-03-30 8 views
2

UNNotificationServiceExtensionを使用して、画像添付ファイルを使用してiOS 10で豊富な通知を作成しています。ダウンロードする画像がもう少し大きい場合を除いて、小さい画像の場合はすべて正常に動作します(e.g. 7MB)。大きな画像をUNNotificationServiceExtensionにダウンロード

この場合、ダウンロードは開始されますが、終了することはなく、ダウンロードの開始直後に「最善の試行」通知が表示されます。サイズは:)

私はiOSのは、私はできるだけ早くコンテンツを配信するために持っていることを私に通知することになっているserviceExtensionTimeWillExpireを実装しなかったのは問題ないはずので

Apple's docsによると、画像は10メガバイトまでとすることができますが、この方法はではなく、と呼ばれるので、何が起こっているのだろうかと思います。

更新1 ローカルに保存されているときに同じ画像が正常に機能することに気付きました。画像をダウンロードする際に問題が発生しているようです。しかし、以前にも述べたように、ダウンロードはほぼ直ちに中止されます。 Program ended with exit code: 0が疑わしい

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 

:私はXcodeでこれをデバッグするとき

実装はまっすぐ進む

- (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); 
} 

、私は次のログを参照しています。何が起こっているか考えてみませんか?

おかげ 月

答えて

0

だから解決策ではなくNSURLSessionDataTaskNSURLSessionDownloadTaskを使用することです。この場合、ダウンロードコンテンツは一時的な場所に保存され、使用メモリが少なくなります。 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]; 
にリモートファイル名を追加してサポートされているファイル拡張子を持つファイルを読むために必要があることに注意してください
関連する問題