【问题标题】:iOS Custom attachment not opening directly from MessagesiOS 自定义附件无法直接从消息中打开
【发布时间】:2017-02-19 11:35:13
【问题描述】:

当作为消息共享时,我有一个自定义文件 UTI 附件几乎在我的应用程序中工作。它将文件作为附件嵌入消息中,并在消息中使用正确的文件类型“kitlist”,并在 iPad 和 iPhone 上接收。如果您从正常消息显示中点击附件,则不会发生任何事情。但是,如果您点击右上角的信息按钮,然后选择附件,点击文件并共享此文件,则该应用程序将显示为可能的目的地。选择它将在我的应用程序中成功打开文件。目前,选择邮件作为共享目的地不会导致附件出现在电子邮件中;我不知道这是否相关。我也尝试使用子类化 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";
}

【问题讨论】:

  • 你有什么运气吗?
  • 不,@JordanSmith,很遗憾没有。还在做!

标签: ios objective-c uiactivityitemprovider


【解决方案1】:

这几天我一直在努力解决这个相同的问题。我终于发现消息应用程序中的附件实际上DO有效!它们只是不会从常规视图中打开。在 iOS 中,您必须单击右上角的 i(信息)图标,然后单击“附件”选项卡来管理您的附件。从那里您可以选择您的附件,然后选择操作图标将文档导入您的应用程序。似乎这应该在主“消息”屏幕上工作,但该屏幕似乎只支持公开支持的文档类型,而不支持“public.data”类型。我已经检查了你的代码和你的 info.plist,那里的一切似乎都很好。我认为在 plist 中要记住的主要一点是,mime 类型标识符应该以附件使用的实际文件扩展名结尾,你的就是这样。

【讨论】:

  • 红底黑字(或深色)——别这样。
  • 当你第一次发布这个答案时,@KeithTheBiped,它对我不起作用。但是,我刚刚向我的应用程序添加了一个存根“快速查看预览扩展”,现在它确实使您的答案能够正常工作。
  • 它在没有快速查看预览扩展的情况下对我有用,但是要访问最新 iOS 上的信息按钮,您必须单击旧按钮所在的空白区域。这显示了信息/面部时间/音频按钮。
猜你喜欢
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多