Xamarin iOS: запуск таймера завершает работу приложения без исключения - PullRequest
0 голосов
/ 31 октября 2018

Я занимаюсь разработкой приложения Xamarin Forms, для которого мне нужно было написать собственный код, я получил код, работающий в Android, но не могу заставить его работать для iOS. В Main.cs я запускаю запланированный таймер с помощью NSTimer, который после завершения должен запустить код AppDelegate для приложения Xamarin.

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, но приложение вылетало без достижения ловушки, я также пытался использовать Task.Delay(), но это то же самое. Даже если я установлю количество времени на 1, ничего не произойдет.

EDIT:

Я также пытался использовать DispatchQueue (с тем же результатом):

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

Я надеюсь, что кто-то может помочь мне с этим. Заранее спасибо.

1 Ответ

0 голосов
/ 01 ноября 2018

Причина:

Для запуска приложения используется метод Main.

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

Я думаю, что ваша проблема вызвана тем, что вы даже не запускали приложение, когда пытались выполнить какие-то операции в этом приложении.

Решение:

Добавьте коды задержки в том месте, где вы хотите задержать метод Main;

Вы можете добавить к FinishedLaunching в iOS. 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);

            }

        }
...