ドキュメント

アクティビティの共有への参加者の招待

グループアクティビティをサポートし、特定のタイミングでそれらのアクティビティをUI上で提示します。

概要

グループ体験の作成は、Appがサポートするアクティビティを中心にして進めます。例えば、ビデオストリーミングAppで、映画を視聴するためのアクティビティを定義する場合、そのアクティビティには、映画の再生など関連するタスクをAppが実行するために必要なデータが含まれます。さらに、映画のタイトルなど、アクティビティの内容を説明する情報も含まれます。こうした情報は、システムによって他の参加者に知らせることができます。

Group Activitiesフレームワークを利用すると、Appの既存のタイプやオブジェクトにアクティビティ情報を組み込むことができます。Appがサポートする個別の体験ごとにアクティビティを定義します。例えば、ビデオストリーミングAppでは、映画の視聴用とテレビ番組の視聴用に別々のアクティビティを定義することもあります。アクティビティのタイプを区別しておくと、それぞれのアクティビティの体験をカスタマイズしやすくなります。

エンタイトルメントの構成

アクティビティでは他のデバイスとのやり取りが行われるため、Appにはcom.apple.developer.group-session(英語)エンタイトルメントを含める必要があります。Xcodeで次の手順を実行し、このエンタイトルメントをAppに追加します。

  1. Xcodeプロジェクトを開きます。

  2. Appターゲットを選択します。

  3. 「Signing & Capabilities(署名と機能)」タブに移動します。

  4. Group Activities機能をターゲットに追加します。

Group Activities機能によって、必要なエンタイトルメントがAppとプロビジョニングプロファイルに追加されます。この機能を追加できるのはAppターゲットのみです。

カスタムアクティビティインスタンスの定義

Appがサポートするアクティビティごとに、GroupActivity(英語)プロトコルに準拠した軽量のクラス/構造体を定義します。アクティビティインスタンスは、Appで参加者が利用できる特定のアクティビティについて説明する情報を提供します。アクティビティインスタンスは、実際にはAppの既存のデータタイプである場合があります。例えば、映画鑑賞Appのアクティビティインスタンスには、映画のタイトル、ポスター画像、App固有の映画の再生方法に関する情報が含まれているかもしれません。

次のコードサンプルは、映画を視聴するアクティビティをサポートする構造体の実装を示しています。activityIdentifierプロパティには、アクティビティの一意の識別子が、通常は逆DNS形式で含まれます。他のプロパティは映画に関する情報を定義します。例えば、このAppはcatalogプロパティおよびcontentIdentifierプロパティを使って、iTunes Store内の映画を検索します。


struct WatchTogether: GroupActivity {
  
   // Specify the activity type to the system.
    static let activityIdentifier = “com.example.myapp.watch-movie-together”
   
   //----------
   // Store app-specific information about the movie. 


   // The catalog identifier or store location of the content.
   var catalog: Catalog = .us


   // The content item identifier of the movie to watch together.
   var contentIdentifier: String


   // The movie title localized to the initiator's language.
   var movieTitle: String


}

アクティビティが関係するのは、Appがそれらの情報をユーザーに表示する際に限定されるため、GroupActivity(英語)タイプはユーザーインターフェイス設定の一部として作成し、ビューと共に格納します。例えば、視聴する映画を参加者に提示するGroupActivityタイプなら映画詳細ビューに作成します。

アクティビティについて説明する情報の提供

ユーザーがアクティビティに参加する前に、タイトルや、オプションで表示するサブタイトルや画像など、そのアクティビティに関する情報がシステムによって表示されます。映画鑑賞Appであれば映画のタイトルや関連するポスター画像を返したり、音楽鑑賞Appであれば選択したトラックのタイトルやアルバムのアートワークを返したりします。

アクティビティのメタデータをシステムに返すには、metadata(英語)プロパティを実装して、GroupActivityMetadata(英語)インスタンスを返します。次の例は、WatchTogether構造体のExtensionを示しています。Extensionはこの構造体を作成し、これに映画のタイトルを設定します。これには、Appをデバイスにインストールしていない参加者向けのWebベースURLも含まれています。


extension WatchTogether {


    // Provide information about the activity. 
    var metadata: GroupActivityMetadata {
        var metadata = GroupActivityMetadata()
        metadata.type = .watchTogether
        metadata.title = movieTitle
        metadata.fallbackURL = URL(string: 
                "https://itunes.apple.com/\(catalog)/movie/\(contentIdentifier)")
        return metadata
    }
}

アクティビティに参加するためのUIの提供

ボタンや他のコントロールをAppのUIに設置して、ユーザーが新しいアクティビティを開始できるようにします。ユーザーがボタンをタップした時、もしくはアクティビティを開始するUI操作を行った時に、関連付けられたGroupActivity(英語)タイプの該当するメソッドを呼び出します。

ほとんどのアクティビティでは、GroupActivity(英語)タイプのprepareForActivation()(英語)メソッドを呼び出してアクティビティを開始します。このメソッドはアクティビティの共有が可能かどうか、およびユーザーがアクティビティを共有したいかどうかを決定します。例えば、ユーザーが友人と共有せずに映画を視聴することを選択する場合もあります。結果が準備できたら、このメソッドは指定された完了ハンドラを呼び出します。このハンドラを使ってアクティビティを開始または中断します。次の例は、このメソッドの一般的な呼び出しを実装する方法を示しています。


private func playMovie() {
   // If a session is already active, just change the movie.
   if let activeGroupSession = activitySession.groupSession {
      // Change the current movie.
      activeGroupSession.activity = currentMovie
   } else {
      // Try to start a new movie-watching activity.
      item.prepareForActivation { result in
         switch result {
         case .activationPreferred:
            // Watch the movie with the group.
            currentMovie.activate()
         case .activationDisabled:
            // Watch the movie locally. 
            isMoviePlaying = true
         default:
            break
         }
     }
   }
}

新規に開始されたアクティビティに参加する方法について、詳しくは「共有アクティビティへの参加と管理」を参照してください。

関連項目

アクティビティの作成