2016-10-20 7 views
1

В моем приложении-хозяине я загружаю пользовательскую папку изображений emojis после распаковки, успешно сохраняя ее ниже.Невозможно получить изображения в приложении расширения из контейнера общего доступа группы приложений в iOS 10

NSURL* shareContainerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.company.app.PushServiceExtn"]; 

И без какого-либо вопроса, когда пользователь, нажав на значок Emojis все пользовательские Emojis шоу в сетке вместо клавиатуры, shareContainerURL.

Я создал PushNotification Service Extension, где мне нужно показать пользовательское изображение emojis, извлекая имя emoji из полезной нагрузки всякий раз, когда наступает наводка. используя нижеприведенный код.

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

    NSDictionary* mediaAttachment = [self.bestAttemptContent.userInfo objectForKey:@"media-attachment"]; 
    NSString* attachType = [mediaAttachment objectForKey:@"attachType"]; 
    if ([attachType isEqualToString:@"emoji"]) { 
     NSString* strEmojiURL = [mediaAttachment objectForKey:@"url"]; 
     self.bestAttemptContent.title = strEmojiURL; 
     NSString* emojiName = [[strEmojiURL stringByRemovingPercentEncoding] lastPathComponent]; 
     NSString* strUnpresseedEmojiPath = [self getFullPath:@"emoji/Pressed"]; 
     NSString* strImagePath = [NSString stringWithFormat:@"%@/%@ Pressed.png",strUnpresseedEmojiPath, emojiName]; 
     NSURL* fileURL = [NSURL fileURLWithPath:strImagePath]; 
     NSData *imageData = [NSData dataWithContentsOfURL:fileURL]; 
     UIImage *image = [UIImage imageWithData:imageData]; 
     if (image) { 
      NSError* error; 
      // CGRect rect = CGRectMake(0,0,50,50); 
      // @{UNNotificationAttachmentOptionsThumbnailClippingRectKey:(__bridge NSDictionary*)CGRectCreateDictionaryRepresentation(rect)} option dict; 
      UNNotificationAttachment * attachement = [UNNotificationAttachment attachmentWithIdentifier:strImagePath.lastPathComponent URL:fileURL options:nil error:&error]; 

      if (error == nil) { 
       self.bestAttemptContent.attachments = @[attachement]; 
      } 
     } 
    } 


    self.contentHandler(self.bestAttemptContent); 
} 
- (NSString *)getFullPath:(NSString *)file { 

    NSURL* shareContainerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.company.app.PushServiceExtn"]; 
    return [shareContainerURL.path stringByAppendingPathComponent: file]; 

} 

Я всегда получаю правильный URL, но второй раз я получаю ноль изображения, но в первый раз каждого изображения он работает. Не удалось получить основную причину. Любая помощь была бы оценена.

Ниже приведена ошибка, которая произошла второй раз для каждого изображения.

2016-10-27 17:34:59.081026 pushNotificationServiceExtension[651:34632] Attachement Error = Error Domain=UNErrorDomain Code=100 "Invalid attachment file URL" UserInfo={NSLocalizedDescription=Invalid attachment file URL} 

Также, пожалуйста, дайте мне знать, как просмотреть App Group совместно контейнер, не удалось найти способ просмотра файлов, содержащихся внутри.

* Update = * Файл удаляется после показа в push-уведомлении.

ответ

2

От яблочного «UNNotificationAttachment После проверки, прикрепленные файлы перемещаются в хранилище данных вложений, так что они могут быть доступны соответствующими процессами. Вложения, расположенные внутри пучка приложения, копируются вместо перемещения.»

Таким образом, я копирую изображение emoji для дублирования URL-адреса и присваиваю его UNNotificationAttachment.

if (imageFileURL) { 

      NSURL* duplicateImageURL = [self getFullPath:@"EmojiAttachment"]; 
      if (![fileManager fileExistsAtPath:duplicateImageURL.path]) { 
       [fileManager createDirectoryAtPath:duplicateImageURL.path withIntermediateDirectories:NO attributes:nil error:&error]; 
      } 
      emojiName = [NSString stringWithFormat:@"%@ Unpressed.png", emojiName]; 
      duplicateImageURL = [duplicateImageURL URLByAppendingPathComponent:emojiName]; 
      [[NSFileManager defaultManager]copyItemAtURL:imageFileURL toURL:duplicateImageURL error:&error]; 
      UNNotificationAttachment * attachement = [UNNotificationAttachment attachmentWithIdentifier:emojiName URL:[duplicateImageURL filePathURL] options:nil error:&error]; 

      if (error == nil) { 
       self.bestAttemptContent.attachments = @[attachement]; 

      } 
      else{ 
       NSLog(@"Attachement Error = %@",error); 
      } 
     } 
+0

Это ключ, что если изображение * не * внутри пакета приложения, оно * перемещено * (т. Е. Удалено). – dbreaux