WWDC Quick Look 💓 By SwiftGGTeam
Day two recap

Day two recap

元の動画を見る

ハイライト

WWDC21 の 2 日目は、音声認識、ShazamKit カスタム オーディオ マッチング、Screen Time API、StoreKit 2、および Nearby Interaction アクセサリのサポートのデモンストレーションに焦点を当てました。開発者は、システムレベルの識別、制限、購入、空間認識機能を独自のアプリに統合できます。

主要内容

2 日目の要約は 1 分強です。コードを拡張するものではありませんが、その日のいくつかの技術的な方向性をまとめたものです。

これらの方向性はすべて、実際の開発上のトラブルから生まれています。

環境内の音を認識したい場合、以前はモデルをトレーニングし、オーディオ ウィンドウを処理し、信頼レベルを自分で決定する必要がありました。 Sound Analysis には、300 を超える音を直接識別できる分類器が組み込まれています。

モバイル アプリをテレビのビデオと同期したい場合、以前はネットワーク、タイムコード、または手動トリガーに依存する必要がありました。 ShazamKit を使用すると、アプリはオーディオを聞いてカスタム ディレクトリと照合し、一致するオフセットに基づいてコンテンツを表示できます。

ペアレンタルコントロールを制御したい場合、以前はスクリーンタイムのシステム制限機能を利用できませんでした。 Screen Time API は、制限、承認、デバイス アクティビティの監視を 3 つのフレームワークに分割し、アプリがプライバシーの境界内で動作できるようにします。

購読したい場合は、事前に対処する必要がありますSKProductsRequest、取引ステータスと受領確認。 StoreKit 2 は、製品、購入、トランザクション、特典をネイティブの Swift API に変換します。

携帯電話とアクセサリがお互いの位置を認識できるようにしたいと考えています。以前は、Nearby Interaction は主に Apple デバイス間で使用されていました。 iOS 15 では、互換性のあるサードパーティ製 UWB アクセサリのサポートが開始されます。

この要約の価値は、その方法を示すことです。どのセッションを翌日も継続する価値があるか、そしてそれぞれの新機能がどのような種類の製品の問題を解決するかを示します。

詳細

音響分析を使用して環境音を特定する

00:07

要約では、開発者が音を分析して分類する方法を学んだことが述べられています。対応するセッションは、Discover built-in sound classification in SoundAnalysis

Sound Analysis は、組み込みのサウンド分類器を提供します。マイク、オーディオ ファイル、ビデオ ファイルからの個別の音を識別できます。開発者は最初にカスタム モデルをトレーニングする必要はありません。

func getListOfRecognizedSounds() throws -> [String] {
    let request = try SNClassifySoundRequest(classifierIdentifier: .version1)
    return request.knownClassifications
}

キーポイント:

  • getListOfRecognizedSounds()組み込み分類子でサポートされているサウンド ラベルを返します。
  • SNClassifySoundRequestは音声分類リクエストです。
  • .version1システムによって提供される組み込み分類子の最初のバージョンを使用するように指定します。
  • knownClassifications分類子によって認識されたタグのリストを公開します。

タグを取得したら、音声ファイルを分類できます。

let request = try SNClassifySoundRequest(classifierIdentifier: .version1)

let analyzer = try SNAudioFileAnalyzer(url: url)

var observer: SNResultsObserving // TODO

try analyzer.add(request, withObserver: observer)
analyzer.analyze()

キーポイント:

  • 最初の行は、同じ組み込み分類リクエストを作成します。
  • SNAudioFileAnalyzer(url:)ローカルのオーディオ ファイルを読み取ります。
  • SNResultsObserving分類結果を受け取ります。
  • analyzer.addリクエストとオブザーバーをアナライザーにバインドします。
  • analyzer.analyze()分析の実行を開始します。

カスタム オーディオ マッチングに ShazamKit を使用する

00:17

要約では、ShazamKit がカスタム オーディオを認識できると述べています。提示されるシナリオは非常に具体的です。テレビでビデオが再生され、携帯電話のコンパニオン アプリが適切なタイミングで問題を表示します。

対応するセッションでは、Apple が教育ビデオを例として使用しています。アプリはまずビデオとオーディオの参照署名を生成し、それをカスタム ディレクトリに置きます。実行中、アプリはマイクからオーディオ ストリームを収集し、ディレクトリと照合して、predictedCurrentMatchOffset現在のビデオの場所を見つけます。

// Matching signatures using SHSession
let session = SHSession()
session.delegate = self

let signatureGenerator = SHSignatureGenerator()
try signatureGenerator.append(buffer, at: nil)

let signature = signatureGenerator.signature()
session.match(signature)

キーポイント:

  • SHSessionマッチングの実行を担当します。
  • session.delegate = self現在のオブジェクトが一致する結果を受信できるようにします。
  • SHSignatureGeneratorオーディオバッファを署名に変換します。
  • append(buffer, at:)キャプチャした音声を署名ジェネレーターに書き込みます。
  • signature()一致するオーディオ署名を生成します。
  • session.match(signature)この署名を使用してマッチングを開始します。

