Версия приложения для iOS работает только на симуляторе iPhone XS Max 12.1.

Я использую Visual Studio для Mac.

Когда я создаю и запускаю свое приложение на симуляторе iPhone, оно работает только на симуляторе iPhone XS Max.

Любое другое смоделированное устройство (от XS Max до iPhone 6) будет отображать заставку, но затем выдаст

Foundation.MonoTouchexception...NSInternalInconsistencyException Reason: Application windows are expected to have a root view controller at the end of the application launch

Единственное физическое устройство, с которым мне приходится тестировать, — это iPhone 6S Plus, но оно также выдает такое же исключение.

Я пробовал чистить и восстанавливать, удаляя папки bin и obj.

Я проверил журнал устройства, но пока не нашел ничего, что привело бы меня к решению (если вам нужны журналы, я могу предоставить).

Любые идеи о том, что может вызвать эту специфическую проблему или на что обратить внимание в журналах устройства, что может помочь найти решение?


person Stemado    schedule 11.02.2019    source источник
comment
Похоже, что начиная с iOS 9.1 любой экземпляр UIWindow, созданный во время применения (_:didFinishLaunchingWithOptions:), должен иметь установленный rootViewController перед выходом из этого метода. Итак, можете ли вы поделиться кодом Appdelegate.cs?   -  person Lucas Zhang    schedule 12.02.2019


Ответы (1)


Эта проблема была вызвана моим tokenExpiration на моей странице App.xaml.

В какой-то момент, когда я тестировал свое приложение на iPhone XS Max 12.1, строка была сохранена где-то еще, поэтому при инициализации приложения эта строка не была пустой, поэтому var tokenDate = Convert.ToDateTime(tokenExpiration); не выдавал ошибку.

Тогда мой оператор if может быть успешно выполнен, и мое приложение будет иметь базовое корневое представление.

Однако для нового симулятора, который я раньше не использовал и не устанавливал строку tokenExpiration раньше, когда вы хотите получить этот tokenExpiration, он вернет пустую строку в качестве настройки по умолчанию.

Тогда var tokenDate = Convert.ToDateTime(tokenExpiration); выдаст ошибку, поскольку не может преобразовать пустую строку.

Наконец, мой код перейдет к моему оператору catch, что означает, что мое приложение теряет базовое корневое представление, и именно это вызывает мою проблему.

Предыдущий код:

    try
    {
        TaskScheduler.UnobservedTaskException += (sender, e) => {
            Console.WriteLine(e.Exception.ToString(), Category.Exception, Priority.High);
        };



        await NavigationService.NavigateAsync("/LoginPage");

    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString(), Category.Exception, Priority.High);
    }

Обновлен код:

    var tokenExpiration = Preferences.Get("facebookTokenExpiration", string.Empty);
    if (tokenExpiration != null && tokenExpiration.Length > 0)
    {
        var tokenDate = Convert.ToDateTime(tokenExpiration);
        var tokenStatus = DateTime.Now.CompareTo(tokenDate);
        //Token is still active
        if (tokenExpiration != string.Empty & tokenStatus < 0)
        {

            await NavigationService.NavigateAsync("/MainTabbedPage?selectedTab=PuppyDetailsPage");

        }
        else
        {
            await NavigationService.NavigateAsync("/Login");
        }
    }
    else
    {
        await NavigationService.NavigateAsync("/MainTabbedPage?selectedTab=PuppyDetailsPage");
    }

Изменить: спасибо @LandLu a forums.xamarin.com за помощь в решении этой проблемы.

person Stemado    schedule 14.02.2019