您好我正在开发一个社交网络应用程序。我需要使用我的应用API扩展程序来共享图像。我正在通过目标C 而非 Swift 开发我的应用。任何人都可以帮我解决这个问题。
答案 0 :(得分:5)
应用扩展程序必须包含应用内容 - 您不能只创建要从商店下载的应用扩展程序,首先要创建一个包含应用扩展程序的常规应用。 为了这个演示,只需创建一个新的单一视图项目并保持不变。 转到文件 - >新建>项目,然后选择 iOS下的单一视图应用 - >应用程序将其称为“ExtendableApp”。
转到文件 - >新建 - >目标,然后选择 iOS下的共享扩展程序 - >应用程序扩展将其称为“myShareExtension”,这会将共享扩展目标添加到您的项目中。
扩展ShareViewController继承自SLComposeServiceViewController,它已经具有带文本框,图像视图和“取消”和“发布”按钮的视图以及一些其他功能,如字符数,配置,内容验证。
如果您想创建自定义体验,只需将ShareViewController设置为从UIViewController继承,激活扩展后,将调用所有常规viewDidLoad,viewDidAppear等。
安装包含应用程序后,此时您已经可以在UIActivityViewController菜单中看到“myShareExtension”
在viewDidAppear的ShareViewController.mm中,使用以下内容获取图像
-(void)viewDidAppear:(BOOL)animated
{
for (NSItemProvider* itemProvider in ((NSExtensionItem*)self.extensionContext.inputItems[0]).attachments )
{
if([itemProvider hasItemConformingToTypeIdentifier:@"public.image"])
{
[itemProvider loadItemForTypeIdentifier:@"public.image" options:nil completionHandler:
^(id<NSSecureCoding> item, NSError *error)
{
UIImage *sharedImage = nil;
if([(NSObject*)item isKindOfClass:[NSURL class]])
{
sharedImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:(NSURL*)item]];
}
if([(NSObject*)item isKindOfClass:[UIImage class]])
{
sharedImage = (UIImage*)item;
}
}];
}
}
}
注意 - 此代码仅用于演示,扩展应该快速且轻量级,并且在加载图像时不会阻止UI线程,在实际应用中,您将在后台执行此操作。
默认情况下,只要出现UIActivityViewController菜单,现在就会显示扩展名,以指定扩展应该出现在哪些场景中,您需要在NSExtension,NSExtensionAttributes,NSExtensionActivationRule下的扩展名info.plist中设置正确的值。 您可以在此处找到可用密钥的说明: Information Property List Key Reference
请注意,默认行为是,只要所有密钥适用,您的分机就会显示,这意味着如果您指定NSExtensionActivationSupportsImageWithMaxCount
和NSExtensionActivationSupportsMovieWithMaxCount
,您的分机将仅显示当用户共享图像和电影时,不是图像或电影。
要编写为少数共享数据类型之一显示的扩展,请在此处查看
http://bryan.io/post/97658826431/what-we-learned-building-the-tumblr-ios-share-extension
Declaring Supported Data Types for a Share or Action Extension