---
description: Capacitor plugin to sign in with Apple on Android, iOS, and Web. Supports authentication with identity tokens, authorization codes, and user profile retrieval.
title: Capacitor Apple Sign-In Plugin for Android, iOS & Web - Capawesome
image: https://capawesome.io/docs/assets/images/social/plugins/apple-sign-in.png
---

[ Skip to content](#capawesomecapacitor-apple-sign-in) 

[ 🎉 Introducing **Capawesome Platform** — one platform for Live Updates, Native Builds, App Store Publishing, and Insider SDKs.](https://capawesome.io) 

* [  Configuration ](#configuration)
* [  Usage ](#usage)
* [  API ](#api)
* [  Enums ](#enums)
* [  Security ](#security)
* [  FAQ ](#faq)
* [  Changelog ](#changelog)
* [  License ](#license)
* [  Asset Manager ](/docs/plugins/asset-manager/)
* [  Audio Player ](/docs/plugins/audio-player/)
* [  Audio Recorder ](/docs/plugins/audio-recorder/)
* [  Background Task ](/docs/plugins/background-task/)
* [  Badge ](/docs/plugins/badge/)
* [  Barometer ](/docs/plugins/barometer/)
* [  Biometrics ](/docs/plugins/biometrics/)
* [  Bluetooth Low Energy ](/docs/plugins/bluetooth-low-energy/)
* [  Cloudinary ](/docs/plugins/cloudinary/)
* [  Contacts ](/docs/plugins/contacts/)
* [  Datetime Picker ](/docs/plugins/datetime-picker/)
* [  File Compressor ](/docs/plugins/file-compressor/)
* [  File Opener ](/docs/plugins/file-opener/)
* [  File Picker ](/docs/plugins/file-picker/)
* [  Firebase ](/docs/plugins/firebase/)
* [  Formbricks ](/docs/plugins/formbricks/)
* [  Geocoder ](/docs/plugins/geocoder/)
* [  Google Sign-In ](/docs/plugins/google-sign-in/)
* [  libSQL ](/docs/plugins/libsql/)
* [  Live Update ](/docs/plugins/live-update/)
* [  Managed Configurations ](/docs/plugins/managed-configurations/)
* [  Media Session ](/docs/plugins/media-session/)
* [  ML Kit ](/docs/plugins/mlkit/)
* [  NFC ](/docs/plugins/nfc/)
* [  OAuth ](/docs/plugins/oauth/)
* [  Pedometer ](/docs/plugins/pedometer/)
* [  Photo Editor ](/docs/plugins/photo-editor/)
* [  PostHog ](/docs/plugins/posthog/)
* [  Printer ](/docs/plugins/printer/)
* [  Purchases ](/docs/plugins/purchases/)
* [  RealtimeKit ](/docs/plugins/realtimekit/)
* [  Screen Orientation ](/docs/plugins/screen-orientation/)
* [  Screenshot ](/docs/plugins/screenshot/)
* [  Secure Preferences ](/docs/plugins/secure-preferences/)
* [  Speech Recognition ](/docs/plugins/speech-recognition/)
* [  Speech Synthesis ](/docs/plugins/speech-synthesis/)
* [  Share Target ](/docs/plugins/share-target/)
* [  Square Mobile Payments ](/docs/plugins/square-mobile-payments/)
* [  SQLite ](/docs/plugins/sqlite/)
* [  Superwall ](/docs/plugins/superwall/)
* [  Torch ](/docs/plugins/torch/)
* [  Wifi ](/docs/plugins/wifi/)
* [  Zip ](/docs/plugins/zip/)
* [  Cloud ](/docs/cloud/)
* [  Live Updates ](/docs/cloud/live-updates/)
* Advanced
* Integrations
* [  Native Builds ](/docs/cloud/native-builds/)
* [  Configuration ](/docs/cloud/native-builds/configuration/)
* [  Environments ](/docs/cloud/native-builds/environments/)
* Guides
* [  Sample Projects ](/docs/cloud/native-builds/sample-projects/)
* [  Troubleshooting ](/docs/cloud/native-builds/troubleshooting/)
* [  Automations ](/docs/cloud/automations/)
* [  Assist ](/docs/cloud/assist/)
* Account
* Organizations
* [  Organization and User Management ](/docs/cloud/organizations/memberships/)
* [  Single Sign-On (SSO) ](/docs/cloud/organizations/sso/)
* [  Teams ](/docs/cloud/organizations/teams/)
* [  Two-Factor Authentication ](/docs/cloud/organizations/two-factor-authentication/)
* [  Integrations ](/docs/cloud/integrations/)
* [  License Keys ](/docs/cloud/license-keys/)
* [  Webhooks ](/docs/cloud/webhooks/)
* [  Pricing ](https://capawesome.io/pricing/)
* [  FAQ ](/docs/cloud/faq/)
* [  Support ](/docs/cloud/support/)
* [  Contributing ](/docs/contributing/)
* [  LLMs ](/docs/llms/)
* [  Insiders ](/docs/insiders/)
* [  License ](https://capawesome.io/legal/eula/)
* [  Support ](/docs/insiders/support/)
* [  FAQ ](/docs/insiders/faq/)
* [  Blog ](/blog/)
* Categories

* [  Configuration ](#configuration)
* [  Usage ](#usage)
* [  API ](#api)
* [  Enums ](#enums)
* [  Security ](#security)
* [  FAQ ](#faq)
* [  Changelog ](#changelog)
* [  License ](#license)

# @capawesome/capacitor-apple-sign-in[¶](#capawesomecapacitor-apple-sign-in "Permanent link")

Unofficial Capacitor plugin to sign-in with Apple.[1](#fn:1)

[ ![Deliver Live Updates to your Capacitor app with Capawesome Cloud](../../assets/external/cloud.capawesome.io/assets/banners/cloud-build-and-deploy-capacitor-apps.69628c3f.png) ](https://cloud.capawesome.io/) 

## Features[¶](#features "Permanent link")

We are proud to offer one of the most complete and feature-rich Capacitor plugins for Apple Sign-In. Here are some of the key features:

* 🖥️ **Cross-platform**: Supports Android, iOS, and Web.
* 🍎 **Native Sign-In**: Uses native AuthenticationServices on iOS.
* 🌐 **WebView OAuth**: Implements Apple OAuth flow on Android without external dependencies.
* 📧 **Scope support**: Request email and full name on all platforms.
* 🔐 **Nonce & state**: Supports nonce for replay protection and state for CSRF protection.
* 🪶 **Lightweight**: Just a single dependency and zero unnecessary bloat.
* 🤝 **Compatibility**: Compatible with the [Google Sign-In](https://capawesome.io/plugins/google-sign-in) and [OAuth](https://capawesome.io/plugins/oauth) plugins.
* 📦 **CocoaPods & SPM**: Supports CocoaPods and Swift Package Manager for iOS.
* 🔁 **Up-to-date**: Always supports the latest Capacitor version.

Missing a feature? Just [open an issue](https://github.com/capawesome-team/capacitor-plugins/issues) and we'll take a look!

## Newsletter[¶](#newsletter "Permanent link")

Stay up to date with the latest news and updates about the Capawesome, Capacitor, and Ionic ecosystem by subscribing to our [Capawesome Newsletter](https://cloud.capawesome.io/newsletter/).

## Compatibility[¶](#compatibility "Permanent link")

| Plugin Version | Capacitor Version | Status         |
| -------------- | ----------------- | -------------- |
| 0.1.x          | \>=8.x.x          | Active support |

## Guides[¶](#guides "Permanent link")

* [How to Sign In with Apple using Capacitor](https://capawesome.io/blog/how-to-sign-in-with-apple-using-capacitor/)

## Installation[¶](#installation "Permanent link")

You can use our **AI-Assisted Setup** to install the plugin. Add the [Capawesome Skills](https://github.com/capawesome-team/skills) to your AI tool using the following command:

`[](#%5F%5Fcodelineno-0-1)npx skills add capawesome-team/skills --skill capacitor-plugins
`

Then use the following prompt:

`` [](#%5F%5Fcodelineno-1-1) Use the `capacitor-plugins` skill from `capawesome-team/skills` to install the `@capawesome/capacitor-apple-sign-in` plugin in my project.
 ``

If you prefer **Manual Setup**, install the plugin by running the following commands and follow the platform-specific instructions below:

`[](#%5F%5Fcodelineno-2-1)npm install @capawesome/capacitor-apple-sign-in
[](#%5F%5Fcodelineno-2-2)npx cap sync
`

### iOS[¶](#ios "Permanent link")

Add the **Sign in with Apple** capability to your app in Xcode:

1. Open your app target in Xcode.
2. Go to the **Signing & Capabilities** tab.
3. Click **\+ Capability** and add **Sign in with Apple**.

### Web[¶](#web "Permanent link")

The plugin loads the [Apple JS SDK](https://developer.apple.com/documentation/sign%5Fin%5Fwith%5Fapple/sign%5Fin%5Fwith%5Fapple%5Fjs) automatically. Make sure you have configured your Apple Service ID with the correct redirect URL and web domain in the [Apple Developer Portal](https://developer.apple.com/account/resources/identifiers/list/serviceId).

## Configuration[¶](#configuration "Permanent link")

No configuration required for this plugin.

## Usage[¶](#usage "Permanent link")

`[](#%5F%5Fcodelineno-3-1)import { AppleSignIn, SignInScope } from '@capawesome/capacitor-apple-sign-in';
[](#%5F%5Fcodelineno-3-2)
[](#%5F%5Fcodelineno-3-3)const initialize = async () => {
[](#%5F%5Fcodelineno-3-4)  await AppleSignIn.initialize({
[](#%5F%5Fcodelineno-3-5)    clientId: 'com.example.app.signin',
[](#%5F%5Fcodelineno-3-6)  });
[](#%5F%5Fcodelineno-3-7)};
[](#%5F%5Fcodelineno-3-8)
[](#%5F%5Fcodelineno-3-9)const signIn = async () => {
[](#%5F%5Fcodelineno-3-10)  const result = await AppleSignIn.signIn({
[](#%5F%5Fcodelineno-3-11)    scopes: [SignInScope.Email, SignInScope.FullName],
[](#%5F%5Fcodelineno-3-12)    redirectUrl: 'https://example.com/callback',
[](#%5F%5Fcodelineno-3-13)    nonce: 'random-nonce',
[](#%5F%5Fcodelineno-3-14)    state: 'random-state',
[](#%5F%5Fcodelineno-3-15)  });
[](#%5F%5Fcodelineno-3-16)  return result;
[](#%5F%5Fcodelineno-3-17)};
`

## API[¶](#api "Permanent link")

* [initialize(...)](#initialize)
* [signIn(...)](#signin)
* [Interfaces](#interfaces)
* [Enums](#enums)

### initialize(...)[¶](#initialize "Permanent link")

`[](#%5F%5Fcodelineno-4-1)initialize(options: InitializeOptions) => Promise<void>
`

Initialize the plugin.

This method must be called before `signIn()` on **Android** and **Web**.

Only available on Android and Web.

| Param       | Type                                    |
| ----------- | --------------------------------------- |
| **options** | [InitializeOptions](#initializeoptions) |

**Since:** 0.1.0

---

### signIn(...)[¶](#signin "Permanent link")

`[](#%5F%5Fcodelineno-5-1)signIn(options?: SignInOptions | undefined) => Promise<SignInResult>
`

Sign in with Apple.

| Param       | Type                            |
| ----------- | ------------------------------- |
| **options** | [SignInOptions](#signinoptions) |

**Returns:** `Promise<[SignInResult](#signinresult)>`

**Since:** 0.1.0

---

### Interfaces[¶](#interfaces "Permanent link")

#### InitializeOptions[¶](#initializeoptions "Permanent link")

| Prop         | Type   | Description                              | Since |
| ------------ | ------ | ---------------------------------------- | ----- |
| **clientId** | string | The Apple Service ID to use for sign-in. | 0.1.0 |

#### SignInResult[¶](#signinresult "Permanent link")

| Prop                  | Type                              | Description                                                                                           | Since |
| --------------------- | --------------------------------- | ----------------------------------------------------------------------------------------------------- | ----- |
| **authorizationCode** | string                            | The authorization code.                                                                               | 0.1.0 |
| **idToken**           | string                            | The ID token (JWT).                                                                                   | 0.1.0 |
| **user**              | string                            | The stable Apple user identifier. On **Android** and **Web**, this is decoded from the JWT sub claim. | 0.1.0 |
| **email**             | string \| null                    | The user's email address. On **iOS**, this is only provided on the first sign-in.                     | 0.1.0 |
| **givenName**         | string \| null                    | The user's given name. On **iOS**, this is only provided on the first sign-in.                        | 0.1.0 |
| **familyName**        | string \| null                    | The user's family name. On **iOS**, this is only provided on the first sign-in.                       | 0.1.0 |
| **state**             | string                            | The state value from the sign-in request. Only available on Android and Web.                          | 0.1.0 |
| **realUserStatus**    | [RealUserStatus](#realuserstatus) | The real user status. Only available on iOS.                                                          | 0.1.0 |

#### SignInOptions[¶](#signinoptions "Permanent link")

| Prop            | Type            | Description                                                                   | Since |
| --------------- | --------------- | ----------------------------------------------------------------------------- | ----- |
| **redirectUrl** | string          | The OAuth redirect URL to use for sign-in. Only available on Android and Web. | 0.1.0 |
| **scopes**      | SignInScope\[\] | The scopes to request during sign-in.                                         | 0.1.0 |
| **nonce**       | string          | A nonce for replay protection.                                                | 0.1.0 |
| **state**       | string          | A state value for CSRF protection. Only available on Android and Web.         | 0.1.0 |

### Enums[¶](#enums "Permanent link")

#### RealUserStatus[¶](#realuserstatus "Permanent link")

| Members         | Value          | Description                                                   | Since |
| --------------- | -------------- | ------------------------------------------------------------- | ----- |
| **LikelyReal**  | 'LIKELY\_REAL' | The user appears to be a real person.                         | 0.1.0 |
| **Unknown**     | 'UNKNOWN'      | The system can't determine whether the user is a real person. | 0.1.0 |
| **Unsupported** | 'UNSUPPORTED'  | The real user status is not supported on this platform.       | 0.1.0 |

#### SignInScope[¶](#signinscope "Permanent link")

| Members      | Value        | Description                       | Since |
| ------------ | ------------ | --------------------------------- | ----- |
| **Email**    | 'EMAIL'      | Request the user's email address. | 0.1.0 |
| **FullName** | 'FULL\_NAME' | Request the user's full name.     | 0.1.0 |

## Security[¶](#security "Permanent link")

This plugin handles the OAuth flow and returns tokens to your app. To keep your integration secure, be aware of the following:

* **Server-side token verification is required.** The `idToken` (JWT) is **not** verified client-side. Your backend **must** verify the JWT signature using [Apple's public keys](https://appleid.apple.com/auth/keys) before trusting any claims (e.g. `user`, `email`). Never use client-side token data for authorization decisions without server-side verification.
* **Validate the `state` parameter.** The plugin passes the `state` value through to the result but does **not** validate it. Your app must compare the returned `state` against the value it originally sent to protect against CSRF attacks.
* **Android uses a WebView-based OAuth flow.** Unlike iOS (which uses native `AuthenticationServices`), the Android implementation renders Apple's sign-in page in a WebView. Unlike a system browser flow, the WebView is controlled by the app and has access to page content. Ensure your `redirectUrl` uses HTTPS and points to a domain you control.

## FAQ[¶](#faq "Permanent link")

### What's the difference between this plugin and other Apple Sign-In plugins?[¶](#whats-the-difference-between-this-plugin-and-other-apple-sign-in-plugins "Permanent link")

This plugin is purpose-built for Apple Sign-In and focuses on providing a clean and modern API with the latest platform features. Here are some of the key differences:

* **Cross-platform**: Supports Android, iOS, and Web.
* **Lightweight**: No unnecessary dependencies. Just Apple Sign-In, nothing else.
* **No deprecated APIs**: Uses the latest platform APIs (AuthenticationServices on iOS).
* **Scope support**: Request email and full name on all platforms.
* **Error codes**: Provides typed error codes for proper error handling.

## Changelog[¶](#changelog "Permanent link")

See [CHANGELOG.md](https://github.com/capawesome-team/capacitor-plugins/blob/main/packages/apple-sign-in/CHANGELOG.md).

## License[¶](#license "Permanent link")

See [LICENSE](https://github.com/capawesome-team/capacitor-plugins/blob/main/packages/apple-sign-in/LICENSE).

---

1. This project is not affiliated with, endorsed by, sponsored by, or approved by Apple Inc. or any of their affiliates or subsidiaries. [↩](#fnref:1 "Jump back to footnote 1 in the text")

May 17, 2026 

 Back to top 