SORU
1 EYLÜL 2014, PAZARTESİ


Simülatörde (iOS8) Swift MFMailComposeViewController ile bir yanlış anlaşılma var GERÇEKTEN

Ben programlı olarak CSV-dosya oluşturmak ve e-posta ile göndermek için deneyin. Görüntüler posta göndermek için bir pencere, ama e-posta herhangi bir vücut ile dolu değil ve ekli dosya yok. Uygulama bu ekran kilitleniyor: http://prntscr.com/4ikwwm düğmesi "İptal et" çalışmıyor.

Konsolda birkaç saniye sonra aşağıdaki metin görüntülenir:

viewServiceDidTerminateWithError: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 "The operation couldn’t be completed. (_UIViewServiceInterfaceErrorDomain error 3.)" UserInfo=0x7f8409f29b50 {Message=Service Connection Interrupted}

<MFMailComposeRemoteViewController: 0x7f8409c89470> timed out waiting for fence barrier from com.apple.MailCompositionService

Benim kod var:

func actionSheet(actionSheet: UIActionSheet!, clickedButtonAtIndex buttonIndex: Int) {
    if buttonIndex == 0 {
        println("Export!")

        var csvString = NSMutableString()
        csvString.appendString("Date;Time;Systolic;Diastolic;Pulse")

        for tempValue in results {     //result define outside this function

            var tempDateTime = NSDate()
            tempDateTime = tempValue.datePress
            var dateFormatter = NSDateFormatter()
            dateFormatter.dateFormat = "dd-MM-yyyy"
            var tempDate = dateFormatter.stringFromDate(tempDateTime)
            dateFormatter.dateFormat = "HH:mm:ss"
            var tempTime = dateFormatter.stringFromDate(tempDateTime)

            csvString.appendString("\n\(tempDate);\(tempTime);\(tempValue.sisPress);\(tempValue.diaPress);\(tempValue.hbPress)")
        }

        let fileManager = (NSFileManager.defaultManager())
        let directorys : [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.AllDomainsMask, true) as? [String]

        if ((directorys) != nil) {

            let directories:[String] = directorys!;
            let dictionary = directories[0];
            let plistfile = "bpmonitor.csv"
            let plistpath = dictionary.stringByAppendingPathComponent(plistfile);

            println("\(plistpath)")

            csvString.writeToFile(plistpath, atomically: true, encoding: NSUTF8StringEncoding, error: nil)

            var testData: NSData = NSData(contentsOfFile: plistpath)

            var myMail: MFMailComposeViewController = MFMailComposeViewController()

            if(MFMailComposeViewController.canSendMail()){

                myMail = MFMailComposeViewController()
                myMail.mailComposeDelegate = self

                // set the subject
                myMail.setSubject("My report")

                //Add some text to the message body
                var sentfrom = "Mail sent from BPMonitor"
                myMail.setMessageBody(sentfrom, isHTML: true)

                myMail.addAttachmentData(testData, mimeType: "text/csv", fileName: "bpmonitor.csv")

                //Display the view controller
                self.presentViewController(myMail, animated: true, completion: nil)
            }
            else {
                var alert = UIAlertController(title: "Alert", message: "Your device cannot send emails", preferredStyle: UIAlertControllerStyle.Alert)
                alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil))
                self.presentViewController(alert, animated: true, completion: nil)


            }
        }
        else {
            println("File system error!")
        }
    }
}

UIActivityViewController kullanarak posta göndermek yerine çalışıyor:

let fileURL: NSURL = NSURL(fileURLWithPath: plistpath)
let actViewController = UIActivityViewController(activityItems: [fileURL], applicationActivities: nil)
self.presentViewController(actViewController, animated: true, completion: nil)

Yaklaşık aynı ekran önceki ekrana bir süre sonra geri dönen e-posta göndermek için bakın. Konsol, başka bir hata: şimdi

viewServiceDidTerminateWithError: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 "The operation couldn’t be completed. (_UIViewServiceInterfaceErrorDomain error 3.)" UserInfo=0x7faab3296ad0 {Message=Service Connection Interrupted}

Errors encountered while discovering extensions: Error Domain=PlugInKit Code=13 "query cancelled" UserInfo=0x7faab3005890 {NSLocalizedDescription=query cancelled}

<MFMailComposeRemoteViewController: 0x7faab3147dc0> timed out waiting for fence barrier from com.apple.MailCompositionService

PlugInKit bir şey vardı.

Bunun yerine UIActivityViewController UIDocumentInteractionController kullanarak çalışıyor:

let docController = UIDocumentInteractionController(URL: fileURL)
docController.delegate = self
docController.presentPreviewAnimated(true)
...

func documentInteractionControllerViewControllerForPreview(controller: UIDocumentInteractionController!) -> UIViewController! {
    return self
}

