17

URL我有以下代码可以发送AirDrop

NSString* selfUrlScheme = [[[[[[NSBundle mainBundle]
                               infoDictionary]
                              valueForKey:@"CFBundleURLTypes"]
                             objectAtIndex:0]
                            valueForKey:@"CFBundleURLSchemes"]
                           objectAtIndex:0];

NSURL* schemeURL = [NSURL URLWithString:
                    [NSString stringWithFormat:
                     @"addList:%@,%@",
                     self.list.uniqueID,
                     selfUrlScheme]];

NSArray *objectsToShare = @[schemeURL];
controller = [[UIActivityViewController alloc]
              initWithActivityItems:objectsToShare
              applicationActivities:nil];

// Exclude all activities except AirDrop
   NSArray *excludedActivities = @[UIActivityTypePostToTwitter,
                                   UIActivityTypePostToWeibo,
                                   UIActivityTypeAssignToContact,
                                   UIActivityTypeSaveToCameraRoll,
                                   UIActivityTypeAddToReadingList,
                                   UIActivityTypePostToFlickr,
                                   UIActivityTypePostToVimeo,
                                   UIActivityTypePostToTencentWeibo];
controller.excludedActivityTypes = excludedActivities;
[self presentViewController:controller animated:YES completion:nil];

然后收件人会收到以下消息:

在此处输入图像描述

URL是否可以将在“X 想分享”之后找到的文本更改为更用户友好的内容,例如“X 想与您分享列表”?提前致谢!

编辑

我现在有了这个,但它仍然产生了与上面相同的结果:

AirDropCustomURL *container = [[AirDropCustomURL alloc] initWithUrl:schemeURL];
NSString *message = @"a list";
controller = [[UIActivityViewController alloc] initWithActivityItems:@[message, container] applicationActivities:nil];

@interface AirDropCustomURL : NSObject <UIActivityItemSource>

@property (strong, nonatomic) NSURL *url;
@property (strong, nonatomic) UIImage *productImage;
- (id)initWithUrl:(NSURL *)url;

@implementation AirDropCustomURL

- (id)initWithUrl:(NSURL *)url {
    if (self = [super init]) {
        _url = url;
    }
    return self;
}

#pragma mark - UIActivityItemSource

- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController {
    //Because the URL is already set it can be the placeholder. The API will use this to determine that an object of class type NSURL will be sent.
    return self.url;
}

- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType {
    //Return the URL being used. This URL has a custom scheme (see ReadMe.txt and Info.plist for more information about registering a custom URL scheme).
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
        return nil;
    } else {
        if ([activityType isEqualToString:UIActivityTypeAirDrop]) {
            return self.url;
        }
    }
    return  nil;
}
4

4 回答 4

7

您必须实现一个符合 UIActivityItemSource 协议的类。这里有一个很好的例子:https ://developer.apple.com/LIBRARY/IOS/samplecode/sc2273/Introduction/Intro.html 。特别看一下 APLCustomURLContainer。实现 URL 容器类后,您可以将其与字符串一起添加到活动项目中(这将是您的自定义消息)

MyURLContainer *container = [[MyURLContainer alloc] initWithURL:yourURL];
NSString *message = @"Your message";
UIActivityViewController activityController = [[UIActivityViewController alloc] initWithActivityItems:@[message, container] applicationActivities:nil];

编辑:

起初我没有两部手机可以尝试,所以我只测试了 Facebook 和 Twitter,它工作正常,但是对于 AirDrop,我现在可以确认(经过一些测试)它总是使用 NSURL 的 relativeString,即使您覆盖 NSURL 的该方法,共享将不起作用,因此对于 AirDrop(其他活动,如 FB 都可以),无法使用当前 SDK 更改该消息。

于 2013-11-28T17:59:21.247 回答
2

您需要按照此处的教程进行操作。在标题“快速查看 UIActivityViewController”之后,我认为这正是您正在寻找的。

UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
[self presentViewController:controller animated:YES completion:nil];
于 2014-01-26T12:55:46.397 回答
1

在我看来,它使用的descriptionURL. 我会尝试子类NSURL化并覆盖该description方法以返回类似@"a list". 我没试过,但似乎可以工作......

编辑:我发现这个问题看起来和你的一样,它有一个公认的答案:空投:使自定义 URL 方案对收件人来说不那么难看

于 2013-11-28T18:02:18.117 回答
0

这个问题很久以前就已经发布过了。我尝试了@Ivan 的答案以及帖子中的其他答案,但是,它们不起作用!

我最初拥有的是左侧的图像。我正在通过 AirDrop 共享自定义数据,并查看了UIActivityController默认生成的标题“ data-3A4F9D... ”,orz。我想要实现的是一个更具描述性的标题,以便收件人更容易阅读(右图)。似乎它与您的问题非常相似(即使我在分享NSData时正在分享NSURL.

这是我所做的,效果很好:UIActivityItemSource在我的UIActivityItemProvider.

- (NSString *)activityViewController:(UIActivityViewController *)activityViewController
          subjectForActivityType:(NSString *)activityType
{
        // This returning string is added to the email title
        return NSLocalizedString(@"CustomTitle", nil);
}

如果您仍然遇到此问题,请随时尝试一下,让我知道它如何为您工作。

于 2015-02-03T18:14:16.393 回答