27

Ho un problema complesso. In una delle mie app, con oltre 150.000 download ... Ho un problema che si verifica raramente e che non riesco a capire.Problema quando si utilizza MFMailComposeViewController

Il problema è il seguente: In una vista in cui l'utente può condividere un elenco tramite e-mail, apro la finestra di posta utilizzando MFMailComposeViewController. Tuttavia, in alcuni casi l'applicazione sembra avere problemi nell'utilizzo del compositore di posta. L'utente preme il pulsante di condivisione, le finestre di posta si aprono, attende circa 1-2 secondi e poi si richiude nuovamente. Nessun contenuto nella finestra di posta, anche se invio dati ad esso. Io stesso non sono stato in grado di ricreare il problema su alcun dispositivo o nel simulatore, tuttavia un collega lo ha. Ho eseguito l'applicazione utilizzando XCode sul suo telefono e ottenuto il seguente nei registri:

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

Googled l'errore "Timeout durante l'attesa per la barriera di recinzione da com.apple.MailCompositionService", ma non può davvero trovare qualsiasi Aiuto.

Qualcuno ha qualche esperienza con questo? Come posso risolverlo?

Il mio codice per l'apertura della vista:

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

Ehi, sto sperimentando lo stesso identico problema che descrivi. Un amico ha questo problema su un iPhone 4 ma non riesco a riprodurlo su un iPod touch di quarta generazione, 3GS, 4S o 5. Ho pensato che forse era dovuto alla dimensione dell'allegato, quindi ho anche provato a comprarlo (era un CSV) , ma nessuna differenza. – Ants

+1

Sperimentare esattamente lo stesso problema, novembre 2013. Grazie a Dio, la soluzione funziona ** usa un MFMailComposeViewController globale e usalo solo ** .. allora sei d'oro. Domanda identica qui http: // StackOverflow.it/questions/13298448/ios6-mfmailcomposeviewcontroller-slow-to-load-and-flashes-black-screen-mailcom – Fattie

+1

Sto vivendo lo stesso identico problema. Su iOS 6 il compositore si apre e poi si chiude, su iOS 7 funziona ma non risponde per un paio di secondi. Sembra un bug di sincronizzazione di Apple. Quando si presenta MFMailComposeViewController nel blocco dispatch_after (con un ritardo minimo, ad esempio, 0,1 sec) non fallisce ed è pronto per l'interazione dell'utente quasi istantaneamente. –

risposta

11

Non sono sicuro se si è risolto il problema, ma ho incontrato di recente nel mio progetto.

Una soluzione che ho fatto è stato quello di allocare e avviare MFMailComposeViewController in una fase precedente, e tenerlo in una variabile statica, ogni volta che è necessario, ottenere l'istanza MFMailComposeViewController statica e presentarlo.

Sembra funzionare per me, spero che funzionerà anche per te.

+0

exu, questo è un consiglio fantastico ------ e sembra funzionare al 100% in modo affidabile. Abbiamo fatto un sacco di test. Grazie mille, davvero. Hai davvero salvato la giornata! – Fattie

+4

Inoltre, sarà quasi necessario "ciclare" il MFMailComposeViewController globale dopo ogni utilizzo. Non è affidabile "riutilizzare" lo stesso. Avere una routine globale che rilascia e quindi reinizializza il singleton MFMailComposeViewController. Chiamalo ogni volta dopo averlo finito. Che seccatura. – Fattie

+1

Hey ragazzi, cosa succede se uso UIActivityViewController ?? – Stas

4

Ho esattamente lo stesso problema. Penso di averlo inchiodato al tempo necessario per formulare la stringa del corpo del messaggio.

Contenuto dal commento

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

Ok, sembra ragionevole. Lo formuli in modo dinamico? –

+0

Sì, sì. // Corpo messaggio NSString * msgBody = [NSString stringWithFormat: @ "Ho notato questi risultati in pocketKPI. Il% @ era a% @ che è una varianza di% @ (o% @) rispetto al target definito come% @ . Quando si ha un po 'di tempo discutiamo ", self.itemToView.kpiName, [DFSKpiFormatter formatNumberAsString: self.itemToView.currentValue]., [self.itemToView determineVarianceLabelText], [self.itemToView determineVariancePercentLabelText], [DFSKpiFormatter formatNumberAsString: self.itemToView. targetvalue]]; – MonkeyBusiness

5

un avuto lo stesso problema, e questo mi ha aiutato fixe:

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

"@nathangaskin bene ... che è stato molto tempo fa :) Ma se non ricordo male, ha funzionato dopo ho rimosso i caratteri personalizzati dal mio codice UIAppearance "

Funziona bene per me.

Inoltre, seconda opzione è quella di avvolgere semplicemente chiamata la visualizzazione in

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

blocco

+0

Mi piace questa soluzione meglio di allocare il controller di visualizzazione staticamente e prima. –

Problemi correlati