使用 MFMailComposeViewController 时 Monotouch iOS 6 崩溃

Posted

技术标签:

【中文标题】使用 MFMailComposeViewController 时 Monotouch iOS 6 崩溃【英文标题】:Monotouch iOS 6 crash when using MFMailComposeViewController 【发布时间】:2012-09-24 15:02:01 【问题描述】:

我在 Monotouch ios 6 中使用 MFMailComposeViewController 时遇到一个奇怪的错误,但它在 iOS 5.1 中运行良好:

*** Assertion failure in NSDictionary *_UIRecordArgumentOfInvocationAtIndex(NSInvocation *, NSUInteger, BOOL)(), /SourceCache/UIKit/UIKit-2372/UIAppearance.m:1118

代码如下:

MFMailComposeViewController _mail;

    public void SendFeedbackMail (string email_subject, string email_message_body, string[] email_recipients)
    
        if (MFMailComposeViewController.CanSendMail) 
            _mail = new MFMailComposeViewController ();
            _mail.SetSubject (email_subject);
            _mail.SetToRecipients (email_recipients);
            _mail.SetMessageBody (email_message_body + "\n", false);
            _mail.Finished += HandleMailFinished;

            root_controller.PresentViewController(_mail, true, null);

         else 
            //handle not being able to send mail
            UIAlertView alert = new UIAlertView ("Mail Alert", "Error: Check your eMail configuration", null, "OK", null);
            alert.Show ();
        

    

模拟器上的原生堆栈跟踪:

Native stacktrace:

0   MyAppProject                        0x0007ba5c mono_handle_native_sigsegv + 284
1   MyAppProject                        0x00004a62 mono_sigsegv_signal_handler + 178
2   libsystem_c.dylib                   0x93ad486b _sigtramp + 43
3   ???                                 0xffffffff 0x0 + 4294967295
4   MyAppProject                        0x0014e8be mono_runtime_invoke + 126
5   MyAppProject                        0x001ec80f monotouch_exception_handler + 63
6   CoreFoundation                      0x020e0318 __handleUncaughtException + 728
7   libobjc.A.dylib                     0x0228d0b9 _ZL15_objc_terminatev + 86
8   libstdc++.6.dylib                   0x0289e652 _ZSt9terminatev + 21
9   libobjc.A.dylib                     0x0228d039 _destroyAltHandlerList + 0
10  libdispatch.dylib                   0x0299d027 _dispatch_client_callout + 33
11  libdispatch.dylib                   0x0298cd5f _dispatch_barrier_sync_f_invoke + 58
12  libdispatch.dylib                   0x0298caa3 dispatch_barrier_sync_f + 108
13  libdispatch.dylib                   0x0298ce5e dispatch_sync + 45
14  UIKit                               0x00f7ffad __76-[_UIRemoteViewControllerConnectionRequest _connectToViewControllerOperator]_block_invoke_0 + 105
15  UIKit                               0x00f8be46 __block_global_0 + 54
16  libdispatch.dylib                   0x0299d014 _dispatch_client_callout + 14
17  libdispatch.dylib                   0x0298f09f dispatch_once_f + 57
18  libdispatch.dylib                   0x0298f061 dispatch_once + 31
19  UIKit                               0x00f8be0a __73-[_UIViewServiceSessionEndpoint connectToDeputyOfType:connectionHandler:]_block_invoke_0 + 105
20  UIKit                               0x00f8c002 __73-[_UIViewServiceSessionEndpoint connectToDeputyOfType:connectionHandler:]_block_invoke_040 + 25
21  UIKit                               0x00fe94e9 __block_global_0 + 32
22  libdispatch.dylib                   0x0298b53f _dispatch_call_block_and_release + 15
23  libdispatch.dylib                   0x0299d014 _dispatch_client_callout + 14
24  libdispatch.dylib                   0x0298d418 _dispatch_queue_drain + 239
25  libdispatch.dylib                   0x0298d2a6 _dispatch_queue_invoke + 59
26  libdispatch.dylib                   0x0298e280 _dispatch_root_queue_drain + 231
27  libdispatch.dylib                   0x0298e450 _dispatch_worker_thread2 + 39
28  libsystem_c.dylib                   0x93aeae12 _pthread_wqthread + 441
29  libsystem_c.dylib                   0x93ad2cca start_wqthread + 30

