protocol GroupActivity(英語)
struct GroupActivityMetadata(英語)
enum GroupActivityActivationResult(英語)
グループ体験の作成は、アプリがサポートするアクティビティを中心にして進めます。たとえば、ビデオストリーミングアプリで、映画を視聴するためのアクティビティを定義する場合、そのアクティビティには、映画の再生など関連するタスクをアプリが実行するために必要なデータが含まれます。さらに、映画のタイトルなど、アクティビティの内容を説明する情報も含まれます。こうした情報は、システムによって他の参加者に知らせることができます。
Group Activitiesフレームワークを利用すると、アプリの既存のタイプやオブジェクトにアクティビティ情報を組み込むことができます。アプリがサポートする個別の体験ごとにアクティビティを定義します。たとえば、ビデオストリーミングアプリでは、映画の視聴用とテレビ番組の視聴用に別々のアクティビティを定義することもあります。アクティビティのタイプを区別しておくと、それぞれのアクティビティの体験をカスタマイズしやすくなります。
アクティビティでは他のデバイスとのやり取りが行われるため、アプリにはcom
(英語)エンタイトルメントを含める必要があります。Xcodeで次の手順を実行し、このエンタイトルメントをアプリに追加します。
Xcodeプロジェクトを開きます。
アプリターゲットを選択します。
「Signing & Capabilities(署名と機能)」タブに移動します。
Group Activities機能をターゲットに追加します。
Group Activities機能によって、必要なエンタイトルメントがアプリとプロビジョニングプロファイルに追加されます。この機能を追加できるのはアプリターゲットのみです。
アプリがサポートするアクティビティごとに、Group
(英語)プロトコルに準拠した軽量のクラス/構造体を定義します。アクティビティインスタンスは、アプリで参加者が利用できる特定のアクティビティについて説明する情報を提供します。アクティビティインスタンスは、実際にはアプリの既存のデータタイプである場合があります。たとえば、映画鑑賞アプリのアクティビティインスタンスには、映画のタイトル、ポスター画像、アプリ固有の映画の再生方法に関する情報が含まれているかもしれません。
次のコードサンプルは、映画を視聴するアクティビティをサポートする構造体の実装を示しています。activity
プロパティには、アクティビティの一意の識別子が、通常は逆DNS形式で含まれます。他のプロパティは映画に関する情報を定義します。たとえば、このアプリはcatalog
プロパティおよびcontent
プロパティを使って、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
}
アクティビティが関係するのは、アプリがそれらの情報をユーザーに表示する際に限定されるため、Group
(英語)タイプはユーザーインターフェイス設定の一部として作成し、ビューと共に格納します。たとえば、視聴する映画を参加者に提示するGroupActivityタイプなら映画詳細ビューに作成します。
ユーザーがアクティビティに参加する前に、タイトルや、オプションで表示するサブタイトルや画像など、そのアクティビティに関する情報がシステムによって表示されます。映画鑑賞アプリであれば映画のタイトルや関連するポスター画像を返したり、音楽鑑賞アプリであれば選択したトラックのタイトルやアルバムのアートワークを返したりします。
アクティビティのメタデータをシステムに返すには、metadata
(英語)プロパティを実装して、Group
(英語)インスタンスを返します。次の例は、Watch
構造体のExtensionを示しています。Extensionはこの構造体を作成し、これに映画のタイトルを設定します。これには、アプリをデバイスにインストールしていない参加者向けの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に設置して、ユーザーが新しいアクティビティを開始できるようにします。ユーザーがボタンをタップした時、もしくはアクティビティを開始するUI操作を行った時に、関連付けられたGroup
(英語)タイプの該当するメソッドを呼び出します。
ほとんどのアクティビティでは、Group
(英語)タイプのprepare
(英語)メソッドを呼び出してアクティビティを開始します。このメソッドはアクティビティの共有が可能かどうか、およびユーザーがアクティビティを共有したいかどうかを決定します。たとえば、ユーザーが友人と共有せずに映画を視聴することを選択する場合もあります。結果が準備できたら、このメソッドは指定された完了ハンドラを呼び出します。このハンドラを使ってアクティビティを開始または中断します。次の例は、このメソッドの一般的な呼び出しを実装する方法を示しています。
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
}
}
}
}
注意
グループで行わないと意味がないようなアクティビティの場合は、アクティベーションの準備をする代わりに、activate()
(英語)メソッドを直接呼び出すことができます。
新規に開始されたアクティビティに参加する方法について、詳しくは「共有アクティビティへの参加と管理」を参照してください。
protocol GroupActivity(英語)
struct GroupActivityMetadata(英語)
enum GroupActivityActivationResult(英語)