Görüyorum ki bu ekran içeriğini bir CSV dosyası: http://prntscr.com/4ilgax İ düğmesine basın ihracat-sağ üst ve Bakın bu ekran http://prntscr.com/4ilguk nereye seçiyorum POSTA ve birkaç saniye görüyorum http://prntscr.com/4ilh2h

Daha sonra dosyanın içeriğini göstermek için döndürür!

İçinde UIActivityViewController kullanırken aynı mesajları konsolu.

Cihaz üzerinde geliştirici abonelik kontrol edemiyorum. Belki de bu yüzden mi?

Nedeni ne olabilir bilmiyorum. Kafamı kırdım! Bana yardım et, lütfen.

CEVAP
16 EYLÜL 2014, Salı


(ÖNEMLİ - BU SİMÜLATÖR KULLANMAYIN.)

Her şeyden önce, başka unutmayınsimülatörü bu tamamen umutsuz.

Bu gerçekten, öylehala geçerli gibi görünüyorşimdi, erken 2015.

Ne yazık ki, simülatörü kullanarak unutun - hiç uğraşma çalışıyor, sadece işleri daha da karıştıracak.


Henri toplam cevap verdi - aynen öyle.

GEREKİR

--ve daha erken bir aşamada MFMailComposeViewController tahsis başlatmakve

--bir statik değişkende tutunve sonra,

-- gerektiğinde, statik MFMailComposeViewController örnek al ve kullan.

VE neredeyse kesinlikle olacak"döngü" her kullanımdan sonra küresel MFMailComposeViewController.

DEĞİL"yeniden kullanım" aynı kişi. güvenilir Bültenleri ve sonra yeniden başlatır tek MFMailComposeViewController küresel fayda var. Genel rutin, posta besteci tamamladıktan sonra her zaman arayabilirsiniz.

Bu kadar!

Herhangi bir ikili olarak şunları yapabilirsiniz. Bu yüzden, bunu yapmak için iyi bir yer sadece AppDelegate.h. (App temsilci, tabii unutmayın ki, bir tekiz. Böyle bir şey eklemek için mantıklı bir yer.)

@property (nonatomic, strong) MFMailComposeViewController *globalMailComposer;

Bu singleton, eğer AppDelegate kullanarak örneğin başlattığında sonra,...

-(BOOL)application:(UIApplication *)application
   didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
    ........
    // part 3, our own setup
    [self cycleTheGlobalMailComposer];
    // needed due to the worst programming in the history of Apple Corporation
    .........
    }

ve...

-(void)cycleTheGlobalMailComposer
    {
    // we are cycling the damned GlobalMailComposer... due to horrible iOS issue
    self.globalMailComposer = nil;
    self.globalMailComposer = [[MFMailComposeViewController alloc] init];
    }

Sonra posta kullanmak için, böyle bir şey ...

-(void)helpEmail
    {
    // APP.globalMailComposer IS READY TO USE from app launch.
    // recycle it AFTER OUR USE.

    if ( [MFMailComposeViewController canSendMail] )
        {
        [APP.globalMailComposer setToRecipients:
              [NSArray arrayWithObjects: emailAddressNSString, nil] ];
        [APP.globalMailComposer setSubject:subject];
        [APP.globalMailComposer setMessageBody:msg isHTML:NO];
        APP.globalMailComposer.mailComposeDelegate = self;
        [self presentViewController:APP.globalMailComposer
             animated:YES completion:nil];
        }
    else
        {
        [UIAlertView ok:@"Unable to mail. No email on this device?"];
        [APP cycleTheGlobalMailComposer];
        }
    }

-(void)mailComposeController:(MFMailComposeViewController *)controller
     didFinishWithResult:(MFMailComposeResult)result
     error:(NSError *)error
    {
    [controller dismissViewControllerAnimated:YES completion:^
        { [APP cycleTheGlobalMailComposer]; }
        ];
    }

{Not - aşağıda Michael Salamone başına. Sonunda kod satırında "..." 'denetleyici' rutin içinde geçti . görevden dismissViewControllerAnimated ^strong>değil''.} kendini kapatmak

Elbette var Önek dosyanızda şu

#define APP ((AppDelegate *)[[UIApplication sharedApplication] delegate])
// (it's worth noting that is the app delegate, not the "the application")

Umarım yardımcı olur. Size gün kurtaracak.

Daha Hızlı alakasız olduğunu unutmayın.

Ayrıca burada bir "" sorun gün mal olabilir (), not bu kritik ipucu: http://stackoverflow.com/a/17120065/294884 . küçük

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Art Food Kitty - Kelly Eddington

    Art Food Kit

    7 Kasım 2006
  • Tina Chen

    Tina Chen

    26 Mayıs 2012
  • Valdorsha

    Valdorsha

    8 Mayıs 2006