カスタム カタログにはメタデータも含めることができます。マッチングが成功すると、デリゲートが戻りますSHMatch, アプリはから始まりますmediaItemsタイトル、先生、話数などの情報を読みます。

// Receiving matches via the session delegate
extension SongResultViewController: SHSessionDelegate {

    public func session(_ session: SHSession, didFind match: SHMatch) {

        guard let matchedMediaItem = match.mediaItems.first else {
            return
        }

        DispatchQueue.main.async {
            self.songView.titleLabel.text = matchedMediaItem.title
            self.songView.artistLabel.text = matchedMediaItem.artist
        }

    }
}

キーポイント:

  • SHSessionDelegateShazamKitのマッチコールバックを受け取ります。
  • session(_:didFind:)一致するものが見つかったときに発生します。
  • match.mediaItems.first最初に一致したメディア アイテムを取得します。
  • matchedMediaItem.titleそしてartistディレクトリに保存されているメタデータです。
  • DispatchQueue.main.asyncインターフェースの更新がメインスレッドで行われるようにしてください。

Screen Time API を使用したペアレンタルコントロールの構築

00:37

要約では、Nolan が Screen Time API をデモンストレーションしたと述べています。デモ アプリは「宿題」と呼ばれます。子供たちは、特定のアプリの制限を解除する前に、指定された学習アプリを使用する必要があります。

Screen Time API は 3 つのフレームワークで構成されます。

管理設定は、アプリのブロック、Web ページのフィルタリング、アカウント設定のロックなどの制限を設定します。 Family Controls は、保護者の承認とプライバシー保護を担当します。デバイス アクティビティは、時間枠と使用量のしきい値に基づいて拡張コードをトリガーします。

import FamilyControls

Task {
    do {
        try await AuthorizationCenter.shared.requestAuthorization(for: .child)
    } catch {
        // Handle the error here.
    }
}

キーポイント:

  • FamilyControlsScreen Time API への認証アクセスを提供します。
  • Task非同期認証メソッドを呼び出すために使用されます。
  • AuthorizationCenter.shared認可センターの共有インスタンスです。
  • requestAuthorization(for: .child)お子様のデバイスでファミリー コントロールを使用するようリクエストします。
  • 失敗した場合に入力しますcatch、アプリは認証の失敗を処理する必要があります。

承認後、アプリはデバイスアクティビティの監視をスケジュールできます。デバイス アクティビティは、時間枠の開始時、終了時、またはしきい値に達したときに内線を呼び出します。

let schedule = DeviceActivitySchedule(
    intervalStart: DateComponents(hour: 15, minute: 0),
    intervalEnd: DateComponents(hour: 18, minute: 0),
    repeats: true
)

let center = DeviceActivityCenter()
try center.startMonitoring(.daily, during: schedule)

キーポイント:

  • DeviceActivitySchedule監視時間枠について説明します。
  • intervalStartウィンドウの開始時刻です。
  • intervalEndウィンドウの終了時刻です。
  • repeats: true毎日繰り返すという意味です。
  • DeviceActivityCenter監視の開始と停止を担当します。
  • startMonitoring(_:during:)名前付き監視タスクを登録します。

StoreKit 2 でアプリ内購入とサブスクリプションを簡素化

00:46

要約では、StoreKit 2 はアプリ内サブスクリプション (アプリ内サブスクリプション) を迅速に実装できると述べました。セッションの説明に対応して、StoreKit 2 は、製品の取得、購入の開始、トランザクションの処理、権利と顧客ステータスの決定のための Swift ネイティブ API を提供します。

製品情報を入手するには、直接電話してください。Product.products(for:)

let products = try await Product.products(for: ["fuel.small", "car.sports", "nav.pro"])

// 按类型分组
let consumables = products.filter { $0.type == .consumable }
let nonConsumables = products.filter { $0.type == .nonConsumable }
let subscriptions = products.filter { $0.type == .autoRenewable }

キーポイント:

  • Product.products(for:)製品IDに基づいて製品情報を取得します。
  • try awaitこれがエラーをスローする非同期呼び出しであることを示します。
  • products.filter製品タイプごとにグループ化します。
  • .consumable消耗品です。
  • .nonConsumable非消耗品です。
  • .autoRenewable自動更新可能なサブスクリプションです。

購入プロセスも非同期呼び出しになります。

let result = try await product.purchase()

switch result {
case .success(let verification):
    let transaction = try checkVerified(verification)
    await transaction.finish()
case .userCancelled:
    break
case .pending:
    break
@unknown default:
    break
}

