我正在尝试将TestFlightSdk集成到我使用MonoTouch制作的应用中。
我正试图在我的应用程序中实现日志记录,以便它被TestFlightSdk选中。它应该自动获取NSLog
ged文本,但我似乎无法找到正确的代码组合添加到我自己的应用程序,用C#/ MonoTouch编写,也是如此。
我尝试了什么:
Console.WriteLine("...");
Debug.WriteLine("...");
(但我认为这只是调用Console.WriteLine
)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故障。
答案 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)
[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
。