我最近开始与UIActivity合作,将我的应用程序分享给全世界,但我遇到的问题很少。 首先,我没有找到如何设置电子邮件的主题。有什么办法吗?其次,当我设置电子邮件的正文时,会有一个额外的“输入”(电子邮件的第一行是空白,我的文本从第二行开始)。这是代码:
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects: @"Test", nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
initWithActivityItems:array applicationActivities:nil];
在电子邮件中,它显示:
“
测试 “
第三:有没有办法知道选择了哪种共享方法?因为我希望在用户在Twitter上分享时在我的帖子中包含一个标签,但现在它也被集成在电子邮件中,这显然没有意义。
谢谢!
答案 0 :(得分:50)
要在iOS6上使用UIActivityViewController将主题添加到电子邮件中,这是任何人都可以使用的最佳解决方案。您所要做的就是在初始化UIActivityViewController时调用以下内容。
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities];
[activityViewController setValue:@"My Subject Text" forKey:@"subject"];
您的UIActivityViewController上填充了主题。
答案 1 :(得分:24)
在iOS7中,可以使用 -
activityViewController:subjectForActivityType:
发布项目时,服务可能会提供单独的主题 字段和数据字段,例如电子邮件消息。实现此方法 如果您希望为支持该服务的服务提供主题字段。
答案 2 :(得分:16)
1和2:How do I set recipients for UIActivityViewController in iOS 6?
尽管两种方法都有点破解,特别是第一种方法,但这是有可能的。
3:可以在不同的服务上分享不同的内容,但是项目的数量和类型应该相同(但这不是限制,实际上,因为你可以为不需要的项目返回nil特定服务)。使用UIActivityItemSource协议选择服务后,您必须创建共享项目
我使用的代码:
使用当前控制器显示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];
}
为要共享的项目制作占位符:
-(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, e.g. 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;
}
}
答案 3 :(得分:2)
你可以简单地按如下方式创建一个类:
@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;
}
答案 4 :(得分:0)
您可能想尝试OvershareKit。
我们经常被问到为什么有人会使用OvershareKit而不是UIActivityViewController(UIAVC)和UIActivity。 UIAVC非常适合那些知道他们永远不需要以下任何内容的应用程序:
- 永远不需要与一个或两个以上的第三方服务集成。
- 永远不需要调整活动表和共享屏幕的UI。
- 从不关心为每种共享类型(电子邮件与短信等)提供单独的媒体特定内容
- 永远不需要在同一张表中包含多个项目,例如复制文本和复制链接。
- 不要介意所有非系统提供的活动都会遇到无聊的单色图标。
醇>
您的情况是(3) - 需要关注不同共享类型的不同内容。