在使用MFMailComposeViewController时遇到问题

27
我有一个棘手的问题。在我的一个应用程序中,已经有超过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.)"

我在谷歌上搜索了“timed out waiting for fence barrier from 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];
    }
}

嘿,我遇到了你描述的完全相同的问题。我的一个朋友在 iPhone 4 上遇到了这个问题,但我无法在 iPod touch 4th gen、3GS、4S 或 5 上重现它。我想也许是附件的大小导致的,所以我尝试将其压缩(它是一个 csv 文件),但没有任何区别。 - Ants
1
2013年11月,我也遇到了完全相同的问题。谢天谢地,这个解决方法很有效——只需使用一个全局MFMailComposeViewController,然后只使用它即可。问题类似的帖子还可以在这里找到 https://dev59.com/fmYr5IYBdhLWcg3w6eM3 - Fattie
1
我遇到了完全相同的问题。在iOS 6上,作曲家打开然后关闭,在iOS 7上它可以工作,但需要几秒钟才能响应。看起来是苹果的同步错误。 当在dispatch_after块中呈现MFMailComposeViewController(最小延迟为0.1秒)时,它不会失败,并且几乎立即准备好供用户交互。 - Vadim Yelagin
3个回答

13

不确定您是否已经解决了这个问题,但是在我的项目中最近遇到了这个问题。

我做的一个变通方法是在早期阶段分配和初始化MFMailComposeViewController,并将其保存在一个静态变量中,每当需要时获取静态MFMailComposeViewController实例并呈现它。

对我来说看起来有效,希望对您也有用。


4
此外,您几乎肯定需要在每次使用后“循环”全局MFMailComposeViewController。重复使用相同的控制器是不可靠的。创建一个全局例程,释放并重新初始化单例MFMailComposeViewController。每次完成使用后调用该例程。真麻烦。 - Fattie
1
大家好,如果我使用UIActivityViewController会怎么样? - Stas

5

我曾经遇到过同样的问题,这个解决方法对我很有帮助:

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(), ^{


我更喜欢这个解决方案,而不是静态和早期地分配视图控制器。 - Habizzle

4

我有完全相同的问题。我认为我已经把问题定位到了构建信息主体字符串所需的时间上。

评论内容

 //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]];

好的,听起来合理。你是动态地制定它吗? - Paul Peelen
是的,我会。 //消息正文 NSString *msgBody = [NSString stringWithFormat:@"我在pocketKPI中注意到了这些结果。%@的值为%@,与定义为%@的目标相比,差异为%@(或%@)。有时间我们可以讨论一下。", self.itemToView.kpiName, [DFSKpiFormatter formatNumberAsString:self.itemToView.currentValue], [self.itemToView determineVarianceLabelText],[self.itemToView determineVariancePercentLabelText], [DFSKpiFormatter formatNumberAsString:self.itemToView.targetValue]]; - MonkeyBusiness

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接