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

时间:2015-02-13 18:25:42

标签: ios ios8 info.plist

我正在尝试将我的iOS 8应用程序列在iOS 8系统范围的共享菜单中,用于图像扩展名.png,.jpg(.jpeg),. gif(静态)。 我需要将哪些内容添加到info.plist文件中?我尝试了iOS docs example下面的代码,但是没有用,我的应用程序没有显示在共享列表中。

<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 Share Menu(也称为share sheet):http://cdn1.tekrevue.com/wp-content/uploads/2014/09/ios8-share-sheets-customize.jpg

2 个答案:

答案 0 :(得分:0)

首先,您需要了解应用间通信。 您需要的是您的应用程序的自定义网址方案。请参阅: https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Inter-AppCommunication/Inter-AppCommunication.html

现在有了自定义网址后,按以下步骤操作:

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

创建如下的类: 在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];
}

答案 1 :(得分:0)

您缺少NSExtensionActivationRule。请参阅Apple的扩展编程指南:Declaring Supported Data Types for a Share or Action Extension

  

例如,声明您的共享扩展程序最多可以支持   你可以使用10个图像,一个电影和一个网页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>