WWDC Quick Look 💓 By SwiftGGTeam
Send communication and Time Sensitive notifications

Send communication and Time Sensitive notifications

元の動画を見る

ハイライト

iOS 15 では、4 つの通知中断レベル (パッシブ、アクティブ、時間重視、クリティカル) と新しい通信通知メカニズムが導入され、メッセージと通話の通知がフォーカスと通知の概要に浸透できるようにするとともに、SiriKit インテントを通じて通知を連絡先やショートカットと深く統合します。

主な内容

通知のビジュアルアップグレード

以前は、通知アクション ボタンにはテキストしかなく、ユーザーは各ボタンの機能を理解するために読む必要がありました。

iOS 15 の通知は、コンテンツとメディアをより重視した新しい外観になっています。アクションボタンにアイコンを付けることができるようになりました。使用UNNotificationActionIconシステムアイコンまたはテンプレートアイコンを作成して、UNNotificationActionコンストラクタ。通知を展開するとボタンの横にアイコンが表示されるので、アクションを一目で識別しやすくなります。

同時に、通知内のアプリケーションアイコンのサイズも大きくなり、高解像度のアイコンを提供する必要があります。

システム管理ツール: 通知の概要と焦点

ユーザーは毎日何十もの通知を受け取り、ロック画面は常に中断されます。iOS 15 では 2 つの管理ツールが導入されています。

通知の概要: アクティブな中断の数を減らすために、事前に設定された時間 (午前 8 時や午後 6 時など) に非緊急通知をバッチで表示できます。概要に含まれる通知は、引き続きロック画面の通知リストに表示されます。開発者が設定できるのは、relevanceScore重要な通知は概要の先頭に置いてください。

フォーカス: ユーザーはアクティビティや時間帯 (仕事、睡眠、読書など) に基づいてフォーカスを設定し、特定のアプリや連絡先のみが中断通知を送信できるようにすることができます。たとえば、仕事のフォーカスでは、メール、メッセージ、同僚からの直接コミュニケーションのみが侵入できます。

中断レベル: 通知を「賢明」にする

以前は、すべての通知は大音量または無音のいずれかであり、その間の状態はありませんでした。iOS 15の導入UNNotificationInterruptionLevel、次の 4 つのレベルに分かれています。

レベル行動浸透の焦点/概要該当するシナリオ
パッシブサイレント配信、画面も着信音もなしいいえレストランのおすすめ、新シリーズ発売
アクティブリング + 明るい画面 (デフォルトの動作)いいえスポーツのスコア、ライブブロードキャストのリマインダー
時間に敏感リング + 明るい画面はい (ユーザーの許可が必要です)アカウントのセキュリティ、荷​​物の配送
クリティカルリング + 明るい画面、バイパスミュートスイッチはい悪天候、警戒警報

パッシブレベルは、「すぐに読む必要はないが、時間があるときに見ておきたい」通知に適しています。Time Sensitive では、ユーザーは Xcode で対応する機能をオンにする必要がありますが、悪用することはできません。ユーザーはアプリケーションの Time Sensitive 権限をオフにすることを選択できます。

通信通知: メッセージ通知をシステム メッセージに近づけます。

人々からのコミュニケーション(電話、メッセージ)は、通常の通知よりも真剣に受け止める必要があります。iOS 15 では、アプリが SiriKit インテントを介して通知を通信通知としてマークできるようになり、次のようなアップグレードされたエクスペリエンスが得られます。

  • 送信者のアバターを表示
  • タイトルと字幕の標準化とローカライゼーション
  • Siri が AirPods、HomePod、CarPlay 上のコンテンツを自動的にアナウンスします
  • フォーカスと通知の概要を理解できる (連絡先とのユーザーの対話履歴に基づく)
  • システムの連絡先と関連付けて、共有シートやスポットライトの提案に表示します

実装は次のとおりですUNNotificationServiceExtensionで、使用するINSendMessageIntentまたはINStartCallIntent通知コンテンツを更新し、インタラクションを寄付します。

##詳細

通知アクションのアイコンを追加

01:57

let likeActionIcon = UNNotificationActionIcon(systemImageName: "hand.thumbsup")
let likeAction = UNNotificationAction(
    identifier: "like-action",
    title: "Like",
    options: [],
    icon: likeActionIcon
)

let commentActionIcon = UNNotificationActionIcon(templateImageName: "text.bubble")
let commentAction = UNTextInputNotificationAction(
    identifier: "comment-action",
    title: "Comment",
    options: [],
    icon: commentActionIcon,
    textInputButtonTitle: "Post",
    textInputPlaceholder: "Type here…"
)

let category = UNNotificationCategory(
    identifier: "update-actions",
    actions: [likeAction, commentAction],
    intentIdentifiers: [],
    options: []
)

キーポイント:

  • UNNotificationActionIconサポート体制 SFシンボル(systemImageName) またはアプリ内テンプレート画像 (templateImageName
  • UNTextInputNotificationActionこれは入力ボックスを使用した操作であり、コメントや返信のシナリオに適しています。
  • 通知を展開すると、アクションボタンの左側にアイコンが表示されます

割り込みレベルの設定

08:19

ローカル通知設定 パッシブレベル:

let content = UNMutableNotificationContent()
content.title = "Passive"
content.body = "I'm a passive notification, so I won't interrupt you."
content.interruptionLevel = .passive

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
let request = UNNotificationRequest(
    identifier: "passive-request-example",
    content: content,
    trigger: trigger
)

プッシュ通知設定 パッシブレベル:

{
    "aps": {
        "alert": {
            "title": "Passive",
            "body": "I'm a passive notification, so I won't interrupt you."
        },
        "interruption-level": "passive"
    }
}

キーポイント:

  • interruptionLevelはいUNMutableNotificationContent新しいプロパティ
  • ペイロードのプッシュに使用されます"interruption-level"キー、値は次のとおりです"passive""active""time-sensitive""critical"
  • 設定されていない場合のデフォルトはactive

一刻を争う通知

11:13

let content = UNMutableNotificationContent()
content.title = "Urgent"
content.body = "Your account requires attention."
content.interruptionLevel = .timeSensitive

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0, repeats: false)
let request = UNNotificationRequest(
    identifier: "time-sensitive-example",
    content: content,
    trigger: trigger
)

プッシュバージョン:

{
    "aps": {
        "alert": {
            "title": "Urgent",
            "body": "Your account requires attention."
        },
        "interruption-level": "time-sensitive"
    }
}

キーポイント:

  • Xcode の署名と機能で時間に敏感な通知をオンにする必要があります
  • 時間に敏感な権限を乱用すると、ユーザーはアプリをオフにすることになります
  • アカウントのセキュリティリマインダー、荷物の配達、薬のリマインダーなど、本当に緊急のシナリオに適しています。

コミュニケーション通知:メッセージ通知

16:08

存在するUNNotificationServiceExtensionプッシュ通知を次の場所で処理します。

func didReceive(
    _ request: UNNotificationRequest,
    withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
) {
    let incomingMessageIntent: INSendMessageIntent = // 从 payload 解析
    let interaction = INInteraction(intent: incomingMessageIntent, response: nil)
    interaction.direction = .incoming
    interaction.donate(completion: nil)

    do {
        let messageContent = try request.content.updating(from: incomingMessageIntent)
        contentHandler(messageContent)
    } catch {
        // Handle error
    }
}

キーポイント:

  • UNNotificationContentProvidingプロトコルはインテントと通知コンテンツをつなぐ架け橋です
  • interaction.direction通知は次のとおりである必要があります.incoming
  • donate()ユーザーが誰と対話しているかを Siri に学習させて、フォーカスペネトレーションの推奨事項を最適化します。

INPersonal と INSendMessageIntent を作成する

18:29

let person = INPerson(
    personHandle: handle,
    nameComponents: nameComponents,
    displayName: displayName,
    image: image,
    contactIdentifier: contactIdentifier,
    customIdentifier: customIdentifier,
    aliases: nil,
    suggestionType: suggestionType
)

let intent = INSendMessageIntent(
    recipients: [person2],
    outgoingMessageType: .outgoingMessageText,
    content: content,
    speakableGroupName: speakableGroupName,
    conversationIdentifier: conversationIdentifier,
    serviceName: serviceName,
    sender: person1,
    attachments: nil
)

let interaction = INInteraction(intent: intent, response: nil)
interaction.direction = .incoming

キーポイント:

  • INPerson各パラメータについて (contactIdentifiercustomIdentifierimageなど)ユーザーエクスペリエンスが向上します
  • conversationIdentifier同じ会話の通知をグループ化するために使用されます
  • 送信者が合格しましたsenderパラメータの指定は通知タイトルに表示されます

発信インテントを寄付する

17:48

ユーザーがアプリケーション内で積極的にメッセージを送信するときは、インテントも寄付する必要があります。

func sendMessage(...) {
    let intent: INSendMessageIntent = // 创建 Intent
    let interaction = INInteraction(intent: intent, response: nil)
    interaction.direction = .outgoing
    interaction.donate(completion: nil)
}

キーポイント:

  • 発信された寄付は、Siri が Focus を通じてどの連絡先を提案するかを決定するのに役立ちます
  • スパム電話による妨害を避けるため、送信された寄付のみが連絡先の提案に使用されます。
  • Info.plist で必須NSUserActivityTypes対応するインテント タイプを追加するか、インテント拡張機能を実装します。

重要ポイント

  1. さまざまなシナリオに適した割り込みレベルを選択します
  • 対処方法: アプリ内のすべての通知を緊急度に応じて分類し、それぞれパッシブ、アクティブ、時間重視に設定します。
  • 実行する価値がある理由: ユーザーが中断される回数を減らし、重要な通知の到着率を高めます。ユーザーは、「賢明な」アプリの通知権限を保持することに積極的です。
  • 開始方法: 既存の通知を監査し、推奨事項と更新カテゴリをパッシブに変更し、セキュリティ リマインダーを時間制限に変更します。エントリーAPIはUNMutableNotificationContent.interruptionLevel
  1. ソーシャル/メッセージング アプリケーションの通信通知を統合
  • やるべきこと: アプリ内のプライベート メッセージ、グループ チャット、通話通知にアバターが表示され、Focus に侵入し、Siri によって通知されるようにします。
  • 実行する価値がある理由: システムレベルのエクスペリエンスがアップグレードされ、ユーザーの認識は明らかです。システム連絡先と統合すると、アプリは共有シートとスポットライトの両方に表示されます
  • 開始方法: 通知サービス拡張機能を追加します。didReceive中国語での使用INSendMessageIntentお知らせ内容を更新します。同時に、フォアグラウンド ユーザーがメッセージを送信するときに送信インテントを寄付します。
  1. relevanceScore を使用して通知概要の並べ替えを最適化します
  • 対処方法: 最も重要な通知が概要の先頭に表示されるように、通知の関連性スコアを設定します。
  • 実行する価値がある理由: 通知の概要では複数の通知が折りたたまれ、スコアの高い通知のみが強調表示されます。
  • 開始方法: 設定UNMutableNotificationContent.relevanceScore、範囲は 0.0 ~ 1.0
  1. 通知アクションのアイコンを追加
  • 何をすべきか: すべてのカスタム通知アクションを SF シンボル アイコンと一致させます。
  • 実行する価値がある理由: アイコンはテキストよりも直感的で、ユーザーは読まなくても操作の意味を識別できます。
  • 開始方法: 作成するUNNotificationActionIcon(systemImageName:)そして通りますUNNotificationActionのコンストラクター

関連セッション

コメント

GitHub Issues · utterances