同样在模拟器上,应用程序会挂起一段时间,然后在调试器上抛出异常并崩溃:

    Mono.Debugger.Soft.VMDisconnectedException: Exception of type 'Mono.Debugger.Soft.VMDisconnectedException' was thrown. at Mono.Debugger.Soft.Connection.SendReceive (CommandSet command_set, Int32 command, Mono.Debugger.Soft.PacketWriter packet) [0x00117] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs:1420 
  at Mono.Debugger.Soft.Connection.Type_GetCustomAttributes (Int64 id, Int64 attr_type_id, Boolean inherit) [0x00000] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs:1986 
  at Mono.Debugger.Soft.TypeMirror.GetCAttrs (Mono.Debugger.Soft.TypeMirror type, Boolean inherit) [0x0003d] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/TypeMirror.cs:679 
  at Mono.Debugger.Soft.TypeMirror.GetCustomAttributes (Boolean inherit) [0x00000] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/TypeMirror.cs:664 
  at Mono.Debugging.Soft.SoftDebuggerAdaptor.OnGetTypeDisplayData (Mono.Debugging.Evaluation.EvaluationContext gctx, System.Object type) [0x0001e] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerAdaptor.cs:1066 
Application Terminated
Mono.Debugger.Soft.VMDisconnectedException: Exception of type 'Mono.Debugger.Soft.VMDisconnectedException' was thrown.
  at Mono.Debugger.Soft.Connection.SendReceive (CommandSet command_set, Int32 command, Mono.Debugger.Soft.PacketWriter packet) [0x0013f] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs:1425 
  at Mono.Debugger.Soft.Connection.Type_GetMethodsByNameFlags (Int64 id, System.String name, Int32 flags, Boolean ignoreCase) [0x00016] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/Connection.cs:2002 
  at Mono.Debugger.Soft.TypeMirror.GetMethodsByNameFlags (System.String name, BindingFlags flags, Boolean ignoreCase) [0x0001c] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/contrib/Mono.Debugger.Soft/Mono.Debugger.Soft/TypeMirror.cs:691 
  at Mono.Debugging.Soft.SoftDebuggerAdaptor.OverloadResolve (Mono.Debugging.Soft.SoftEvaluationContext ctx, System.String methodName, Mono.Debugger.Soft.TypeMirror type, Mono.Debugger.Soft.TypeMirror[] argtypes, Boolean allowInstance, Boolean allowStatic, Boolean throwIfNotFound) [0x00073] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerAdaptor.cs:1231 
  at Mono.Debugging.Soft.SoftDebuggerAdaptor.CallToString (Mono.Debugging.Evaluation.EvaluationContext ctx, System.Object obj) [0x00107] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerAdaptor.cs:91 
  at Mono.Debugging.Evaluation.ObjectValueAdaptor.TargetObjectToObject (Mono.Debugging.Evaluation.EvaluationContext ctx, System.Object obj) [0x00349] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/src/core/Mono.Debugging/Mono.Debugging.Evaluation/ObjectValueAdaptor.cs:980 
  at Mono.Debugging.Soft.SoftDebuggerAdaptor.TargetObjectToObject (Mono.Debugging.Evaluation.EvaluationContext gctx, System.Object obj) [0x001a5] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/src/addins/MonoDevelop.Debugger.Soft/Mono.Debugging.Soft/SoftDebuggerAdaptor.cs:1400 
  at Mono.Debugging.Evaluation.ExpressionEvaluator.TargetObjectToExpression (Mono.Debugging.Evaluation.EvaluationContext ctx, System.Object obj) [0x00000] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/src/core/Mono.Debugging/Mono.Debugging.Evaluation/ExpressionEvaluator.cs:83 
  at Mono.Debugging.Evaluation.ObjectValueAdaptor.CreateObjectValueImpl (Mono.Debugging.Evaluation.EvaluationContext ctx, IObjectValueSource source, ObjectPath path, System.Object obj, ObjectValueFlags flags) [0x000f5] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/src/core/Mono.Debugging/Mono.Debugging.Evaluation/ObjectValueAdaptor.cs:385 
  at Mono.Debugging.Evaluation.ObjectValueAdaptor.CreateObjectValue (Mono.Debugging.Evaluation.EvaluationContext ctx, IObjectValueSource source, ObjectPath path, System.Object obj, ObjectValueFlags flags) [0x00000] in /Users/builder/data/lanes/monodevelop-lion-monodevelop-3.0.4-branch/ea010826/source/monodevelop/main/src/core/Mono.Debugging/Mono.Debugging.Evaluation/ObjectValueAdaptor.cs:93 