キーポイント:

  • product.purchase()購入を開始します。
  • .success検証結果を返します。
  • checkVerifiedトランザクションが検証されたことを確認するために使用されます。
  • transaction.finish()StoreKitにトランザクション処理が完了したことを伝えます。
  • .userCancelledユーザーが購入をキャンセルしたことを示します。
  • .pendingトランザクションがまだ承認または支払いを待っていることを示します。

Nearby Interaction を使用してサードパーティの UWB アクセサリを接続する

00:50

要約では、Nearby Interaction はサードパーティのアクセサリでも使用できると述べています。セッションの説明に応じて、Nearby Interaction は U1 の超広帯域機能を使用して、近くのデバイスに距離と方向の更新を提供します。

2 台の iPhone 間での基本的なプロセスは、セッションの作成、デリゲートの設定、構成の作成、およびセッションの実行です。

let session = NISession()
session.delegate = self

let configuration = NINearbyPeerConfiguration(peerToken: peerDiscoveryToken)
session.run(configuration)

キーポイント:

  • NISessionNearby Interaction の中心となるオブジェクトです。
  • session.delegate = self近くのオブジェクトの更新を受信します。
  • NINearbyPeerConfiguration同じアプリを実行している 2 台の iPhone の場合。
  • peerDiscoveryTokenピア デバイスからは、独自の接続チャネルを通じて交換する必要があります。
  • session.run(configuration)空間インタラクションを開始します。

実行後、デリゲートは受け取りますNINearbyObject更新します。オブジェクトには距離が含まれており、一部のシーンには方向も含まれています。

func session(_ session: NISession, didUpdate nearbyObjects: [NINearbyObject]) {
    guard let nearbyObject = nearbyObjects.first else { return }

    let distance = nearbyObject.distance
    let direction = nearbyObject.direction
}

キーポイント:

  • session(_:didUpdate:)Nearby インタラクションに新しい測定値があるときに発生します。
  • nearbyObjects.first最近更新されたオブジェクトを取得します。
  • distance近くの物体までの距離を表します。
  • direction方向情報を表します。可用性はデバイスとシナリオによって異なります。

重要ポイント

1. 周囲の音のリマインダーを作成する

  • 機能: ドアベル、犬の吠え声、赤ちゃんの泣き声を認識し、Apple Watch または iPhone でアラートを受け取ります。
  • 実行する価値がある理由: Sound Analysis の組み込み分類器は、複数の種類の離散音を識別できるため、モデルのトレーニングのコストを削減できます。
  • 開始方法: 最初に使用しますSNClassifySoundRequest(classifierIdentifier: .version1)[サポート] タブを表示し、マイクのオーディオ ストリームに接続して、信頼性の高い結果を通知に変換します。

2. ビデオ同期応答アプリを作成する

  • 何をすべきか: テレビでコースビデオが再生され、iPad に対応する質問と回答の入力ボックスが自動的に表示されます。
  • 価値がある理由: ShazamKit カスタム ディレクトリは、同じネットワークやプレーヤー インターフェイスに依存せずに、オーディオの場所をコース コンテンツにマップします。
  • 開始方法: ビデオの参照署名を生成し、質問オフセットを保存します。実行時に使用するSHSession音声を一致させ、一致するオフセットを使用して現在の質問を見つけます。

3. 宿題のパターンを実行する

  • 対処方法: お子様が学習アプリの使用時間を完了すると、ゲーム アプリのブロックが自動的に解除されます。
  • 価値がある理由: Screen Time API は、子供のデバイスにスロットルを適用し、デバイス アクティビティ拡張機能を介して使用量のしきい値に対応できます。
  • 開始方法: まずファミリー コントロール機能を申請します。使用AuthorizationCenter認可を要求する。使用DeviceActivityCenterスケジュールを作成します。拡張機能の管理設定を使用してブロック ルールを更新します。

4. 軽量のサブスクリプション関数を作成する

  • 対処方法: コンテンツ アプリに月次サブスクリプションを追加すると、サブスクリプション ユーザーはプレミアム列のロックを解除できます。
  • 実行する価値がある理由: StoreKit 2 は、製品のクエリ、購入、および株式の判断を Swift の非同期/待機プロセスに組み込みます。
  • 開始方法: App Store Connect でサブスクリプション製品を構成します。使用Product.products(for:)アイテムをプルします。電話product.purchase();現在の権利と利益を使用して、高度なコンテンツを表示するかどうかを決定します。

5. アクセサリー探し体験をする

  • 内容: iPhone を UWB 互換アクセサリに向けると、表示距離が変化します。
  • 価値がある理由: Nearby Interaction は、iOS 15 で互換性のあるサードパーティのハードウェアをサポートしており、アプリは空間認識のアップデートを取得できます。
  • 開始方法: Nearby Interaction アクセサリの仕様をお読みください。アプリで作成するNISession;必要な構成データをアクセサリと交換;距離と方向に基づいてインターフェイスを更新します。

関連セッション

コメント

GitHub Issues · utterances