6952
`MFMailComposeViewController` でメール送信しようとすると `viewServiceDidTerminateWithError`
が発生してしまいます。  
挙動としては、メーラーが起動して数秒後に元の画面に戻されます。

iOS7のシュミレータでは発生しません。  
iOS8のシュミレータでのみ発生。

デバッガに出力されたメッセージはこちらです。

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

改善方法が分かる方がいましたらよろしくお願いします。

ソースコードはこのような感じです。

```

    MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
    controller.mailComposeDelegate = (id)self;
    [controller setSubject:[NSString stringWithFormat:NSLocalizedString(@"mail_subject_about_view", @""),
                                                      NSLocalizedString(@"string_app_name", @"")]];
    
    NSMutableString *messageBody = [NSMutableString string];
    messageBody = @"test";
    [controller setMessageBody:messageBody isHTML:NO];
    [self presentViewController:controller animated:YES completion:nil];
    
```

`canSendMail` の判断は直前に入れています。
CC BY-SA 3.0
2015-02-23T03:03:16.947
6940
2015-02-23T08:03:31.743
2015-02-23T08:03:31.743
8000
3496
question
ios iphone ios-simulator
MFMailComposeViewControllerでメール送信しようとするとviewServiceDidTerminateWithErrorが発生してしまう
iOS8のシミュレータでのみ発生する問題みたいですね。

`MFMailComposeViewController` を初期化してすぐに使うとこのようなエラーが発生するらしく、

  * アプリが起動した時点で `MFMailComposeViewController` を初期化し、インスタンスを保持する
  * メールを送信するときはその場で初期化する代わりに、用意しておいたインスタンスを使う
  * 同じインスタンスは再利用せず、メール送信後に作り直す

という方法で回避できるようです。

参考: [ios - I have REAL misunderstanding with MFMailComposeViewController in
Swift (iOS8) in Simulator - Stack
Overflow](https://stackoverflow.com/a/25864182/2818869) （サンプルコードも載っています）
CC BY-SA 3.0
2015-02-23T05:10:52.670
6952
2015-02-23T05:10:52.670
2017-05-23T12:38:55.250
-1
8000
6940
answer