У меня есть файл 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";
}
Неужели вам повезло с этим? –
Нет, @JordanSmith, к сожалению нет. Все еще делаю это! – Nick