Přihlaste se pomocí Apple v Xamarin. iOS

Ukázka stažení Stažení ukázky

Přihlaste se pomocí Apple je nová služba, která poskytuje ochranu identit pro uživatele služeb ověřování třetích stran. Od verze iOS 13, Apple vyžaduje, aby jakákoli nová aplikace s použitím ověřovacích služeb třetích stran také poskytovala přihlášení pomocí Apple. Existující aplikace, které se aktualizují, nemusejí do dubna 2020 přidávat přihlašovat se od společnosti Apple.

Tento dokument popisuje, jak můžete přidat přihlašování pomocí Apple do aplikací pro iOS 13.

Instalace pro vývojáře Apple

Než začnete sestavovat a spouštět aplikaci pomocí přihlášení Apple, musíte provést tento postup. V certifikátech pro vývojáře Apple, profily profilů na portálu:

  1. Vytvořte nový identifikátor ID aplikací .
  2. V poli Popis nastavte popis.
  3. Vyberte explicitní ID sady prostředků a nastavte ho v poli.
  4. Povolte možnost Přihlásit se pomocí funkce Apple a zaregistrujte novou identitu.
  5. Vytvořte nový zřizovací profil s novou identitou.
  6. Stáhněte ho a nainstalujte na svém zařízení.
  7. v Visual Studio povolte přihlášení pomocí funkce Apple v souboru nároks. plist .

Zaškrtnout stav přihlášení

Když vaše aplikace začne nebo když nejdřív potřebujete ověřit stav ověřování uživatele, vytvořte instanci ASAuthorizationAppleIdProvider a a ověřte aktuální stav:

var appleIdProvider = new ASAuthorizationAppleIdProvider ();
appleIdProvider.GetCredentialState (KeychainItem.CurrentUserIdentifier, (credentialState, error) => {
    switch (credentialState) {
    case ASAuthorizationAppleIdProviderCredentialState.Authorized:
        // The Apple ID credential is valid.
        break;
    case ASAuthorizationAppleIdProviderCredentialState.Revoked:
        // The Apple ID credential is revoked.
        break;
    case ASAuthorizationAppleIdProviderCredentialState.NotFound:
        // No credential was found, so show the sign-in UI.
        InvokeOnMainThread (() => {
            var storyboard = UIStoryboard.FromName ("Main", null);

            if (!(storyboard.InstantiateViewController (nameof (LoginViewController)) is LoginViewController viewController))
                return;

            viewController.ModalPresentationStyle = UIModalPresentationStyle.FormSheet;
            viewController.ModalInPresentation = true;
            Window?.RootViewController?.PresentViewController (viewController, true, null);
        });
        break;
    }
});

V tomto kódu, který se volá během FinishedLaunching v AppDelegate.cs , aplikace zpracuje, když je stav NotFound a prezentuje LoginViewController uživateli. Pokud byl stav vrácen Authorized nebo Revoked , může uživatel předložit jinou akci.

LoginViewController pro přihlášení pomocí Apple

Rozhraní UIViewController , které implementuje logiku přihlášení a nabízí přihlášení pomocí Apple potřebuje implementovat IASAuthorizationControllerDelegate a IASAuthorizationControllerPresentationContextProviding jako v LoginViewController následujícím příkladu.

public partial class LoginViewController : UIViewController, IASAuthorizationControllerDelegate, IASAuthorizationControllerPresentationContextProviding {
    public LoginViewController (IntPtr handle) : base (handle)
    {
    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();
        // Perform any additional setup after loading the view, typically from a nib.

        SetupProviderLoginView ();
    }

    public override void ViewDidAppear (bool animated)
    {
        base.ViewDidAppear (animated);

        PerformExistingAccountSetupFlows ();
    }

    void SetupProviderLoginView ()
    {
        var authorizationButton = new ASAuthorizationAppleIdButton (ASAuthorizationAppleIdButtonType.Default, ASAuthorizationAppleIdButtonStyle.White);
        authorizationButton.TouchUpInside += HandleAuthorizationAppleIDButtonPress;
        loginProviderStackView.AddArrangedSubview (authorizationButton);
    }

