最近、UIActivityと連携してアプリを世界に公開し始めましたが、問題はほとんどありません。 最初に、メールの件名を設定する方法が見つかりませんでした。方法はありますか?次に、電子メールの本文を設定すると、余分な「入力」があります(電子メールの最初の行は空白で、テキストは2行目から始まります)。コードは次のとおりです。
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects: @"Test", nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc]
initWithActivityItems:array applicationActivities:nil];
そして、電子メールでは、次のことを示しています。
」
テスト」
3番目:どの共有方法が選択されているかを知る方法はありますか?ユーザーがTwitterで共有するときに投稿にハッシュタグを含めたいのですが、今ではそれもメールに統合されるため、明らかに意味がありません。
ありがとう!
IOS6でUIActivityViewControllerを使用して電子メールにsubjectを追加する場合、これは誰でも使用できる最良のソリューションです。
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities];
[activityViewController setValue:@"My Subject Text" forKey:@"subject"];
そして、UIActivityViewControllerには件名が入力されます。
IOS7では、これを使用して-
activityViewController:subjectForActivityType:
アイテムを投稿するとき、サービスは、電子メールメッセージなどの個別のサブジェクトフィールドとデータフィールドを提供する場合があります。サブジェクトフィールドをサポートするサービスのサブジェクトフィールドを提供する場合は、このメソッドを実装します。
1および2: iOS 6でUIActivityViewControllerの受信者を設定する方法
提供されている方法は両方とも、特に最初の方法のように少しハッキングされていますが、可能です。
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;
}
}
uは、次のように単純にクラスを作成できます。
@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 を試してみてください。
UIActivityViewController(UIAVC)とUIActivityの代わりに誰かがOvershareKitを使用する理由をよく聞かれます。 UIAVCは、次のいずれも必要としないことがわかっているアプリに最適です。
- 1つまたは2つ以上のサードパーティサービスと統合する必要はありません。
- アクティビティシートと共有画面のUIを微調整する必要はありません。
- 各共有タイプ(電子メールとSMSなど)に個別のメディア固有のコンテンツを提供する必要はありません。
- 同じシートにテキストのコピーとリンクのコピーなど、複数のアイテムを含める必要はありません。
- システムが提供していないすべてのアクティビティが退屈な単色のアイコンで動けなくなることを気にしないでください。
あなたの状況は(3)-異なる共有タイプの異なるコンテンツを気にする必要があります。