Компонент Xamarin iOS для входа в Google: сбой приложения из-за ошибки. uiDelegate должен быть либо |UIViewController| или реализовать

Я пытаюсь реализовать вход Google с помощью этого компонента для xamarin.ios: Вход Google для iOS< /а>

Он отлично работает на эмуляторе, но когда дело доходит до реального устройства, он падает, когда я нажимаю кнопку входа. (iOS 10.2 - эмулятор также использует ту же ОС) У меня есть пользовательская кнопка, которая вызывает метод SignInUser в SignIn.SharedInstance

Сбой с ошибкой ниже (только когда приложение развернуто на устройстве)

Вызвано исключение Objective-C. Имя: NSInvalidArgumentException Причина: uiDelegate должен быть либо |UIViewController| или реализовать |signIn:presentViewController:| и |signIn:dismissViewController:| методы из |GIDSignInUIDelegate|.

Я вызываю функцию ниже, чтобы инициализировать GoogleSignIn в методе FinishedLaunching AppDelegate.cs.

public void Configure()
    {
        NSError configureError;
        Context.SharedInstance.Configure(out configureError);

        if (configureError != null)
        {
            // If something went wrong, assign the clientID manually
            Console.WriteLine("Error configuring the Google context: {0}", configureError);
            SignIn.SharedInstance.ClientID = googleClientId;
        }

        SignIn.SharedInstance.Delegate = this;
        SignIn.SharedInstance.UIDelegate = new GoogleSignInUIDelegate();
    }

Вот моя реализация ISignInUIDelegate():

class GoogleSignInUIDelegate :  SignInUIDelegate
{
    public override void WillDispatch(SignIn signIn, NSError error)
    {
    }
    public override void PresentViewController(SignIn signIn, UIViewController viewController)
    {
        UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(viewController, true, null);

    }

    public override void DismissViewController(SignIn signIn, UIViewController viewController)
    {
        UIApplication.SharedApplication.KeyWindow.RootViewController.DismissViewController(true, null);
    }
}

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


person Sanjog Sharma    schedule 02.02.2017    source источник


Ответы (2)


После некоторой отладки я нашел, где была реальная проблема. Каким-то образом UIDelegate, который я назначил во время инициализации, был потерян, когда я вызывал свой метод входа в систему. Поэтому я переместил строку ниже с шага инициализации на вход в систему.

SignIn.SharedInstance.UIDelegate = new GoogleSignInUIDelegate();

Вот как сейчас выглядит мой метод входа:

    public void Login()
    {
        SignIn.SharedInstance.UIDelegate = new GoogleSignInUIDelegate(); //moved this here from Configure
        SignIn.SharedInstance.SignInUser();
    }

Это решило проблему для меня, но я до сих пор не уверен, почему это проблема только на устройстве, а не в эмуляторе. Любые идеи?

person Sanjog Sharma    schedule 02.02.2017

Добавьте PreserveAttribute в класс GoogleSignInUIDelegate, чтобы компоновщик не удалял методы, которые нельзя определить с помощью статического анализа.

Добавьте в проект следующий класс:

public sealed class PreserveAttribute : System.Attribute {
    public bool AllMembers;
    public bool Conditional;
}

Примените атрибут класса:

[Preserve (AllMembers = true)] 
class GoogleSignInUIDelegate :  SignInUIDelegate
{
  ~~~~
}

Re: https://developer.xamarin.com/guides/ios/advanced_topics/linker/

person SushiHangover    schedule 02.02.2017
comment
Большое спасибо, я попробовал это, но это не решило проблему. Я обнаружил, что поведение компоновщика настроено на Связывать только сборки SDK, поэтому, возможно, это не удаляло методы из моей сборки, однако я вставил это, чтобы убедиться, что он не будет удален линкер в будущем. Я обнаружил, что моя проблема отличается, я опубликую ответ ниже. - person Sanjog Sharma; 02.02.2017
comment
@SanjogSharma Рад, что вы его нашли ... Если вы включите Link All, чтобы минимизировать окончательный размер .ipa, вам, скорее всего, потребуется использовать PreserveAttribute ... Теперь интересно, в чем на самом деле была ваша проблема ... - person SushiHangover; 02.02.2017
comment
я отправил ответ сейчас - person Sanjog Sharma; 02.02.2017