2012-11-12 1 views
2

이메일을 통해 내 iOS 6.0 앱의 맞춤 콘텐츠를 공유하고 싶습니다.iOS : 메일 작성보기가 이미 표시되어있을 때 백그라운드에서 맞춤 이메일 첨부 파일을 만들고 준비하는 방법은 무엇입니까?

하지만 내 콘텐츠를 공유하기 전에 준비하는 데 다소 시간이 걸리기 때문에 사용자가 '공유'버튼을 누르면 즉시 메일 작성보기를 표시 할 수 없습니다. 불행하게도 MFMailComposeViewController는 처음부터 모든 첨부 파일이 필요합니다, 그래서 내가 MFMailComposeViewController init을하고 표시 할 수 있습니다 전에 첨부 파일을 기다릴 필요가 (이 여기에 제안처럼 : UIActivityView attach file to Email)

- 편집 Sapan의 대답 읽은 후 : 내가 '무엇 찾고있는 것은 UIActivityViewController와 같은 동작입니다 (예 : 공유 할 때). 아직 만들어야하는 비디오 파일 : 사용자가 공유 버튼을 누르면 즉시 UIActivityController가 표시됩니다. 첨부 파일이 백그라운드에서 생성되며 작성이 사용자의 경험을 방해하지 않습니다. -

좋은 비동기식 UIActivityItemProvider 기능을 사용하여 UIActivityViewController를 시도했지만, 불행히도 이것은 이미지 및 비디오와 같은 공용 MIME 유형이있는 첨부 파일에서만 작동하는 것 같습니다. 내 사용자 정의 NSData '항목'은 단순히 페이스 북 (완벽하게 이해할 수 있음)에서의 공유뿐만 아니라 전자 메일 공유에서도 무시됩니다. 아니면 내가 잘못 여기서 뭔가를하고있는 중이 야 :

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 요소의 일관성'에 대한 아이디어를 좋아합니다.

어떻게해야합니까?

+0

난 그냥 stackoverflow 시작했습니다. 내 질문에 무엇을 잘못 했습니까? 왜 내가 downvoted 얻을 않았다? 나는 오랫동안 풀린 문제에 대한 충분한 연구를하지 않았는가? 아니면 내 스타일인가?너무 오래? 너무 불분명하니? – Goodsquirrel

+0

Gnarly. 그러나 프로세스가 첨부 파일 생성을 완료하기 전에 사용자가 Send (MFMailComposeViewController에서)를 누르면 어떻게 될까요? 이 시점에서 좋은 옵션은 없습니다 (실제로 메일을 보내면 수정 될 수 있습니다 - 실제로 할 수있는 경우 - 실제로는 펑키 할 것입니다). 나는 그들이 우편물을 보내기 전에 지연을 겪는 좋은 대안을 볼 수 없다. 아마도 취소 가능한 "바쁜 상자"로 인해 견딜 수 있습니다. – jbbenni

답변

1

당신은 다음과 같은 방법을 만든 다음 원격 서버에서 참조 된 이미지 나 미디어를 HTML로 메일 본문을 설정 당신이 할 수있는 [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]; 
    }); 
} 
+0

답변 해 주셔서 대단히 감사합니다. 불행하게도 이것은 문제를 해결하지 못합니다. 왜냐하면 - 메인 스레드를 막지는 못했지만, 버튼을 눌렀을 때 MFMailComposeViewController가 나타나지 않고 백그라운드에서 첨부 파일을 만든 후에 만 ​​표시되기 때문입니다. 첨부 파일을 만드는 데 3 초, 어쩌면 10 초가 걸리는 경우 사용자에게 좋은 경험이 아닙니다. 미안하지만, 내 질문에 충분히 명확하지 않은 경우 : 백그라운드에서 첨부 파일을 처리하는 동안 mailComposeVC를 즉시 표시하는 방법을 찾고 있습니다 (예 : UIActivityViewController와 같이 동영상 등). – Goodsquirrel

0

사용하여 호출 할 수 있습니다. 그런 다음 사용자는 메일 작성보기에서 깨진 이미지를 볼 수 있습니다 (일부 영리한 HTML을 사용하여 숨길 수 있음). 메일을받은 시점에 업로드가 완료되어야합니다.

이메일을 보내고 나면 실패 할 수 있지만 최선의 방법 일 수는 없으므로 최적이 아닙니다.

0

이 작업은 myCustomDocProvider에서 boolean을 사용하여 파일 작성이 완료 될 때까지 항목 반환을 유지함으로써 수행 할 수 있습니다. 진행 상황을 보거나 기본보기에 활동 표시기를 표시하려면 주 스레드에서 호출하여이 작업을 수행 할 수 있습니다. 다음은 작동중인 코드 스 니펫입니다.

진행 뷰를로드하려면이 기능으로 제공자의 활동보기 컨트롤러를 설정하십시오.

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; 

당신은 다음 진행보기를 진행보기를 보여 주 스레드에서 호출되는 세 가지 함수를 만들 업데이트 할 수 있습니다. dismissProgressView 함수의 구현에서 dismissViewController가 완료되면 wait boolean을 false로 설정해야합니다.

+1

답변 해 주셔서 감사합니다. 내가 올바르게 이해하면, 문서가 준비 될 때까지 MFMailComposeVC 표시를 중지하라는 제안 (Sapan Diwapar처럼)을 제안하는 것입니다. 또한 메인 스레드를 완전히 막을 것을 제안합니다 (진행 표시기를 보여줌). 그러나 내가 찾고 있던 것은 MFMailCompositingVC가 이미 화면에 표시되고 사용할 수있는 동안 백그라운드에서 문서를 준비하는 솔루션이었습니다. – Goodsquirrel

+0

당신의 공급자에서 부울을 사용한다는 것은 무엇을 의미합니까? 에서와 같이,'activityViewController : itemForActivityType'에서 부울을 반환 하시겠습니까? – diachedelic