Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

Sansan iOSアプリにおけるPrivacy Manifests対応の詳細と詰まったこと

こんにちは、技術本部 Mobile Applicationグループで iOSアプリケーション開発しています。武田です。

2月29日にAppleから発表がありました。それは5月1日からPrivacy Manifestsに対応していないアプリはアップデートができなくなる、という内容です。これに向け、営業DXサービス「Sansan」のiOSアプリでもPrivacy Manifestsに対応中です。本記事ではその対応の詳細と対応中に詰まったことをご紹介します。

やることは大きく次の2つです。

1. アプリでPrivacy Manifests対応をする
2. サードパーティSDKをPrivacy Manifests対応バージョンに上げる*1

Privacy Manifests対応で何をするのか、その調査に関しては以前投稿した記事をご参照ください。
buildersbox.corp-sansan.com

それぞれ詳しく解説します。

アプリでPrivacy Manifests対応をする

App Store Connectの情報を元に PrivacyInfo.xcprivacyファイルを追加します。*2*3

App Storeのアプリのプライバシー

追加したPrivacyInfo.xcprivacyファイルが意図に沿っているかは、Xcode15で作成できるPrivacy reportによって確認できます。*4

Privacy reportにはサードパーティSDKが記載する内容も含まれるため注意が必要です。PrivacyInfo.xcprivacyファイルにはドキュメントのImportantに記載されているようにサードパーティSDKが記載する分はアプリに記載する必要はありません。アプリ内で当てはまる項目のみを記載し、確認の時にはPrivacy reportのサードパーティSDK分を無視して行うとスムーズです。

Privacy reportの例

Get started with privacy manifests - WWDC23 - Videos - Apple Developerより

対応に漏れがないかはApp Store ConnectにアップロードするとAppleからメールが届くのでその内容から確認できます。*5

詰まったこと1

PrivacyInfo.xcprivacyファイル の定義内容がPrivacy reportに反映されないことがありました。

解決策

PrivacyInfo.xcprivacyファイルをアプリのTarget Membershipに入れていないことが原因でした。インスペクターのTarget Membershipのチェックボックスを利用して追加し解決しました。

詰まったこと2

PrivacyInfo.xcprivacyファイルの作成作業の中で Privacy Tracking Enabled がNOの場合 Privacy Tracking Domains にkeyを追加するか迷いました。

解決策

最終的には、Developer Forumsの回答を参考に、それらは追加しないことに決定しました。

サードパーティSDKをPrivacy Manifests対応バージョンに上げる

この対応ではさらにタスクを分解しました。大きく次の3つです。

  • Privacy Manifests対応済みのSDK
  • Privacy Manifests対応の見込みがないSDK
  • Privacy Manifests対応中のSDK

Privacy Manifests 対応済みのSDK

Privacy Manifests対応済みのSDKは、各SDKの対応バージョンにアップデートを行います。

詰まったこと

一部のSDKではパッケージマネジャーによって、PrivacyInfo.xcprivacyファイルがアプリ側にコピーされないことがありました。

解決策

パッケージマネジャー毎にリソースの扱い方が異なるために発生していました。SDK側でパッケージマネジャー毎に適切にリソース設定することで解決可能です。*6

具体的にSDK側でどのような対応が必要なのか、代表的な3つのパッケージマネージャのCarthage・CocoaPods・Swift Package Managerで説明します。説明の例として次のようなディレクトリで構成されたTestFrameworkを利用します。

TestFramework
 ├ Sources/
 |  └ PrivacyInfo.xcprivacy
 ├ Package.swift
 └ TestFramework.podspec

Carthage

プロジェクトの各ターゲットでCopy Bundle ResourcesにPrivacyInfo.xcprivacyファイルを登録しておく必要があります。

Copy Bundle ResourceにPrivacyInfo.xcprivacyファイルを登録

Cocoa Pods

.podspecファイルにresource_bundleの設定が必要です。他と同じリソースバンドル名を指定すると正しく読み込めなくなるので注意が必要です。

Pod::Spec.new do |s|
  ...
  s.resource_bundle = { 'TestFramework_PrivacyManifest' => 'Sources/PrivacyInfo.xcprivacy' }
