UIActivityViewController – 电子邮件和Twitter分享

我最近开始与UIActivity合作将我的应用程序分享给全世界,但是我没有什么问题。 首先,我没有find如何设置我的电子邮件的主题。 有什么办法吗? 其次,当我设置我的电子邮件的正文,有一个额外的“input”(电子邮件的第一行是空白的,我的文字从第二行开始)。 代码如下:

NSMutableArray *array = [[NSMutableArray alloc] initWithObjects: @"Test", nil]; UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:array applicationActivities:nil]; 

并在电子邮件中显示:

testing“

第三:有没有办法知道select哪种共享方式? 因为当用户在twitter上分享时,我想在我的post中joinhashtag,但是现在它也被整合到电子邮件中,这显然没有意义。

谢谢!

要在iOS6上使用UIActivityViewController将邮件添加到电子邮件中,这是任何人都可以使用的最佳解决scheme。您只需在初始化UIActivityViewController时调用以下内容。

 UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities]; [activityViewController setValue:@"My Subject Text" forKey:@"subject"]; 

而你的UIActivityViewController是填充一个主题。

在iOS7中,这可以通过使用 –

 activityViewController:subjectForActivityType: 

在发布项目时,服务可以提供单独的主题字段和数据字段,例如电子邮件消息。 如果您希望提供支持某个服务的主题字段,请实施此方法。

检查 – https://developer.apple.com/library/ios/documentation/uikit/reference/UIActivityItemSource_protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIActivityItemSource/activityViewController:subjectForActivityType

1和2: 如何在iOS 6中设置UIActivityViewController的收件人?

虽然这两种方法都是有点破解的,尤其是第一种,但这是可能的。

3:可以在不同的服务上共享不同的内容,但是项目的数量和types应该是相同的(但不是限制,实际上,因为你可以返回零,你不需要特殊服务的项目)。 在使用UIActivityItemSource协议select服务之后,您必须创build共享项目

我使用的代码:

用当前控制器显示UIActivityViewController作为所有项目的提供者(它应该在.h文件中):

 const int numberOfSharedItems = 5; - (IBAction)shareAction:(id)sender { NSMutableArray *shareItems = [NSMutableArray new]; while ([shareItems count] < numberOfSharedItems) [shareItems addObject: self]; UIActivityViewController *shareController = [[UIActivityViewController alloc] // actual items are prepared by UIActivityItemSource protocol methods below initWithActivityItems: shareItems applicationActivities :nil]; shareController.excludedActivityTypes = @[UIActivityTypeMessage, UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll]; [self presentViewController: shareController animated: YES completion: nil]; } 

为将要共享的项目创build占位符:

 -(id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController { static UIActivityViewController *shareController; static int itemNo; if (shareController == activityViewController && itemNo < numberOfSharedItems - 1) itemNo++; else { itemNo = 0; shareController = activityViewController; } switch (itemNo) { case 0: return @""; // intro in email case 1: return @""; // email text case 2: return [NSURL new]; // link case 3: return [UIImage new]; // picture case 4: return @""; // extra text (via in twitter, signature in email) default: return nil; } } 

对于不同的服务,制作将被共享的实际项目:

 -(id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType { // the number of item to share static UIActivityViewController *shareController; static int itemNo; if (shareController == activityViewController && itemNo < numberOfSharedItems - 1) itemNo++; else { itemNo = 0; shareController = activityViewController; } NSString *shareText = [self shareText]; // whatever you fancy NSURL *shareURL = [self shareURL]; // twitter if ([activityType isEqualToString: UIActivityTypePostToTwitter]) switch (itemNo) { case 0: return nil; case 1: return shareText; // you can change text for twitter, I add $ to stock symbol inside shareText here, eg Hashtags can be added too case 2: return shareURL; case 3: return nil; // no picture case 4: return @"via @YourApp"; default: return nil; } // email else if ([activityType isEqualToString: UIActivityTypeMail]) switch (itemNo) { case 0: return @"Hi!\r\n\r\nI used YourApp\r\n"; case 1: return shareText; case 2: return shareURL; case 3: return nil; // no picture case 4: return [@"\r\nCheck it out.\r\n\r\nCheers\r\n" stringByAppendingString: [self userName]]; default: return nil; } else // Facebook or something else in the future switch (itemNo) { case 0: return nil; case 1: return shareText; case 2: return shareURL; case 3: return [self shareImage]; case 4: return nil; default: return nil; } } 

你可以简单地创build一个类如下:

  @interface MYNActivityProvider : UIActivityItemProvider <UIActivityItemSource> @end 

//执行

  - (id) activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(NSString *)activityType { if ( [activityType isEqualToString:UIActivityTypePostToTwitter] ) { return stringToPost; } if ( [activityType isEqualToString:UIActivityTypePostToFacebook] ) { return stringToPost; } if ( [activityType isEqualToString:UIActivityTypeMessage] ) { return @"SMS message text"; } if ( [activityType isEqualToString:UIActivityTypeMail] ) { return @"Email text here!"; } if ( [activityType isEqualToString:@"Custom"] ) { return @"app custom text"; } return nil; } 

你可能想尝试OvershareKit 。

我们经常被问到为什么有人会使用OvershareKit而不是UIActivityViewController(UIAVC)和UIActivity。 UIAVC非常适合那些知道他们永远不需要下面任何一个的应用程序:

  1. 永远不需要与一个或两个以上的第三方服务集成。
  2. 永远不需要调整活动页面和共享屏幕的UI。
  3. 从不在乎为每种分享types提供单独的媒体特定内容(电子邮件与SMS等)
  4. 永不需要在同一张表中有多个项目,例如复制文本与复制链接。
  5. 不要介意所有非系统提供的活动都会陷入枯燥的单色图标之中。

您的情况是(3) – 需要关心不同内容的不同分享types。