View in English

  • メニューを開く メニューを閉じる
  • Apple Developer
検索
検索を終了
  • Apple Developer
  • ニュース
  • 見つける
  • デザイン
  • 開発
  • 配信
  • サポート
  • アカウント
次の内容に検索結果を絞り込む

クイックリンク

5 クイックリンク

ビデオ

メニューを開く メニューを閉じる
  • コレクション
  • トピック
  • すべてのビデオ
  • 利用方法

その他のビデオ

ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。

  • 概要
  • トランスクリプト
  • コード
  • PermissionKitによる子どもの安全性の向上

    アプリを利用する子どもたちの安全性を強化する上で、PermissionKitがどのように役立つかを紹介します。この新しいフレームワークでは、年齢に適したコミュニケーション体験を提供し、ファミリー共有を利用して親の承認を求めることができます。メッセージアプリにシームレスに統合された許可リクエストを作成し、親からの回答を処理し、子どもにフレンドリーなUIをカスタマイズする方法を学びます。このセッションの内容を十分理解できるよう、最初に、WWDC25の「Deliver age-appropriate experiences in your app」を視聴することをおすすめします。

    関連する章

    • 0:00 - Introduction
    • 2:40 - Meet PermissionKit
    • 3:26 - Tailor your UI for children
    • 4:38 - Create an “ask” experience
    • 7:02 - Parent/guardian responses
    • 10:27 - More ways to keep kids safe

    リソース

    • DeclaredAgeRange
    • PermissionKit
      • HDビデオ
      • SDビデオ

    関連ビデオ

    WWDC25

    • アプリにおけるユーザー年齢に応じた体験の提供
  • このビデオを検索

    Hi, I’m Andrew, an engineer on the family team. Welcome to “Enhance child safety with PermissionKit.” A parent’s most important responsibility is to keep their children safe. In a digital environment, keeping children safe begins with a conversation between a child and their parents and guardians.

    That’s especially true when it comes to who the child communicates with online. Starting that conversation from an app can be difficult and involves a significant amount of technical overhead. The best place for parents to communicate with their child is somewhere they're already communicating: Messages. In iOS, iPadOS, and macOS 26, you can help start a conversation in Messages between a child and their parents using PermissionKit.

    With PermissionKit, children can ask their parents to communicate with someone new. In this video, I’ll start by introducing you to the new PermissionKit framework.

    Then, I’ll show you how you can adapt your app’s UI with child safety in mind by using this new API.

    Next, I’ll explain how to create a communication permission question that a child can ask their parents and guardians right in Messages.

    Finally, I’ll show you how to listen for and respond to answers from parents and guardians. This video assumes that your app has communication functionality, and that you already have a way to determine the age or age range of each of your users. The PermissionKit API I’m about to show should only be used when you know the current user is a child.

    If you don’t already have your own account systems to determine if the current user is a child, use the new declared age range API.

    Parents can allow their kids to share the age range associated with their child accounts, which can then be requested through the declared age range API.

    Watch “Deliver age appropriate experiences in your app” from WWDC25 for more details.

    Here are a few other things to consider when deciding if PermissionKit is right for your app.

    PermissionKit leverages users’ Family Sharing group to connect children with their parents and guardians.

    This means that users must be part of a Family Sharing group to realize the full potential of PermissionKit. If the child is not part of a Family Sharing group when a request is made, the API will return a default response. Additionally, the parents or guardians must enable Communication Limits for the child. The API will also return a default response if Communication Limits is not enabled.

    Let me start by introducing you to PermissionKit.

    PermissionKit is a new framework that provides you a quick and easy way to create consistent, first-class permission experiences, between a requester and permission authorities. In iOS, iPadOS, and macOS 26, you can help keep children safe online by adopting PermissionKit. PermissionKit can be used to start a conversation in Messages between a child and the parents and guardians in their Family Sharing group. In your app, children can request to communicate with someone new over Messages. Parents have the opportunity to approve or decline their child’s request to communicate directly within the resulting Messages conversation.

    Now I’ll talk about how to adopt PermissionKit, starting with how to make your UI age appropriate. Landmarks is an app for viewing and learning all about Landmarks. I’ll go over an example of adding a new chat feature to the app, so users can talk with each other about their favorites. Landmarks is an app made for all ages, So it’s a perfect fit for PermissionKit.

    For children, your app should hide content from unknown senders. Some examples include a preview for a message, profile pictures, and any other potentially sensitive content not suitable for children.

    One way this can be accomplished is by awaiting the knownHandles(in:) method of the CommunicationLimits singleton. Given a set of handles, this API will perform an optimized lookup and return a subset of those handles that are known by the system. This could be supplemented with information from your own databases. There’s no need to start fresh if this data is already available to you in your own systems. Then, determine if the handle or group of handles that the child is trying to interact with, contains only known handles. Only show the underlying content if the handles are known.

    Next, I’ll show you how to create and send a question so that the child can ask permission from their parents. PermissionKit provides a question abstraction, which contains all the details of a child’s permission request. Each question has with it a topic which further describes the question being asked. For example, a communication topic packages all the information about a person, or group of people, a child is trying to communicate with in some way. At a minimum, this information includes a handle for the person, specifically the person’s phone number, email address, or some other identifier, like a username.

    Now diving into the code. Create a permission question, passing in the unknown handles.

    You can also add metadata about specific handles. Prefer adding the most amount of metadata possible. Any metadata provided will be shown to parents and guardians by the system and can be used to help inform their decision to approve or deny their child’s request.

    To do this, create a CommunicationTopic.

    CommunicationTopic uses PersonInformation.

    PersonInformation has affordances for the handle, name, and an image. You can also optionally set actions on the topic.

    The chosen actions should correspond to how the child is attempting to communicate with the specified people.

    Depending on which actions you choose, the system will use specific verbiage when showing the request to the parent for review.

    In this example, I’m using message, but you can also provide call, video, and others.

    Finally, initialize your PermissionQuestion with your custom CommunicationTopic.

    Now, using the PermissionQuestion you created, initialize a CommunicationLimitsButton inside of your SwiftUI view.

    When the child taps your button, they’ll receive a system prompt, which allows them to choose to send the question to their parents and guardians in Messages.

    For UIKit apps, use the CommunicationLimits singleton to start the Ask Flow on the child’s device. You’ll need to pass in a UIViewController, which the system will use to present UI.

    You can also use the CommunicationLimits singleton to start the Ask Flow on the child’s device for AppKit apps. You'll just need to provide an NSWindow.

    And that's it for the asking experience. Now all that’s left is to handle the answers chosen by parents and guardians. When a parent responds inside Messages, your app will be launched in the background on the child’s devices. You’ll need to handle these responses as they’re received.

    Shortly after your app launches, obtain an AsyncSequence from the CommunicationLimits singleton and iterate over it on a background task so that your app is always informed of permission updates. When a response is received, this is an opportunity to update your UI or post new data to your own databases.

    And that’s it. Really. Now I’ll put it all together and go over how it works in Landmarks. The device on the left is the child’s device, and the device on the right is a parent’s device. Here in Landmarks on the child’s device, we’re on the new chats view that I added.

    The message previews for all of the unknown handles are hidden from the child by default.

    Tapping into one of the conversations shows that the message content is hidden from the child and that they’re unable to respond without first asking their parents and guardians for permission.

    When the child taps the communication limits button, an alert is shown. This alert allows them to confirm they’d like to send their parents and guardians a message. Alternatively, they can get approval from their parent or guardian in-person using the Screen Time passcode. If the child taps the Ask option in the alert, a Messages Compose window is presented, with the parents and guardians from the child’s Family Sharing group prefilled in the To field, and the question staged in the text view.

    The child can optionally add a name for this person by tapping the Add or Edit Name button. If you provide metadata for the person via the previously discussed PermissionQuestion API, that metadata will appear here.

    This metadata will be shown to parents and guardians when they review the request on their devices.

    Once the child taps the send button, the question will send to their parents and guardians just like any other iMessage.

    Now directing attention to the parent device, the parent received the question from their child in Messages.

    Parents can either decline directly from the bubble, or they can choose to review this ask.

    If they review, they’ll see additional context about this ask, and they can either choose to approve or decline.

    Regardless of what the parent chooses, the child will automatically receive a notification informing them of their parent's choice. At the time the notification is delivered to the child, the parent’s choice will also be delivered directly to your app in the background. Respond to this choice by, for example, updating your UI and local caches, or by posting information to your servers.

    Now that the parent has approved, the child can see and respond to messages from this person in Landmarks. Now that you know how to adopt PermissionKit, here are some other things to consider for enhancing child safety in your app. Use PermissionKit as a launchpad to add similar experiences outside of Apple’s platforms, like your app’s website, by persisting information obtained from PermissionKit to your own servers. And don’t stop at PermissionKit. Determine if your app is a good fit for our other family and child safety API offerings. For example, here are more ways to keep kids safe using our APIs. The new Sensitive Content Analysis API expands communication safety to protect kids by detecting and blocking nudity in live streaming video calls. The new Declared Age Range API allows you to build safe, age-appropriate experiences for kids.

    The Screen Time framework gives you the tools you need to help parents and guardians supervise their children’s web usage. And the Family Controls framework helps apps provide their own parental controls.

    Now that you know how to improve child safety in your app using PermissionKit, here’s what to do next. Start by determining the age range of each of your users, either by using data from your own servers or the new Declared Age Range API. Then, adapt your app’s UI with children in mind. From there, adopt PermissionKit. Create the questions to ask and respond to parent and guardian answers.

    Thanks for giving me permission to introduce you to PermissionKit.

    • 4:03 - Tailor your UI for children

      import PermissionKit
      
      let knownHandles = await CommunicationLimits.current.knownHandles(in: conversation.participants)
      
      if knownHandles.isSuperset(of: conversation.participants) {
          // Show content
      } else {
          // Hide content
      }
    • 5:15 - Create a question

      import PermissionKit
      
      var question = PermissionQuestion(handles: [
          CommunicationHandle(value: "dragonslayer42", kind: .custom),
          CommunicationHandle(value: "progamer67", kind: .custom)
      ])
    • 5:38 - Create a question - additional metadata

      import PermissionKit
      
      let people = [
          PersonInformation(
              handle: CommunicationHandle(value: "dragonslayer42", kind: .custom),
              nameComponents: nameComponents,
              avatarImage: profilePic
          ),
          PersonInformation(
              handle: CommunicationHandle(value: "progamer67", kind: .custom)
          )
      ]
      
      var topic = CommunicationTopic(personInformation: people)
      topic.actions = [.message]
      
      var question = PermissionQuestion(communicationTopic: topic)
    • 6:25 - Ask a question - SwiftUI

      import PermissionKit
      import SwiftUI
      
      struct ContentView: View {
          let question: PermissionQuestion<CommunicationTopic>
      
          var body: some View {
              // ...
              CommunicationLimitsButton(question: question) {
                  Label("Ask Permission", systemImage: "paperplane")
              }
          }
      }
    • 6:43 - Ask a question - UIKit

      import PermissionKit
      import UIKit
      
      try await CommunicationLimits.current.ask(question, in: viewController)
    • 6:54 - Ask a question - AppKit

      import PermissionKit
      import AppKit
      
      try await CommunicationLimits.current.ask(question, in: window)
    • 7:19 - Parent/guardian responses

      import PermissionKit
      import SwiftUI
      
      struct ChatsView: View {
          @State var isShowingResponseAlert = false
      
          var body: some View {
              List {
                 // ...
              }
              .task {
                  let updates = CommunicationLimits.current.updates
                  for await update in updates {
                      // Received a response!
                      self.isShowingResponseAlert = true
                  }
              }
          }
      }

