27 votes

Problème lors de l'utilisation de MFMailComposeViewController

J'ai un problème délicat. Dans une de mes applications, avec plus de 150.000 téléchargements... J'ai un problème qui se produit rarement et que je n'arrive pas à résoudre.

Le problème est le suivant : Dans une vue où l'utilisateur peut partager une liste par courrier électronique, j'ouvre la fenêtre de courrier à l'aide de MFMailComposeViewController . Cependant, dans certains cas, l'application semble rencontrer un problème lors de l'utilisation du compositeur de courrier. L'utilisateur appuie sur le bouton de partage, la fenêtre de courrier s'ouvre, attend environ 1 à 2 secondes, puis se referme. Il n'y a pas de contenu dans la fenêtre de courrier, bien que j'y envoie des données. Je n'ai pas été en mesure de recréer le problème sur un appareil ou dans le simulateur, mais un collègue l'a fait. J'ai exécuté l'application en utilisant XCode sur son téléphone et j'ai obtenu ce qui suit dans les journaux :

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.)"

J'ai cherché sur Google l'erreur "timed out waiting for fence barrier from com.apple.MailCompositionService" mais je n'ai pas trouvé d'aide.

Quelqu'un a-t-il une expérience en la matière ? Comment puis-je résoudre ce problème ?

Mon code pour ouvrir la vue :

-(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];
    }
}

13voto

exu Points 126

Je ne sais pas si vous avez résolu le problème, mais je l'ai rencontré récemment dans mon projet.

Une solution de contournement que j'ai trouvée consiste à allouer et initier MFMailComposeViewController à un stade antérieur, et le conserver dans une variable statique Lorsque le besoin s'en fait sentir, récupérer l'instance statique de MFMailComposeViewController et la présenter.

Cela semble fonctionner pour moi, j'espère que cela fonctionnera pour vous aussi.

5voto

tt.Kilew Points 2136

J'ai eu le même problème, et cette solution m'a aidé :

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

"@nathangaskin eh bien c'était il y a longtemps :) Mais si je me souviens bien, cela a fonctionné après avoir supprimé les polices personnalisées de mon code UIAppearance"

Cela fonctionne bien pour moi.

La deuxième option consiste à intégrer l'appel à l'affichage dans l'option

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

bloc

4voto

MonkeyBusiness Points 70

J'ai exactement le même problème. Je pense avoir trouvé la solution dans le temps nécessaire à la formulation de la chaîne du corps du message.

Contenu du commentaire

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X