External Link Account Implementation Guide (Reader Apps)

Apple allows a subset of applications to link to an external website where users can create or manage accounts. This only allows for "Reader Apps".

1. What is the "Reader Apps"?

Reader apps are apps that provide one or more of the following digital content types — "magazines", "newspapers", "books", "audio", "music", or "video" — as the primary functionality of the app. For these apps, people can sign in to their account created outside the app, letting them view and enjoy previously purchased media content or content subscriptions on their Apple device. For these apps, you can also provide a link to your website where people can create and manage their accounts. Now we'll see what are the steps to implement the "External Link Account" in an application.

2. Request Entitlement

First of all, we need to request the "External Link Account entitlement" from Apple. Which we can do by submitting a request form. You'll need to be an Account Holder to request this entitlement. Entitlement requests are for bundle ID and assigned entitlements can only be used with the single binary associated with the bundle ID. In order to be eligible, your app must:

  • As the primary functionality of your app, provide one or more of the following digital content types: magazines, newspapers, books, audio, music, or video.
  • Allow people to sign in to an account.
  • Allow people to access content or services previously purchased outside of the app when signed in, such as on your website.
  • Not offer in-app purchases on iOS, iPadOS, or tvOS while using the External Link Account Entitlement.
  • Not facilitate real-time, person-to-person services (e.g., providing tutoring services, medical consultations, real estate tours, or fitness training).
Note: Apps that let people access digital content such as music or video, but not as the primary functionality, are not considered reader apps and are not eligible for External Link Account Entitlement. For example, a social networking app that lets people stream audiovisual content is not eligible.

3. Enable Entitlement

Once receive the confirmation and entitlement assigned to your account then you need to add com.apple.developer.storekit.external-link.account entitlement in your project Entitlements file.

  • Key: com.apple.developer.storekit.external-link.account
  • Type: Boolean
  • Value: true

4. Add website in Info.plist

Now we need to add a unique web URL that will provide users the capability to create and manage accounts (purchase products also). This URL should be present in Info.plist. We can add multiple URLs to support multiple languages.

  • Key: SKExternalLinkAccount
  • Type: Dictionary with string values
  • Key: Region codes as keys and a single URL as the value. It must contain a key with the string * that maps to a default URL.
  • Value: Website URL
<key>SKExternalLinkAccount</key>
<dict>
    <key>*</key>
    <string>https://developerinsider.co/#/portal/signin</string>
    <key>in</key>
    <string>https://developerinsider.in/#/portal/signin/</string>
    <key>jp</key>
    <string>https://developerinsider.co/#/portal/signin/jp</string>
</dict>

Make sure that each website URL is a string that:

  • Uses the https scheme.
  • Forms a valid, absolute URL.
  • Contains no query parameters.
  • Contains 1000 or fewer ASCII characters.

Note: At all times, the URLs that you provide in the Info.plist file in Xcode must match the value in the app binary you submitted to App Review.

5. Add Login Screen

For the login screen, you need to keep the following points in mind to avoid build rejection:

  • The link displayed has to be the exact same link present in the Info.plist. For example, do not use "Go to developerinsider.co to register" but use "Go to https://developerinsider.co/#/portal/signin to register".

  • The link should look like a standard web page hyperlink (blue color with underline)

On the link tap action, for iOS 16, iPadOS 16, and tvOS 16.4 or later we can utilize Apple API which will present a model sheet. For devices running earlier versions of iOS and iPadOS, we need to implement the modal sheet by following the guide provided by Apple.

Each time someone taps a link to the website to create an account or manage an existing account, the app must show a modal sheet within the app before redirecting the user to an external web browser. App must call canMakePayments and confirm that the user has permission to make payments before showing this sheet.

6.1 For iOS 16, iPadOS 16 or later

For iOS 16 and/or iPadOS 16 or later, and tvOS 16.4 or later, this is implemented by using the External Link Account API.

func openManageAccountLink() async {
  // Make sure the client can make payment
  guard SKPaymentQueue.canMakePayments() else {
    return
  }

  if #available(iOS 16.0, *) {
    // this will return false in case the website link is not available in Info.plist
    guard await ExternalLinkAccount.canOpen else {
      return
    }

    do {
      try await ExternalLinkAccount.open()
    } catch {
      dump("Error - \(error)")
    }
  } else {
    // handle for device running earlier version
  }
}

6.2 For earlier versions of iOS and iPadOS

For devices running earlier versions of iOS, and iPadOS, we'll need to implement the modal sheet by following exactly the modal sheet's design and text provided by Apple Design Specification which you can download from here https://developer.apple.com/support/downloads/Reader_App_Modal_Specifications.zip.

Make sure -

  • Your implemented ViewController/View should look like the one provided by Apple on iOS 16.
  • Support the locale of your application. For some locales, texts are available in the above zip file.
  • Present the ViewController/View as a model sheet, not full screen.
  • Open the link using Safari and not in the embedded web view.

7. Submit the app for review

When submitting your app binary for review in App Store Connect, make sure to adhere to the terms and conditions of the entitlement. Also, there might be several rounds of approval. So, keep this in mind, it might take weeks to get approval with this feature from Apple. If you have an Apple contact then take his help to make expedite request.


Discussion

Read Community Guidelines
You've successfully subscribed to Developer Insider
Great! Next, complete checkout for full access to Developer Insider
Welcome back! You've successfully signed in
Success! Your account is fully activated, you now have access to all content.