2012-04-28 54 views
3

我正在写使用Mvvmcross,单声道Android和MonoTouch的一个跨平台的应用程序。在Java Android应用程序中,我正在移植我使用ACRA来提供崩溃报告和临时报告。这些报告通过HTTP Post发送到我们的服务器。崩溃报告中的MonoTouch和MonoDroid的

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

如果有似乎没有任何东西,怎么其他开发商处理呢?他们如何捕获未处理的应用程序异常和Android ANR以便报告可以被解雇?

回答

1

唯一的经验,我已经在这个领域是乱舞 - 我们只使用提供的分析,而不是崩溃报告。

基本上我们所做的是使用IAnalytics界面登录从视图模型的所有重要事件,然后每个平台提供像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))); 
    } 
} 

从乱舞的文档和一些博客在那里,我相信这可以扩展到包括崩溃报告:

但没有尝试它,我不知道它会在MonoDroid中运行得如何d MonoTouch。

+0

略长解释更新(少回答驱动)上http://slodge.blogspot.co.uk/2012/04/using-flurry-analytics-from-monotouch.html – Stuart 2012-04-29 12:44:52

+0

由于斯图尔特,这真的很有趣。但是我想我真正应该在Mono *中使用的事件或扩展点来捕获未处理的异常和Android ANR。谢谢。 – 2012-04-29 15:18:01

1

此前我曾在MonoDroid的应用,并内置Crasher作为ACRA的端口。但由于Mono的某些功能,特别是.NET的一些功能,ACRA的某些功能无法在MonoDroid中实现。会很高兴,如果它会帮助你。

+0

谢谢你,我一定会检查出来。尽管如此,我希望有一个跨平台的解决方案。 – 2013-01-13 12:48:08

0

我们使用HockeyApp的iOS SDK(我相信他们有一个用于Android系统也是如此)。
我们还雇佣了this fix,因为这对于在MonoTouch中工作的记者非常重要。