    // Prompts the user if an existing iCloud Keychain credential or Apple ID credential is found.
    void PerformExistingAccountSetupFlows ()
    {
        // Prepare requests for both Apple ID and password providers.
        ASAuthorizationRequest [] requests = {
            new ASAuthorizationAppleIdProvider ().CreateRequest (),
            new ASAuthorizationPasswordProvider ().CreateRequest ()
        };

        // Create an authorization controller with the given requests.
        var authorizationController = new ASAuthorizationController (requests);
        authorizationController.Delegate = this;
        authorizationController.PresentationContextProvider = this;
        authorizationController.PerformRequests ();
    }

    private void HandleAuthorizationAppleIDButtonPress (object sender, EventArgs e)
    {
        var appleIdProvider = new ASAuthorizationAppleIdProvider ();
        var request = appleIdProvider.CreateRequest ();
        request.RequestedScopes = new [] { ASAuthorizationScope.Email, ASAuthorizationScope.FullName };

        var authorizationController = new ASAuthorizationController (new [] { request });
        authorizationController.Delegate = this;
        authorizationController.PresentationContextProvider = this;
        authorizationController.PerformRequests ();
    }
}

Animace ukázkové aplikace pomocí přihlášení pomocí Apple

Tento ukázkový kód kontroluje aktuální stav přihlášení v nástroji PerformExistingAccountSetupFlows a připojuje se k aktuálnímu zobrazení jako delegát. Pokud se najde existující přihlašovací údaje pro řetězec klíčů iCloud nebo Apple ID, zobrazí se uživateli výzva k jeho použití.

Apple poskytuje ASAuthorizationAppleIdButton tlačítko pro tento účel zvlášť. Když se dokončí, tlačítko aktivuje pracovní postup zpracovávaný v metodě HandleAuthorizationAppleIDButtonPress .

Ověřování při zpracování

V rámci IASAuthorizationController implementace libovolné vlastní logiky pro uložení účtu uživatele. Následující příklad ukládá účet uživatele v řetězci klíčů a službě úložiště společnosti Apple.

#region IASAuthorizationController Delegate

[Export ("authorizationController:didCompleteWithAuthorization:")]
public void DidComplete (ASAuthorizationController controller, ASAuthorization authorization)
{
    if (authorization.GetCredential<ASAuthorizationAppleIdCredential> () is ASAuthorizationAppleIdCredential appleIdCredential) {
        var userIdentifier = appleIdCredential.User;
        var fullName = appleIdCredential.FullName;
        var email = appleIdCredential.Email;

        // Create an account in your system.
        // For the purpose of this demo app, store the userIdentifier in the keychain.
        try {
            new KeychainItem ("com.example.apple-samplecode.juice", "userIdentifier").SaveItem (userIdentifier);
        } catch (Exception) {
            Console.WriteLine ("Unable to save userIdentifier to keychain.");
        }

        // For the purpose of this demo app, show the Apple ID credential information in the ResultViewController.
        if (!(PresentingViewController is ResultViewController viewController))
            return;

        InvokeOnMainThread (() => {
            viewController.UserIdentifierText = userIdentifier;
            viewController.GivenNameText = fullName?.GivenName ?? "";
            viewController.FamilyNameText = fullName?.FamilyName ?? "";
            viewController.EmailText = email ?? "";

            DismissViewController (true, null);
        });
    } else if (authorization.GetCredential<ASPasswordCredential> () is ASPasswordCredential passwordCredential) {
        // Sign in using an existing iCloud Keychain credential.
        var username = passwordCredential.User;
        var password = passwordCredential.Password;

        // For the purpose of this demo app, show the password credential as an alert.
        InvokeOnMainThread (() => {
            var message = $"The app has received your selected credential from the keychain. \n\n Username: {username}\n Password: {password}";
            var alertController = UIAlertController.Create ("Keychain Credential Received", message, UIAlertControllerStyle.Alert);
            alertController.AddAction (UIAlertAction.Create ("Dismiss", UIAlertActionStyle.Cancel, null));

            PresentViewController (alertController, true, null);
        });
    }
}

[Export ("authorizationController:didCompleteWithError:")]
public void DidComplete (ASAuthorizationController controller, NSError error)
{
    Console.WriteLine (error);
}

#endregion

Autorizační kontrolér

Poslední část této implementace je ASAuthorizationController ta, která spravuje žádosti o autorizaci pro poskytovatele.

#region IASAuthorizationControllerPresentation Context Providing

public UIWindow GetPresentationAnchor (ASAuthorizationController controller) => View.Window;

#endregion