メインコンテンツまでスキップ

6. DRM ライセンス更新

お知らせ

このドキュメントは機械翻訳で作成された下書きであり、現在レビュー中です。機械翻訳の特性上、一部の内容が不正確であったり、韓国語の原文と異なる場合があります。より正確な情報については、韓国語のドキュメントをご参照ください。

オフラインストレージに保管されたダウンロードコンテンツの DRM 失効の有無を判別し、失効した権限をリアルタイムまたは一括で安全に更新する方法を説明します。

このドキュメントのすべてのサンプルコードは、公式サンプルアプリ kollus_player_ios をもとに作成されています。


ライセンス失効の確認

コンテンツオブジェクトの DRM 失効状態を事前にチェックし、更新プロセスへの移行を判断するための基準コードです。

func isExpired(_ c: KollusContent) -> Bool {
return c.DRMExpired
|| (c.drmTotalExpirePlayTime > 0 && c.DRMExpirePlayTime <= 0)
|| (c.drmExpireCountMax > 0 && c.drmExpireCount <= 0)
}

ライセンス一括更新 API

updateDownloadDRMInfo メソッドを使用すると、ストレージに登録されたコンテンツの DRM ライセンスを一度に一括更新できます。

func renewDRMContents(isAll: Bool) {
storage.updateDownloadDRMInfo(isAll)
}

パラメーター仕様

パラメーター説明
isAll = trueSDK に登録されたすべてのダウンロードコンテンツのライセンス更新を試みます。
isAll = false失効済みまたは間もなく失効予定のコンテンツのみを選択して更新を試みます。

メソッドが呼び出されると、注入されたデリゲートコールバックループ(kollusStorage(_:cur:count:error:))を通じて、現在何番目の項目が処理中かを含む全体の進捗状況がアプリケーションレイヤーに通知されます。


バックグラウンド更新の制約事項

iOS はバックグラウンド実行時間に厳格な制約(Background Execution Limits)があるため、アプリが画面から離れた状態でライセンス更新を完全に実行することは保証できません。 安定した連携のために、以下のパターンを推奨します。

  • フォアグラウンド復帰のタイミングを活用: ユーザーがアプリを再起動または再アクティブ化するタイミングである applicationDidBecomeActive の進入時点に合わせて呼び出します。
  • 再生直前のタイミングを活用: ユーザーがダウンロードコンテンツを再生する直前に同期(Sync)方式で API を呼び出す構造が、最も確実で安定しています。
連携上の注意事項

BGTaskScheduler コンポーネントを活用して定期的なバックグラウンドタスクとして登録することも技術的には可能ですが、iOS オペレーティングシステムの特性上、正確な実行タイミングは保証されません。 また、storage.setBackgroundDownload(true) の設定は純粋なファイルダウンロードタスクをバックグラウンドで継続させるオプションに過ぎず、ライセンス交換および更新プロセスのバックグラウンド実行を保証するものではない点にご注意ください。


ネットワーク復旧後の自動更新

公式サンプルアプリは、ネットワーク復旧時のライセンス自動更新ロジックを別途内蔵していません。 商用サービス開発時には、以下のフローで例外処理コードを実装することを推奨します。

  1. Apple システムフレームワークである NWPathMonitor を活用して、デバイスのネットワーク復旧タイミングをリアルタイムで検知します。
  2. ユーザーがオフライン保管庫で再生ボタンを押したタイミングで、対象コンテンツの失効チェック関数を実行します。
  3. 失効が確認されたら即座に updateDownloadDRMInfo(false) メソッドを同期呼び出しし、ライセンス更新を完了してから再生します。

ライセンス更新失敗時の例外処理

サーバー障害やネットワーク瞬断によりライセンス更新が最終的に失敗した場合、SDK は注入されたデリゲートプロトコルの以下 2 つのメソッドのいずれかを通じて例外を通知します。

func kollusStorage(_ storage: KollusStorage,
request: [AnyHashable: Any],
json: [AnyHashable: Any]?,
error: Error?) {
if let error = error {
// Renewal failed or forced expiration
}
}

func kollusStorage(_ storage: KollusStorage,
cur: Int32, count: Int32,
error: Error?) {
// Error occurred during bulk renewal; the affected item failed
}
更新失敗時の UX 推奨事項

ライセンス更新失敗のシグナルが検知された場合、画面に「ライセンスの更新に失敗しました。ネットワークの状態を確認するか、コンテンツを再ダウンロードしてください。」という例外メッセージを表示し、 ユーザーの選択に応じて 再試行 / 再ダウンロード / カスタマーサポート の UI 分岐に接続することが最善です。詳細なコールバックの種類については、8. ダウンロードイベント/コールバック ドキュメントを参照してください。