MonoTouch,NSLog和TestFlightSdk

时间:2012-02-09 01:15:32

标签: xamarin.ios nslog testflight

我正在尝试将TestFlightSdk集成到我使用MonoTouch制作的应用中。

我正试图在我的应用程序中实现日志记录,以便它被TestFlightSdk选中。它应该自动获取NSLog ged文本,但我似乎无法找到正确的代码组合添加到我自己的应用程序,用C#/ MonoTouch编写,也是如此。

我尝试了什么:

  1. Console.WriteLine("...");
  2. Debug.WriteLine("...");(但我认为这只是调用Console.WriteLine
  3. 实施对NSlog的支持,但这使我的应用程序崩溃,显然我做错了(我会问一个新问题,如果这是前进的方法。)
  4. MonoTouch中是否有内容可以通过NSLog写入日志消息,以便我可以将它与TestFlightSdk一起使用?或者我是否必须为NSLog滚动自己的包装器?

    为了自己实现NSLog,我添加了这个:

    public static class Logger
    {
        [DllImport("/System/Library/Frameworks/Foundation.framework/Foundation")]
        private extern static void NSLog(string format, string arg1);
    
        public static void Log(string message)
        {
            NSLog("%s", message);
        }
    }
    

    (我从其他SO问题得到了上面的代码:How to I bind to the iOS Foundations function NSLog。)

    但是这会导致我的应用程序出现SIGSEGV故障。

3 个答案:

答案 0 :(得分:8)

using System;
using System.Runtime.InteropServices;
using Foundation;

public class Logger
{
    [DllImport(ObjCRuntime.Constants.FoundationLibrary)]
    private extern static void NSLog(IntPtr message);

    public static void Log(string msg, params object[] args)
    {
        using (var nss = new NSString (string.Format (msg, args))) {
            NSLog(nss.Handle);
        }
    }
}

答案 1 :(得分:2)

Anuj指出了方向,这就是我最终的结果:

[DllImport(MonoTouch.Constants.FoundationLibrary)]
private extern static void NSLog(IntPtr format, IntPtr arg1);

并称之为:

using (var format = new NSString("%@"))
using (var arg1 = new NSString(message))
    NSLog(format.Handle, arg1.Handle);

当我尝试单个参数时,如果我在字符串中有百分比字符,则会将其解释为尝试格式化字符串,但由于没有参数,因此崩溃了。

答案 2 :(得分:0)

Console.WriteLine()在当前的xamarin.ios版本上按预期工作(重定向到NSLog)。甚至在发布版本(由hockeyapp等使用)上。无需再使用DllImport