如何在iOS 8系统范围的共享菜单中列出?

如何在iOS 8系统范围的共享菜单中列出?,ios,ios8,info.plist,Ios,Ios8,Info.plist,我正在尝试将我的iOS 8应用程序列在iOS 8系统范围的共享菜单中,用于图像扩展名.png、.jpg.jpeg、.gif static。 我需要向info.plist文件添加什么?我尝试了下面的代码,但是没有成功,我的应用程序没有出现在共享列表中 <key>NSExtension</key> <dict> <key>NSExtensionAttributes</key> <dict> <key>NSExtens

我正在尝试将我的iOS 8应用程序列在iOS 8系统范围的共享菜单中,用于图像扩展名.png、.jpg.jpeg、.gif static。 我需要向info.plist文件添加什么?我尝试了下面的代码,但是没有成功,我的应用程序没有出现在共享列表中

<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>NSExtensionServiceRoleType</key>
<string>NSExtensionServiceRoleTypeEditor</string>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.ui-services</string>
<key>NSExtensionPrincipalClass</key>
<string>ActionViewController</string>
</dict>

为了清楚起见,这是iOS 8共享菜单,也称为共享表。我的意思是:

首先,你需要了解应用程序间的通信。 你需要的是为你的应用定制url方案。请参阅:

现在,在您拥有自定义url sheme后,请按以下步骤进行操作:

要在系统范围的共享菜单中列出,您需要进行自定义活动

创建如下所示的类: 在YourActivity.h文件中

@interface YourActivity : UIActivity
-(void)someInitialisationMethod:(NSString*)string;
@end
在YourActivity.m文件中

#import "YourActivity.h"

@implementation YourActivity

- (NSString *)activityType
{
return @"UIActivityCategoryShare";
}

- (NSString *)activityTitle
{ // here give the title of your app or the action name that it performs
return @"YourAppName";
}
+ (UIActivityCategory)activityCategory
{// there are two types of category- share and action
return UIActivityCategoryShare;
}
- (UIImage *)activityImage
{
// Note: These images need to have a transparent background and I recommend these sizes:
// iPadShare@2x should be 126 px, iPadShare should be 53 px, iPhoneShare@2x should be 100
// px, and iPhoneShare should be 50 px. I found these sizes to work for what I was making.

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
{
    return [UIImage imageNamed:@"YourActivityImage.png"];
}
else
{
    return [UIImage imageNamed:@"YourActivityImage.png.png"];
}
}

- (BOOL)canPerformWithActivityItems:(NSArray *)activityItems
{
NSLog(@"%s", __FUNCTION__);
return YES;
}

- (void)prepareWithActivityItems:(NSArray *)activityItems
{
NSLog(@"%s",__FUNCTION__);
}

- (UIViewController *)activityViewController
{
NSLog(@"%s",__FUNCTION__);
return nil;
}

- (void)performActivity
{
// This is where you can do anything you want, and is the whole reason for          creating a custom
// UIActivity
NSURL *yourCustomURLMaybe = [NSURL URLWithString:someInitialisedString];
if ([[UIApplication sharedApplication] canOpenURL: yourCustomURL]) {
    [[UIApplication sharedApplication] openURL: yourCustomURL];
}
else
{
    NSLog(@"YourActivity not found");
}
[self activityDidFinish:YES];
}

@end
现在您的自定义活动已经完成 你需要像这样用共享菜单启动它

NSString *yourCustomUrl = [NSString stringWithFormat:@"YourCustomURLScheme?..."];

NSString *escapeAdded = [yourCustomUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *finalCustomURL = [NSURL URLWithString:escapeAdded];

YourActivity *ca;
if ([[UIApplication sharedApplication] canOpenURL: finalCustomURL])
{
    ca = [[YourActivity alloc]init];
}
else
{
    ca = nil;
}

NSArray *applicationActivityArray = [[NSArray alloc] initWithObjects:ca,nil];
最后,在显示共享框时,将上述数组添加到应用程序活动中:

activityViewController = [[UIActivityViewController alloc] initWithActivityItems:@[...] applicationActivities:applicationActivityArray];
}

您缺少NSExtensionActivationRule。请参阅Apple的扩展编程指南:

例如,声明您的共享扩展可以支持多达 十张图片、一部电影和一个网页URL,您可以使用 以下是NSExtensionAttributes键值的字典:

<key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsImageWithMaxCount</key>
            <integer>10</integer>
            <key>NSExtensionActivationSupportsMovieWithMaxCount</key>
            <integer>1</integer>
            <key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
            <integer>1</integer>
        </dict>
    </dict>

定义不起作用。请记住,出于某些愚蠢、未知原因的照片和邮件应用程序不会提供任何机会在第三方应用程序中打开图像。我的应用程序不会显示在“共享”菜单列表中。我还尝试了其他几个应用程序,但我的应用程序也不在列表中。为图像文件列出的字符串是否正确?:com.apple.ui-services不需要扩展名。您希望显示在“打开位置”菜单中。请参见“否”,在菜单中打开是不同的。我想让我的应用程序列在共享菜单中。如果我将其添加到我的info.plist,我的应用程序会显示在iOS 8共享菜单中吗?还是我也需要为其编写扩展名?@Tom,你需要将这些属性添加到你的共享或操作扩展名的info.plist中。这是让我困惑的部分。我想从共享菜单调用我的应用程序,而不是应用程序的扩展。如果我将代码添加到我的apps info.plist中,代码是否也能正常工作?您所指的共享菜单是通过创建UIActivityViewController打开的菜单。如果要在应用程序外部向UIActivityViewController添加内容,则唯一的选择是创建扩展。