6

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

我正在尝试以 TestFlightSdk 拾取它的方式在我的应用程序中实现日志记录。据说它NSLog会自动获取 ged 文本,但我似乎找不到正确的代码组合来添加到我自己的应用程序中,用 C#/MonoTouch 编写,同样的。

我试过的:

  1. Console.WriteLine("...");
  2. Debug.WriteLine("...");(但我认为这只是调用Console.WriteLine
  3. 实现对 的支持NSlog,但这使我的应用程序崩溃,所以显然我做错了什么(如果这是前进的方式,我会问一个新问题。)

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 故障而崩溃。

4

3 回答 3

9
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);
        }
    }
}
于 2012-02-09T07:11:20.267 回答
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);

当我只尝试单个参数时,如果字符串中有百分比字符,它被解释为尝试格式化字符串,但由于没有参数,它崩溃了。

于 2012-02-09T11:53:06.687 回答
0

Console.WriteLine()NSLog在当前 xamarin.ios 版本上按预期工作(它重定向到)。即使在发布版本上(由 hockeyapp 等使用)。不再需要使用DllImport了。

于 2017-08-03T10:10:39.570 回答