end

Swift Package Manager

Package.swiftファイルにresourcesの設定が必要です。例はprocessを指定していますが、プロジェクトの状況に応じて、リソースをそのままにしておく必要がある場合、または特定のフォルダー構造を保持する必要がある場合はcopyを利用します。

import PackageDescription

let package = Package(
    ...
    targets: [
        .target(
	   ...
            resources: [.process("Sources/PrivacyInfo.xcprivacy")]
            ),
	   ...
    ],
    ...
)

Privacy Manifests対応の見込みがないSDK

Sansan iOSアプリの中でメンテナンスが止まっているSDKがいくつかありました。具体的な対応をはじめるに当たっていくつかの方針を立てました。

  • 方針A 当該SDKの機能をアプリで実装し、アプリのPrivacy Manifestsに必要な設定を追加する
  • 方針B Privacy Manifests追加済みの代替SDKを探し、乗り換える
  • 方針C 使用中のSDKをライセンスに違反しない形でアプリへ取り込み、SDKに PrivacyInfo.xcprivacyファイルを追加する

方針C を選択しました。*7

アップデート不可の影響が大きく最短で完了させたい本対応は、方針A、方針Bに比べ実装とテストの工数が小さく済む方針Cが適切だと考えたためです。

詰まったこと

方針Cの対応について、詰まったことは特にありませんでしたが、方針CにはメンテナンスされていないSDKを使い続けてしまうリスクがあるので、並行して方針A、方針Bへの移行を進めています。

Privacy Manifests対応中のSDK

Sansan iOSアプリの中でPrivacy Manifests対応中のSDKが一部あり、アップデートを日々監視しています。余裕を持ってリリースできるよう、対応済みのSDK分は先にテストを進め、対応中のSDKはアップデートされ次第個別にテストを行います。

詰まったこと

計画時に対応中のSDKをいつまで監視するかというところが議論になりました。

解決策

対応中のSDKを仮に取り込んだ場合*8を想定し、逆算してデッドラインを設けました。

おわりに

Sansan iOSアプリにおけるPrivacy Manifests対応の詳細と詰まったことを紹介しました。全体を通して順調に進行しており、4月中旬にすべての作業が終わる予定です。スケジュールはタイトですが、無事5月1日に間に合う見込みです。

この記事がアプリ開発者の皆さまの役に立てれば幸いです。

仲間募集中!

共にSansan / Eight のモバイルアプリ開発していく仲間を募集中です! 選考評価無しで現場のエンジニアのリアルな声が聞けるカジュアル面談もあるので、ご興味ありましたらぜひ面談だけでもお越しいただけたら幸いです!

open.talentio.com

20240312182329

20240315190344

*1: Appleの発表によると対象は 一般的に使用されているサードパーティSDKです。しかしアップデート不可になってしまうというリスクの大きさから、Developer Forums でのDTSエンジニアの回答を参考に、全てのサードパーティSDKに対応する方針を採りました。

*2:1C8F.1といった一部のNSPrivacyAccessedAPITypeReasonsはXcodeのUI上に表示されない場合があります。その時は文字列として直接指定します。 Privacy Accessed API reason 1C8F.1… | Apple Developer Forums

*3:プロジェクト生成ツールを利用している場合はPrivacyInfo.xcprivacyファイルを設定ファイルに記載しておきます。

*4:Privacy reportはDescribing data use in privacy manifestsに関する出力のためDescribing use of required reason APIへの対応の確認にはならないので注意が必要です。

*5:Sansan iOSアプリではDescribing use of required reason APIに関する注意のみの内容のメールでした。Describing data use in privacy manifestsへの対応の確認にはならない可能性があります。

*6:注意としてアプリ側では適用できない対策になります。Sansan iOSアプリにおける具体的な対応方針としては次で説明する「Privacy Manifests対応の見込みがないSDK」と重なる内容のため割愛します。

*7:具体的な作業内容は「Privacy Manifests対応済みのSDK」で紹介した方法と同じのため割愛します。

*8:「Privacy Manifests 対応の見込みがない SDK」の方針Cと同じ対策です。

© Sansan, Inc.