设备上的本机堆栈跟踪:

0   MyAppProject                        0x01b39e85 mono_handle_native_sigsegv + 244
1   MyAppProject                        0x01afe3cf mono_sigsegv_signal_handler + 130
2   libsystem_c.dylib                   0x3aaa8e93 _sigtramp + 42
3   MyAppProject                        0x01b92a9d mono_domain_get + 20
4   MyAppProject                        0x01b5d53b mono_runtime_invoke + 90
5   MyAppProject                        0x01bbd8c0 monotouch_exception_handler + 72
6   CoreFoundation                      0x36cee57f <redacted> + 614
7   libobjc.A.dylib                     0x34ffea65 <redacted> + 128
8   libc++abi.dylib                     0x33e4807b <redacted> + 78
9   libc++abi.dylib                     0x33e48114 <redacted> + 19
10  libc++abi.dylib                     0x33e49513 __cxa_throw + 122
11  libobjc.A.dylib                     0x34ffe9bf objc_exception_throw + 94
12  CoreFoundation                      0x36cee15d <redacted> + 0
13  Foundation                          0x3477030b <redacted> + 86
14  UIKit                               0x3834a925 <redacted> + 1844
15  UIKit                               0x38349a7b <redacted> + 634
16  CoreFoundation                      0x36ceb62f <redacted> + 714
17  UIKit                               0x383497f5 <redacted> + 136
18  UIKit                               0x384275e5 <redacted> + 60
19  UIKit                               0x383b5cd7 <redacted> + 206
20  UIKit                               0x383b5b6d <redacted> + 264
21  libdispatch.dylib                   0x359e29f7 <redacted> + 30
22  UIKit                               0x383b5a61 <redacted> + 92
23  UIKit                               0x383bf0d5 <redacted> + 32
24  libdispatch.dylib                   0x359e43f7 <redacted> + 42
25  UIKit                               0x383bf0b1 <redacted> + 88
26  libdispatch.dylib                   0x359df11f <redacted> + 10
27  libdispatch.dylib                   0x359e2ecf <redacted> + 142
28  libdispatch.dylib                   0x359e2dc1 <redacted> + 40
29  libdispatch.dylib                   0x359e391d <redacted> + 184
30  libdispatch.dylib                   0x359e3ac1 <redacted> + 84
31  libsystem_c.dylib                   0x3aa76a11 <redacted> + 360
32  libsystem_c.dylib                   0x3aa768a4 start_wqthread + 8

感谢任何帮助。 谢谢。

更新:

不幸的是,这里似乎不止一个错误。

在我的情况下,Mail Composer 的崩溃不是由外观或 属性字符串。我测试了所有可能的连接,但我的代码崩溃了。

所以我开始逐行注释我的所有代码,并且成功了:

这是应用内购买代码。

我正在使用 xamarin 网站上 In App Purchase 示例中的代码。

如果我使用 SKProductRequest 类仅评论这一行:

productsRequest.Start();

MFMailComposer 打开并且运行良好!

所以我在原始 Xamarin 示例项目上测试了 MFMailComposer:

