Приложение iOS Custom не открывается непосредственно из сообщений

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

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

<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";
}

1 ответ

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

введите описание изображения здесь

Другие вопросы по тегам