Developer Footer

  • ビデオ
  • WWDC25
  • PermissionKitによる子どもの安全性の向上
  • メニューを開く メニューを閉じる
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    メニューを開く メニューを閉じる
    • アクセシビリティ
    • アクセサリ
    • App Extension
    • App Store
    • オーディオとビデオ(英語)
    • 拡張現実
    • デザイン
    • 配信
    • 教育
    • フォント(英語)
    • ゲーム
    • ヘルスケアとフィットネス
    • アプリ内課金
    • ローカリゼーション
    • マップと位置情報
    • 機械学習
    • オープンソース(英語)
    • セキュリティ
    • SafariとWeb(英語)
    メニューを開く メニューを閉じる
    • 英語ドキュメント(完全版)
    • 日本語ドキュメント(一部トピック)
    • チュートリアル
    • ダウンロード(英語)
    • フォーラム(英語)
    • ビデオ
    Open Menu Close Menu
    • サポートドキュメント
    • お問い合わせ
    • バグ報告
    • システム状況(英語)
    メニューを開く メニューを閉じる
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles(英語)
    • フィードバックアシスタント
    メニューを開く メニューを閉じる
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(英語)
    • News Partner Program(英語)
    • Video Partner Program(英語)
    • セキュリティ報奨金プログラム(英語)
    • Security Research Device Program(英語)
    Open Menu Close Menu
    • Appleに相談
    • Apple Developer Center
    • App Store Awards(英語)
    • Apple Design Awards
    • Apple Developer Academy(英語)
    • WWDC
    Apple Developerアプリを入手する
    Copyright © 2025 Apple Inc. All rights reserved.
    利用規約 プライバシーポリシー 契約とガイドライン