http://docs.xamarin.com/ios/tutorials/In-App_Purchasing http://docs.xamarin.com/@api/deki/files/3300/=InAppPurchaseSample.zip

我刚刚将这段代码添加到 NonConsumableViewController 类中:

/// <summary>
        /// TEST MAIL COMPOSER BUG - START
        /// </summary>

        MFMailComposeViewController _mail;

        void HandleFinished (object sender, MFComposeResultEventArgs e)
        

        

        public void TestMailComposer ()
        
            var button = UIButton.FromType(UIButtonType.RoundedRect);
            button.Frame = new RectangleF(20f, 0f, 280f, 40f);
            button.TouchUpInside += (object sender, EventArgs e) => 
                if (MFMailComposeViewController.CanSendMail) 
                    _mail = new MFMailComposeViewController ();
                    _mail.SetSubject ("The Subject");
                    _mail.SetToRecipients (new [] "the@recipient.com");
                    _mail.SetMessageBody ("Some text to e-mail stuff too" +
"\n", false);
                    _mail.Finished += HandleFinished;

                    this.PresentViewController(_mail, true, null);

                 else 
                    //handle not being able to send mail
                    UIAlertView alert = new UIAlertView ("Mail Alert", "Error:
Check your eMail configuration", null, "OK", null);
                    alert.Show ();
                
            ;
            button.SetTitle("Button", UIControlState.Normal);
            View.AddSubview(button);
        

        ///
        /// TEST MAIL COMPOSER BUG - END
        ///

当我按下按钮时它会挂起。

更新:

我尝试了 6.0.2 修补程序(抱歉等待,但我不得不将我的代码恢复到原始状态)。外观错误现已消失。

SKProductRequest 类的问题似乎是另一回事,而且不那么紧迫。它没有挂起,它只是将 MF Mail 作曲家的打开延迟了一段时间。但这似乎是一个无关的错误。

这是错误参考: https://bugzilla.xamarin.com/show_bug.cgi?id=7443

【问题讨论】:

你能显示完整的堆栈跟踪吗? 我认为这可能与将null 回调传递给PresentViewController 有关。你能把delegate (基本上是一个空函数)放在那里,看看它是否修复它? 尝试了使用空委托的建议,但没有帮助。 我认为您应该在 bugzilla.xamarin.com 上向 Xamarin 提交一个包含完整示例的错误以进行调查。 bugzilla.xamarin.com/show_bug.cgi?id=7443 【参考方案1】:

这可能会有所帮助(来自 Xamarin 错误)

cancelAttributes = new UITextAttributes();
//cancelAttributes.TextShadowOffset = new UIOffset(0, -1);
cancelAttributes.TextShadowColor = UIColor.White.ColorWithAlpha(0.5f);
cancelAttributes.TextColor = Resources.CancelButtonDisabled;

UIBarButtonItem.AppearanceWhenContainedIn(typeof(UISearchBar)).SetTitleTextAttributes(cancelAttributes, UIControlState.Disabled);

如果我的代码中有注释位,我会遇到问题,但如果它被注释掉则不会。你在使用 UIAppearance 的东西吗?

【讨论】:

这是固定的,将成为 MonoTouch 6.0.2 的一部分。错误报告中有一个热修复程序可供使用 6.0.1 的用户使用。 不幸的是,这并不能解决我的问题。我不使用任何外观或文本属性。还有另一个错误使我的 MFComposer 崩溃,我隔离了如果被注释掉的代码行会停止它。如果我使用 SKProductRequest 类仅评论这一行: productsRequest.Start(); MFComposer 工作正常,不会崩溃。 我尝试了修补程序(抱歉等待,但我不得不将我的代码恢复到原始状态)。外观错误消失了,谢谢。 SKProductRequest 类的问题似乎不同,而且不那么紧迫。它没有挂起,它只是将 MF Mail 作曲家的打开延迟了一段时间。但这似乎是一个无关的错误。

以上是关于使用 MFMailComposeViewController 时 Monotouch iOS 6 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份