2017-02-19 9 views
1

У меня есть файл UTI для пользовательского файла почти, работающий в моем приложении при обмене сообщениями. Он вставляет файл в виде вложения с правильным типом файла «kitlist» в сообщении и принимается как на iPads, так и на iPhone. Если вы нажимаете на вложение с обычного сообщения, ничего не происходит. Однако, если вы нажмете на информационную кнопку в верхнем правом углу, а затем выберите «Вложение», нажмите на файл и поделитесь этим, приложение появится в качестве возможного адресата. Выбор этого файла откроет файл в моем приложении. На данный момент выбор Mail в качестве адресата общего доступа не приводит к появлению вложения в сообщении электронной почты; Я не знаю, является ли это релевантным. Я также попытался использовать подклассификацию UIActivityItemProvider вместо того, чтобы реализовать подпрограмму UIActivityItemSource для протокола NSObject, но без разницы. Airdropping на другое устройство iOS прекрасно работает.iOS Пользовательское вложение не открывается непосредственно из сообщений

Вот соответствующий фрагмент моего списка свойств:

<key>CFBundleDocumentTypes</key> 
<array> 
    <dict> 
     <key>CFBundleTypeIconFiles</key> 
     <array/> 
     <key>CFBundleTypeName</key> 
     <string>KitList Transfer File Type</string> 
     <key>CFBundleTypeRole</key> 
     <string>Editor</string> 
     <key>LSHandlerRank</key> 
     <string>Owner</string> 
     <key>LSItemContentTypes</key> 
     <array> 
      <string>co.SM.KitListFile.kitlist</string> 
     </array> 
    </dict> 
</array> 
<key>UTExportedTypeDeclarations</key> 
<array> 
    <dict> 
     <key>UTTypeConformsTo</key> 
     <array> 
      <string>public.data</string> 
     </array> 
     <key>UTTypeDescription</key> 
     <string>KitList Transfer File</string> 
     <key>UTTypeIdentifier</key> 
     <string>co.SM.KitListFile.kitlist</string> 
     <key>UTTypeSize320IconFile</key> 
     <string>BergenBig</string> 
     <key>UTTypeSize64IconFile</key> 
     <string>Bergen</string> 
     <key>UTTypeTagSpecification</key> 
     <dict> 
      <key>public.filename-extension</key> 
      <string>kitlist</string> 
     </dict> 
    </dict> 
</array> 

код, чтобы сделать вложение:

@interface SMCustomAttachmentTransfer() 
@property (nonatomic, strong) NSMutableArray *images; 

@end 

@implementation SMCustomAttachmentTransfer 

- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    self.images = [NSMutableArray array]; 
    [aCoder encodeObject:self.list forKey:@"list"]; 
    [self walkTheList:[self.list valueForKey:keySubItems] withCoder:aCoder]; 
    [aCoder encodeObject:self.images forKey:@"images"]; 
} 

- (void)walkTheList:(NSDictionary *)items withCoder:(NSCoder *)aCoder 
{ 
    for (NSDictionary *item in items) 
    { 
     if ([item valueForKey:keyDetailImage]) 
     { 
      [self.images addObject:[item valueForKey:keyDetailImage]]; 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsDirectory = [paths objectAtIndex:0]; 
      NSString *getImagePath = [documentsDirectory stringByAppendingPathComponent:[item valueForKey:keyDetailImage]]; 
      [aCoder encodeObject:[NSData dataWithContentsOfFile:getImagePath] forKey:[item valueForKey:keyDetailImage]]; 
     } 
     if ([item valueForKey:keySubItems]) 
     { 
      [self walkTheList:[item valueForKey:keySubItems] withCoder:aCoder]; 
     } 
    } 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super init]; 
    if (self) 
    { 
     self.list = [aDecoder decodeObjectForKey:@"list"]; 
     NSArray *images = [aDecoder decodeObjectForKey:@"images"]; 
     for (NSString *image in images) 
     { 
      NSData *pngData = [aDecoder decodeObjectForKey:image]; 
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
      NSString *documentsPath = [paths objectAtIndex:0]; 
      [pngData writeToFile:[documentsPath stringByAppendingPathComponent:image] atomically:YES]; 
     } 
    } 
    return self; 
} 

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController 
{ 
    // must be data placeholder for attachment to be embedded in a message. 
    return [NSData data]; 
} 

- (NSString *)activityViewController:(UIActivityViewController *)activityViewController subjectForActivityType:(NSString *)activityType 
{ 
    return [self.list valueForKey:keyName]; 
} 

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType 
{ 
    return [NSKeyedArchiver archivedDataWithRootObject:self]; 
} 

- (NSString *)activityViewController:(UIActivityViewController *)activityViewController dataTypeIdentifierForActivityType:(NSString *)activityType 
{ 
    return @"co.SM.KitListFile.kitlist"; 
} 
+0

Неужели вам повезло с этим? –

+0

Нет, @JordanSmith, к сожалению нет. Все еще делаю это! – Nick

ответ

0

Я боролся с этой идентичной проблемой в течение нескольких дней в настоящее время. Я, наконец, понял, что приложения в приложении для обмена сообщениями на самом деле DO работа! Они просто не открываются из обычного вида. В iOS вам нужно щелкнуть значок i (информация) в правом верхнем углу, а затем перейти на вкладку «Вложения», чтобы управлять вложениями. Оттуда вы можете выбрать свои вложения, а затем выбрать значок действия, чтобы импортировать документ в свое приложение. Похоже, что это должно работать с основного экрана «сообщения», но этот экран, похоже, поддерживает только поддерживаемые типы документов, а не типы «public.data». Я проверил ваш код и ваш info.plist, и все кажется прекрасным. Я думаю, что главное, чтобы иметь в виду в plist, заключается в том, что идентификатор типа mime должен заканчиваться фактическим расширением файла, которое использует ваше приложение, что и делает.

enter image description here

+0

Красный на черном (или темные цвета) - просто нет. – LinusGeffarth