Проблема при использовании MFMailComposeViewController

У меня есть сложная проблема. В одном из моих приложений с более чем 150 000 загрузок... У меня проблема, которая возникает редко и которую я не могу понять.

Проблема заключается в следующем: в представлении, где пользователь может поделиться списком по электронной почте, я открываю окно почты, используя MFMailComposeViewController. Однако в некоторых случаях у приложения возникают проблемы с использованием компоновщика почты. Пользователь нажимает кнопку «Поделиться», окно почты поднимается, ждет около 1-2 секунд, а затем снова закрывается. Нет содержимого в почтовом окне, хотя данные на него отправляю. Я сам не смог воссоздать проблему ни на одном устройстве или в симуляторе, однако у одного коллеги это получилось. Я запустил приложение с помощью XCode на его телефоне и получил в логах следующее:

2013-03-01 14:43:39.604 appname[318:907] <MFMailComposeRemoteViewController: 0x1ebfb100> timed out waiting for fence barrier from com.apple.MailCompositionService
2013-03-01 14:43:39.631 appname[318:907] viewServiceDidTerminateWithError: Error Domain=XPCObjectsErrorDomain Code=2 "The operation couldn’t be completed. (XPCObjectsErrorDomain error 2.)"

Я погуглил ошибку «время ожидания барьера забора от com.apple.MailCompositionService истекло», но не могу найти никакой помощи.

Есть ли у кого-нибудь опыт в этом? Как я могу это решить?

Мой код для открытия представления:

-(void)displayComposerSheetWithBodyString:(NSString *)aBody
{
    if ([MFMailComposeViewController canSendMail])
    {
        MFMailComposeViewController *picker = [[MFMailComposeViewController alloc]init];
        picker.mailComposeDelegate = self;

        [picker setSubject:@"Lista"];

        NSString *emailBody = aBody;
        [picker setMessageBody:emailBody isHTML:NO];

        [self.navigationController presentModalViewController:picker animated:YES];
    }
    else
    {
        [[[UIAlertView alloc]initWithTitle:NSLocalizedString(@"Din enhet är inte redo att skicka e-post. Kontrollera dina inställningar", nil)
                                   message:nil
                                  delegate:self
                         cancelButtonTitle:NSLocalizedString(@"OK", nil)
                         otherButtonTitles:nil]
         show];
    }
}

person Paul Peelen    schedule 01.03.2013    source источник
comment
Здравствуйте, у меня точно такая же проблема, как вы описываете. У друга есть эта проблема на iPhone 4, но я не могу воспроизвести ее на iPod touch 4-го поколения, 3GS, 4S или 5. Я подумал, что это может быть из-за размера вложения, поэтому также попытался заархивировать его (был csv) , но никакой разницы.   -  person Ants    schedule 15.06.2013
comment
Возникла точно такая же проблема, ноябрь 2013 г. Слава богу, обходной путь работает используйте один глобальный MFMailComposeViewController и используйте только его .. тогда у вас все в порядке. Идентичный вопрос здесь черный экран mailcom"> stackoverflow.com/questions/13298448/   -  person Fattie    schedule 31.10.2013
comment
Я испытываю точно такую ​​​​же проблему. На iOS 6 композитор открывается и закрывается, на iOS 7 работает, но пару секунд не отвечает. Похоже на ошибку синхронизации Apple. При представлении MFMailComposeViewController в блоке dispatch_after (с минимальной задержкой, скажем, 0,1 сек) он не дает сбоев и практически мгновенно готов к взаимодействию с пользователем.   -  person Vadim Yelagin    schedule 07.11.2013


Ответы (3)


Не уверен, что вы исправили проблему, но недавно я встретил ее в своем проекте.

Обходной путь, который я использовал, заключался в том, чтобы выделить и инициировать MFMailComposeViewController на более раннем этапе и хранить его в одной статической переменной, когда это необходимо, получить статический экземпляр MFMailComposeViewController и представить его.

Кажется, это работает для меня, надеюсь, что это сработает и для вас.

person exu    schedule 18.06.2013
comment
exu, это фантастический совет ------ и, похоже, он работает на 100% надежно. Мы сделали кучу тестов. Большое спасибо, правда. Вы действительно спасли день! - person Fattie; 31.10.2013
comment
Кроме того, вам почти наверняка придется циклически запускать глобальный MFMailComposeViewController после каждого использования. Ненадежно повторно использовать один и тот же. Имейте глобальную процедуру, которая выпускает, а затем повторно инициализирует одноэлементный MFMailComposeViewController. Вызывайте его каждый раз после того, как закончите с ним. Какая проблема. - person Fattie; 31.10.2013
comment
Эй, ребята, а что, если я использую UIActivityViewController?? - person Stas; 13.10.2014

была такая же проблема, и это исправление помогло мне:

https://twitter.com/christian_beer/statuses/321295533077565440

"@nathangaskin ну… это было давно :) Но, если я правильно помню, это сработало после того, как я удалил пользовательские шрифты из своего кода UIAppearance"

Он отлично работает для меня.

Кроме того, второй вариант - просто обернуть отображаемый вызов в

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.3 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{

блокировать

person tt.Kilew    schedule 11.11.2013
comment
Мне нравится это решение лучше, чем статическое и раннее выделение контроллера представления. - person max.mustermann; 21.11.2013

У меня точно такая же проблема. Я думаю, что я прибил его ко времени, которое требуется для формулировки строки тела сообщения.

Контент из комментария

 //Message Body 
NSString *msgBody = [NSString stringWithFormat:
                        @"I noticed these results in pocketKPI. The %@ was at %@ which is a variance of %@(or %@) to the target defined as %@. When you have some time let's discuss.", 
                        self.itemToView.kpiName, 
                        [DFSKpiFormatter formatNumberAsString:self.itemToView.currentValue], [self.itemToView determineVarianceLabelText],
                        [self.itemToView determineVariancePercentLabelText], 
                        [DFSKpiFormatter formatNumberAsString:self.itemToView.targetValue]];
person MonkeyBusiness    schedule 20.03.2013
comment
Хорошо, звучит разумно. Вы формулируете это динамически? - person Paul Peelen; 21.03.2013
comment
Да. //Тело сообщения NSString *msgBody = [NSString stringWithFormat:@Я заметил эти результаты в pocketKPI. %@ было равно %@, что является отклонением %@(или %@) от целевого значения, определенного как %@. Когда у вас будет время, давайте обсудим. ]; - person MonkeyBusiness; 24.03.2013