在ios8中使用共享扩展名共享图像

时间:2014-10-18 05:15:49

标签: ios objective-c

您好我正在开发一个社交网络应用程序。我需要使用我的应用API扩展程序来共享图像。我正在通过目标C 而非 Swift 开发我的应用。任何人都可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:5)

在目标C

中创建共享扩展
  1. 应用扩展程序必须包含应用内容 - 您不能只创建要从商店下载的应用扩展程序,首先要创建一个包含应用扩展程序的常规应用。 为了这个演示,只需创建一个新的单一视图项目并保持不变。 转到文件 - >新建>项目,然后选择 iOS下的单一视图应用 - >应用程序将其称为“ExtendableApp”。

  2. 转到文件 - >新建 - >目标,然后选择 iOS下的共享扩展程序 - >应用程序扩展将其称为“myShareExtension”,这会将共享扩展目标添加到您的项目中。

  3. 扩展ShareViewController继承自SLComposeServiceViewController,它已经具有带文本框,图像视图和“取消”和“发布”按钮的视图以及一些其他功能,如字符数,配置,内容验证。

    如果您想创建自定义体验,只需将ShareViewController设置为从UIViewController继承,激活扩展后,将调用所有常规viewDidLoad,viewDidAppear等。

  4. 安装包含应用程序后,此时您已经可以在UIActivityViewController菜单中看到“myShareExtension”

    获取共享的UIImage

    在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

    请注意,默认行为是,只要所有密钥适用,您的分机就会显示,这意味着如果您指定NSExtensionActivationSupportsImageWithMaxCountNSExtensionActivationSupportsMovieWithMaxCount,您的分机将仅显示当用户共享图像电影时,不是图像或电影。 要编写为少数共享数据类型之一显示的扩展,请在此处查看

    http://bryan.io/post/97658826431/what-we-learned-building-the-tumblr-ios-share-extension

    Declaring Supported Data Types for a Share or Action Extension