2

iOS 6.0 アプリのカスタム コンテンツを電子メールで共有したいと考えています。

しかし、コンテンツを共有する前に準備に時間がかかるため、ユーザーが「共有」ボタンを押したときにすぐにメール作成ビューを表示することができません。残念ながら、MFMailComposeViewController は最初からすべての添付ファイルを必要とするため、MFMailComposeViewController を初期化して表示するには、添付ファイルを待つ必要があります (ここで提案されているように: UIActivityView attach file to Email ) 。

-- Sapan の回答を読んだ後に編集: 私が探しているのは、たとえば、まだ作成する必要があるビデオ ファイルを共有するときの UIActivityViewController のような動作です: ユーザーが共有ボタンを押すと、すぐに UIActivityController が表示されます。添付ファイルはバックグラウンドで作成され、作成によってユーザー エクスペリエンスが中断されることはありません。--

私はUIActivityViewControllerを非同期UIActivityItemProvider機能で試してみましたが、残念ながらこれは画像やビデオなどの公開MIMEタイプの添付ファイルに対してのみ機能するようです。私のカスタム NSData 'item' は、Facebook での共有 (これは完全に理にかなっています) だけでなく、電子メール共有でも単に無視されます。または、ここで何か間違ったことをしていますか:

MyUIActivityItemProvider *myCustomDocProvider = [[MyUIActivityItemProvider alloc] initWithPlaceholderItem:[[NSData alloc]init] andCustomInfoToCreateNSDataFrom:customAppInfo];
UIActivityViewController *activityVC = [[UIActivityViewController alloc]initWithActivityItems:@[myTextString, myCustomDocProvider] applicationActivities:nil];
[self presentViewController:activityVC animated:YES completion:nil];

ユーザーが入力している間/入力した後にバックグラウンドで添付ファイルを作成できるように、独自のカスタム メール コンポーザー ビューを作成することを既に考えています。しかし、私はしたくありません。HIG で読んだ「UI 要素の一貫性」という考え方が気に入っています。

私に何ができる?

4

3 に答える 3

1

次のようにメソッドを作成し、次を使用して呼び出すことができます[self performSelectorInBackground:@selector(sendMail)];

-(void) sendMail
{
    // Prepare the data

    // Attach the data
    MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    [picker addAttachmentData:myData mimeType:@"<YOUR-MIME-TYPE>" fileName:@"Filename"];

    // Show compose view controller on the main thread
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        // Fill out the email body text
        NSString *emailBody = @"Body";
        [picker setMessageBody:emailBody isHTML:NO];
        [self presentModalViewController:picker animated:YES];
    });
}
于 2012-11-12T22:22:18.707 に答える
0

これは、myCustomDocProvider でブール値を使用して、ファイルの構築が完了するまでアイテムの戻りを保持することで実行できます。進行状況を表示したり、メイン ビューにアクティビティ インジケーターを表示したりする場合は、メイン スレッドから呼び出してこれを行うことができます。これが実際のコード スニペットです。

進行状況ビューをロードするには、この関数を使用してプロバイダーでアクティビティ ビュー コントローラーを設定します。

self.parentViewController = parentVc;

これは、ブロックとフィードバックのビュー ロードを使用したアイテム関数です。

self.wait = true;

[self prepareFile:^(){
    [self performSelectorOnMainThread:@selector(dismissProgressView) 
                              withObject:nil waitUntilDone:NO];
}];

[self performSelectorOnMainThread:@selector(loadProgressView) 
                              withObject:nil waitUntilDone:NO];

while (self.wait) {
    [self performSelectorOnMainThread:@selector(updateProgressView) 
                                     withObject:nil waitUntilDone:NO];
}

return self.completedUrl;

その後、進行状況ビューを表示するためにメイン スレッドで呼び出される 3 つの関数を作成し、ファイルの完了を待っている間に進行状況ビューを更新できます。disconnectProgressView 関数の実装では、dismissViewController が完了したときに待機ブール値を false に設定してください。

于 2013-03-29T03:05:32.683 に答える
0

できることは、リモート サーバーから参照される画像またはメディアを含む HTML にメール本文を設定することです。その場合、ユーザーはメール作成ビューに壊れた画像が表示されます (おそらく、巧妙な HTML を使用してこれを非表示にすることができます) が、メールが受信された時点でアップロードを行う必要があります。

電子メールの送信後に失敗する可能性があるため、最適ではありませんが、おそらく最善の策です.

于 2012-12-11T22:42:52.867 に答える