首页 文章

MonoTouch和MonoDroid中的崩溃报告

提问于
浏览
3

我正在使用Mvvmcross,Mono for Android和MonoTouch编写跨平台应用程序 . 在我正在移植的Java Android应用程序中,我使用ACRA提供崩溃报告和临时报告 . 这些报告通过HTTP Post发送到我们的服务器 .

是否有Mvvmcross的崩溃报告插件? Mono *社区可以推荐任何崩溃报告库吗?

如果似乎没有任何东西,其他开发者如何处理这个?他们如何捕获未处理的应用程序异常和Android ANR,以便可以触发报告?

3 回答

  • 1

    我在这个领域唯一的经验是使用Flurry - 我们只将其用于分析,而不是用于崩溃报告 .

    基本上我们所做的是使用IAnalytics接口从ViewModel记录所有重要事件,然后每个平台提供IAnalytics的实现,如:

    WP7:

    public class FlurryAnalytics : IAnalytics
    {
        public const string ApiKeyValue = "--- your key ---";
    
        public void StartSession()
        {
            FlurryWP7SDK.Api.StartSession(ApiKeyValue);
        }
    
        public void LogEvent(string eventName)
        {
            FlurryWP7SDK.Api.LogEvent(eventName);
        }
    }
    

    触摸(与https://github.com/kevinmcmahon/monotouch-libs/blob/master/FlurryAnalytics/flurry.cs等绑定一起使用):

    public class FlurryAnalytics : IAnalytics
    {
        public const string ApiKeyValue = "37SHD8L8VATPBS88AMHU";
    
        public void StartSession()
        {
            FlurryAPI.StartSession (ApiKeyValue);
        }
    
        public void LogEvent(string eventName)
        {
            FlurryAPI.LogEvent(eventName);
        }
    }
    

    Android(稍微复杂一点 - 它需要一个活动的每个开始/停止的钩子):

    public class FlurryAnalytics : IAnalytics, IAndroidActivityTracker
    {
        public const string ApiKeyValue = "--- your key ---";
    
        private readonly IntPtr _flurryClass;
        private readonly IntPtr _flurryOnStartSession;
        private readonly IntPtr _flurryOnEndSession;
        private readonly IntPtr _flurryLogEvent;
    
        public FlurryAnalytics()
        {
            _flurryClass = JNIEnv.FindClass("com/flurry/android/FlurryAgent");
            _flurryOnStartSession = JNIEnv.GetStaticMethodID(_flurryClass, "onStartSession",
                                                             "(Landroid/content/Context;Ljava/lang/String;)V");
            _flurryOnEndSession = JNIEnv.GetStaticMethodID(_flurryClass, "onEndSession", "(Landroid/content/Context;)V");
            _flurryLogEvent = JNIEnv.GetStaticMethodID(_flurryClass, "logEvent", "(Ljava/lang/String;)V");
        }
    
        public void StartSession()
        {
            // not used in Android - Android relies on Activity tracking instead
        }
    
        public void LogEvent(string eventName)
        {
            ExceptionSafe(() => JNIEnv.CallStaticVoidMethod(_flurryClass, _flurryLogEvent, new JValue(new Java.Lang.String(eventName))));
        }
    
        private static void ExceptionSafe(Action action)
        {
            try
            {
                action();
            }
            catch (ThreadAbortException)
            {
                throw;
            }
            catch (Exception exception)
            {
                UITrace.Trace("Exception seen in calling Flurry through JNI " + exception.ToLongString());
            }
        }
    
        public void OnStartActivity(Activity activity)
        {
            ExceptionSafe(() => JNIEnv.CallStaticVoidMethod(_flurryClass, _flurryOnStartSession, new JValue(activity), new JValue(new Java.Lang.String(ApiKeyValue))));
        }
    
        public void OnStopActivity(Activity activity)
        {
            ExceptionSafe(() => JNIEnv.CallStaticVoidMethod(_flurryClass, _flurryOnEndSession, new JValue(activity)));
        }
    }
    

    从Flurry文档和一些博客中,我相信这可以扩展到包括崩溃报告:

    但是,如果不尝试它,我不知道它在MonoDroid和MonoTouch中的效果如何 .

  • 0

    之前我在MonoDroid应用程序上工作并构建了Crasher作为ACRA的端口 . 但由于Mono的某些功能,特别是.NET,ACRA的某些功能无法在MonoDroid中实现 . 如果能帮助你,我会很高兴的 .

  • 1

    我们正在使用HockeyApp iOS SDK(我相信他们也有一款适用于Android) .
    我们也雇用了this fix因为在MonoTouch工作的记者遇到祸害是至关重要的 .

相关问题