【问题标题】:Xamarin iOS: Starting timer crashes app with no exceptionXamarin iOS:启动计时器使应用程序崩溃,无一例外
【发布时间】:2018-11-08 13:26:46
【问题描述】:

我正在开发一个 Xamarin Forms 应用程序,我需要为此编写一些本机代码,我得到的代码在 Android 中工作,但我无法让它在 iOS 上工作。在 Main.cs 中,我使用 NSTimer 启动了一个计划的计时器,完成后应该启动 Xamarin 应用程序的 AppDelegate 代码。

Main.cs:

public class Application
{
    private static ISettings AppSettings => CrossSettings.Current;
    private static double startTimeMillis;

    static void Main(string[] args)
    {
        startTimeMillis = DateTime.Now.Ticks / TimeSpan.TicksPerSecond;
        CheckSavedToken(args);
    }

    private static void CheckSavedToken(string[] args)
    {
        if (AppSettings.Contains(App.LoginToken))
        {
            string loginToken = AppSettings.GetValueOrDefault(App.LoginToken, string.Empty);
            if (loginToken == string.Empty)
            {
                AppSettings.Remove(App.LoginToken);
            }
        }
        double delay = 750 - (DateTime.Now.Ticks / TimeSpan.TicksPerSecond - startTimeMillis);
        if (delay > 0)
        {
            NSTimer.CreateScheduledTimer(delay, timer => UIApplication.Main(args, null, "AppDelegate"));
        }
        else
        {
            UIApplication.Main(args, null, "AppDelegate");
        }
    }
}

我想检查登录令牌并停留在此屏幕上,直到 750 毫秒过去后,AppDelegate 才能启动应用程序的 Xamarin Forms 部分。

我不知道自己做错了什么,我尝试使用 try catch 进行调试,但应用程序在没有达到 catch 的情况下崩溃,我也尝试使用 Task.Delay(),但效果相同。即使我将时间量设置为 1,仍然没有任何反应。

编辑:

我也尝试过使用 DispatchQueue(结果相同):

DispatchQueue.MainQueue.DispatchAfter(new DispatchTime(DispatchTime.Now, new TimeSpan(0, 0, 0, 0, (int)delay)), 
    () => UIApplication.Main(args, null, "AppDelegate"));

我希望有人可以帮助我解决这个问题。 提前致谢。

【问题讨论】:

  • 你为什么要延迟启动?
  • 我想让这个屏幕至少可见 750 毫秒,所以它不会只是一连串的闪烁

标签: c# ios xamarin.forms xamarin.ios nstimer


【解决方案1】:

原因:

Main 方法用于启动应用程序。

UIApplication.Main(args, null, "AppDelegate")

我认为您的问题是由于您尝试在此应用中执行某些操作时甚至没有启动应用造成的。因此,它毫无例外地崩溃了。

解决方案:

在Main方法后面要延迟的地方加上你的延迟代码;

您可以在 iOS 中添加到FinishedLaunching。 AppDelegate.cs:

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init();


            startTimeMillis = DateTime.Now.Ticks / TimeSpan.TicksPerSecond;

            double delay = 750 - (DateTime.Now.Ticks / TimeSpan.TicksPerSecond - startTimeMillis);
            if (delay > 0)
            {
                Task.Delay(5000).Wait();

                LoadApplication(new App());

                return base.FinishedLaunching(app, options);

            }
            else
            {
                LoadApplication(new App());
                return base.FinishedLaunching(app, options);

            }

        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    相关资源
    最近更新 更多