繁体   English   中英

Xamarin iOS:启动计时器无一例外使应用程序崩溃

[英]Xamarin iOS: Starting timer crashes app with no exception

我正在开发Xamarin Forms应用程序,需要为其编写一些本机代码,我的代码可以在Android上运行,但无法在iOS上运行。 在Main.cs中,我使用NSTimer启动了计划的计时器,完成后应启动Xamarin App的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"));

我希望有人可以帮助我。 提前致谢。

原因:

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);

            }

        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM