WWDC Quick Look 💓 By SwiftGGTeam
Apple's privacy pillars in focus

Apple's privacy pillars in focus

元の動画を見る

ハイライト

Apple はプライバシー エンジニアリングを、データ最小化、オンデバイス処理、透明性と制御、セキュリティ保護の 4 つの柱にまとめています。iOS 15 では、これら 4 つの柱に基づいて、CLLocationButton、CloudKit 暗号化フィールド、アプリ プライバシー レポート、iCloud プライベート リレーなどの特定のテクノロジーが導入されています。開発者はこれらの機能を直接採用して、ユーザーの信頼を向上させることができます。

主な内容

データの最小化: ユーザーがオンデマンドで位置情報を共有できるようにします

03:03

多くのアプリは 1 つまたは 2 つの機能についてのみ位置情報を必要としますが、従来のアプローチでは、起動時に 1 回、「使用中」に位置情報の許可を要求します。ユーザーは不信感から拒否する可能性があり、その結果、主要な機能が利用できなくなります。

iOS 15の導入CLLocationButton(現在地を共有ボタン)。ユーザーがボタンをクリックすると、アプリはユーザーがアプリを終了するまで持続する 1 回限りの位置情報アクセス許可を取得します。次回同じボタンをクリックすると、システムはウィンドウをポップアップ表示せず、その場所に直接戻ります。このボタンは背景色、テキストの色、角の丸さをカスタマイズできますが、ユーザーがアクティブにクリックしたことを iOS が確認できるように、十分なサイズとコントラストを維持する必要があります。

この設計により、位置情報の許可が「インストール時の 1 つの大きな決定」から「使用中の複数の小さな決定」に変更され、ユーザーの心理的閾値が下がります。

クライアント側処理: Siri 音声認識は完全にローカライズされています

07:01

音声アシスタントのプライバシーに関する懸念は、主に「自分の声がサーバーにアップロードされるかどうか」に焦点が当てられています。Apple は iOS 12 から Neural Engine をチップに追加し始め、徐々に Siri コンポーネントをデバイスに移行しました。iOS 13ではSiri音声合成の終端化が実現し、iOS 14ではキーボードディクテーションの終端化が実現します。

iOS 15 では最終ステップが完了し、Siri のすべての自動音声認識 (ASR) モデルがデバイス上で実行されます。デフォルトでは、音声リクエストの音声は iPhone または iPad から送信されません。追加の利点は、応答時間が短縮され、一部のリクエストをオフラインで完了できることです。

開発者向けに、iOS 15 の Create ML フレームワークは、iPhone および iPad でのモデルの直接トレーニングもサポートしています。機密データ (写真など) はプロセス全体を通じてデバイス上に残る可能性があり、トレーニングされたパーソナライズされたモデルは現在のユーザーにのみサービスを提供します。

透明性と制御: アプリのプライバシー レポートとアプリのアクティビティの記録

14:44

ユーザーには、アプリが機密データにいつアクセスしたかを知る権利があります。iOS 15 の「アプリのアクティビティを記録」機能は、アプリが位置情報、写真、連絡先などの機密性の高いアクセス許可にアクセスした時刻と、アプリに接続されているすべてのドメイン名を記録する JSON ファイルを生成します。

開発者は、iOS 15 ベータ版でこの機能を有効にして、アプリが実際に期待どおりに動作するかどうかを確認できます。JSON ファイルの構造は次のとおりです。各アクセス イベントには、タイムスタンプ、アクセスされるデータ型、およびアクセスを開始したバンドル ID が含まれます。ドメイン名接続部分は、アプリによって開始されたか Web ページ (WebView) によって開始されたかをマークします。SafariViewController および ASWebAuthenticationSession を介した接続は、Web ページ ソースとして自動的にマークされます。他のサードパーティ コンテンツについては、開発者が手動でタグを付けることができます。

// 在 NSMutableURLRequest 中标记连接来源
let request = NSMutableURLRequest(url: url)
request.mainDocumentURL = mainDocumentURL

// 在 Network 框架的 NWConnection 中标记
// 或在 URLSession 的 convenience 方法中通过 LinkPresentation 和 AVFoundation 标记

キーポイント:

  • mainDocumentURLメインのドキュメント要求とサードパーティのリソース要求を区別するために使用されます。
  • タグなし接続はデフォルトでアプリトラフィックとして分類されます
  • WKWebView は、マークアップの NSURLRequest を渡す新しいメソッドを追加します

アプリのプライバシー レポートは、今後のソフトウェア アップデートでユーザーが利用できるようになります。開発者は現在、アプリのアクティビティの記録を使用して自己チェックを行い、オンラインになった後に予期しない動作がユーザーに発見されるのを回避しています。

セキュリティ保護: CloudKit 暗号化フィールド

23:03

CloudKit は以前、CKAsset の自動暗号化のみを提供していました。iOS 15 ではこの機能が拡張され、文字列、数値、日付、CLLocation、配列をすべて直接暗号化して保存できるようになりました。

// 设备 1:加密后保存到 CloudKit
myRecord.encryptedValues["encryptedStringField"] = "Sensitive value"

// 设备 2:读取后自动解密
let decryptedString = myRecord.encryptedValues["encryptedStringField"] as? String

キーポイント:

  • encryptedValuesこれは CKRecord の新しい属性であり、その使用法は通常のフィールドと同じです。
  • 暗号化はデバイス上で行われ、キーマテリアルは iCloud キーチェーンに保存されます
  • CloudKit共有機能をサポートし、CKShareの参加者のみが関連フィールドを復号化できます
  • CKAsset はデフォルトで暗号化されており、encryptedValue に再度設定することはできません
  • サーバーは参照関係を確認する必要があるため、CKReference は暗号化できません

iCloud プライベート リレー: ネットワーク レベルのプライバシー保護

24:29

Private Relayは、「Webサイトやネットワークプロバイダーがユーザーの閲覧行動を追跡する」という問題を解決するiCloud+の新サービスです。その中心的な設計は次のとおりです。単一のエンティティ (Apple を含む) は、「あなたが誰であるか」と「どの Web サイトにアクセスしたか」を同時に知ることはできません。

この実装は、ランダムに選択された 2 つのリレー サーバーに依存します。

  • Ingress Proxy: ユーザーの実際の IP アドレスは知っていますが、ターゲット Web サイトを参照することはできません。IP アドレスを大まかな地理的エリア (「カリフォルニア州ベイエリア」など) に変換します。
  • 出力プロキシ: ターゲット Web サイトは認識されますが、ユーザーの実際の IP は確認できません。入力プロキシによって提供される地理的エリアから IP アドレスをランダムに選択します。

接続では複数の暗号化層が使用され、各層は対応する中継サーバーによって暗号化されます。デバイスは、完全な情報を確認できる唯一のノードです。アクセス トークンは RSA Blinded Signatures を通じて生成され、デバイスはアカウント情報を公開することなくネットワーク アクセスを利用できます。

ユーザーは、設定で 2 つの IP アドレスの精度から選択できます。サイトがローカライズされたコンテンツを提供できるようにする「おおよその位置を保持する」か、匿名性を高めるために「国とタイムゾーンのみを使用する」です。

##詳細

CLLocationButton の使用

04:49

import CoreLocationUI

struct ContentView: View {
    @StateObject var locationManager = LocationManager()

    var body: some View {
        LocationButton(.shareCurrentLocation) {
            locationManager.requestLocation()
        }
        .cornerRadius(8)
        .labelStyle(.titleAndIcon)
    }
}

キーポイント:

  • LocationButtonSwiftUI専用のコンポーネントであり、UIKitにも対応したバージョンがあります。
  • .shareCurrentLocationシステム定義のボタン セマンティクスですか
  • ボタンの外観はカスタマイズできますが、システムはクリックの信頼性を検証します (プログラムによるトリガーを防ぐため)。
  • watchOS、iOS、iPadOS、macOS Catalystをサポート

アプリのネットワーク動作を確認する

16:59

import Network

// 标记第三方内容连接
let connection = NWConnection(host: "cdn.example.com", port: .https, using: .tls)

// 在 NSMutableURLRequest 中手动标记
let request = NSMutableURLRequest(url: thirdPartyContentURL)
request.mainDocumentURL = mainPageURL

キーポイント:

  • mainDocumentURLヘルプ システムはコア機能とサードパーティのコンテンツを区別します
  • SafariViewController および ASWebAuthenticationSession への接続は、Web ページ ソースとして自動的にマークされます
  • アプリアクティビティの記録の JSON 出力を定期的に確認して、予期しない接続がないことを確認します。

CloudKit 暗号化フィールドの完全なプロセス

23:44

import CloudKit

// 保存加密数据
let record = CKRecord(recordType: "PatientData")
record.encryptedValues["ssn"] = "123-45-6789"
record.encryptedValues["notes"] = "Confidential medical notes"

let container = CKContainer.default()
let database = container.privateCloudDatabase

do {
    let savedRecord = try await database.save(record)
    print("Encrypted record saved")
} catch {
    print("Save failed: \(error)")
}

// 读取加密数据
let query = CKQuery(recordType: "PatientData", predicate: NSPredicate(value: true))
let (matchResults, _) = try await database.records(matching: query)

for (recordID, result) in matchResults {
    switch result {
    case .success(let record):
        let ssn = record.encryptedValues["ssn"] as? String
        print("Decrypted SSN: \(ssn ?? "N/A")")
    case .failure(let error):
        print("Fetch error: \(error)")
    }
}

キーポイント:

  • encryptedValues読み取りおよび書き込みの構文は、通常のフィールドの構文とまったく同じです。
  • 暗号化/復号化は CloudKit によって自動的に処理されるため、開発者はキーを管理する必要がありません
  • 有効な iCloud ログインステータスが必要です (CKAccountStatus.available
  • 新しいステータスtemporarilyUnavailableアカウントはログインしているが準備ができていないため、ユーザーがセットアップの検証に進む必要があることを示します。

重要ポイント

1. LocationButton を使用して位置情報の許可プロセスを再構築する

アプリが特定のページ (地図の注釈、近くのお店など) でのみ位置情報を必要とする場合は、起動時の位置許可リクエストをページ内の位置許可リクエストに置き換えます。CLLocationButton。ユーザーがボタンをクリックしたときにのみ位置情報が要求されると、承認率が大幅に向上することがよくあります。

開始方法: ページの必要な場所に配置しますLocationButton、 取り除くInfo.plistNSLocationWhenInUseUsageDescriptionポップアップの依存関係。ユーザーの最初のクリックとその後のクリックの間のフローの違いをテストします。

2. CloudKit で機密データの暗号化フィールドを有効にする

CloudKit に保存されている個人識別情報 (PII)、医療記録、財務データは、次のものを使用する必要があります。encryptedValues。コストはほぼゼロですが、プライバシーの確保は桁違いに高くなります。

開始方法: 既存の CloudKit データ モデルを監査して、機密フィールドを特定します。意思record["field"]と置き換えますrecord.encryptedValues["field"]。CloudKit コンソールで、フィールド タイプに「暗号化文字列」などのプレフィックスが付いていることを確認します。

3. アプリのアクティビティの記録を CI プロセスに統合する

各リリースの前に、アプリの記録アクティビティを開始し、コア ユーザー プロセスを実行して、生成された JSON に予期しないアクセス許可またはドメイン名接続がないかどうかを確認します。これにより、SDK の隠れた動作を事前に検出できます。

開始方法: テスト デバイスで [設定] > [プライバシー] > [アプリのアクティビティの記録] をオンにし、アプリのコア シナリオを実行して、JSON ファイルをエクスポートします。診るaccessedDataそしてnetworkActivityすべてのアクセスが予想範囲内であることを確認します。

4. メールのプライバシー保護を適応させ、自分のメールを非表示にする

アプリがマーケティング電子メールを送信する場合、iOS 15 のメール プライバシー保護によりリモート画像がプリロードされ、開封率統計に歪みが生じることに注意してください。IP アドレスとデバイス情報も信頼できなくなります。同時に、ユーザーは Hide My Email によって提供されるランダムな電子メール アドレスを使用して登録することができます。電子メール アドレスが実際の身元に関連付けられるとは考えないでください。

開始方法: 電子メール マーケティング データへの依存度を見直し、開封率ピクセル トラッキングへの依存度を減らします。ユーザー登録の際、実名や連絡先が必要な場合は、その目的を明記の上、別途ご請求ください。

関連セッション

コメント

GitHub Issues · utterances