35 lines
3 KiB
HTML
35 lines
3 KiB
HTML
<!doctype html>
|
|
<!-- MODELED, not recorded: a sanitized stand-in for App Store Connect > App Privacy, written from Apple's public help
|
|
pages "Manage app privacy" and "App privacy details on the App Store" (collect yes / no, data types, per type:
|
|
purposes, linked to the user, tracking; Next / Save / Publish). The console's exact wording may differ. -->
|
|
<html lang="en"><head><meta charset="utf-8"><title>App Privacy - App Store Connect</title><script src="_common.js"></script></head>
|
|
<body>
|
|
<h1>App Privacy</h1> <button type="button">Publish</button>
|
|
<div role="dialog" aria-label="Data Collection" data-step>
|
|
<label><input type="radio" name="c"> Yes, we collect data from this app</label>
|
|
<label><input type="radio" name="c"> No, we do not collect data from this app</label>
|
|
<button type="button">Cancel</button> <button type="button">Next</button>
|
|
</div>
|
|
<div role="dialog" aria-label="Data Collection" data-step hidden><div id="types"></div><button type="button">Back</button> <button type="button">Save</button></div>
|
|
<div data-step hidden id="per"></div>
|
|
<script>
|
|
const TYPES = ['Name', 'Email Address', 'Phone Number', 'Physical Address', 'Other User Contact Info', 'Health', 'Fitness', 'Payment Info', 'Credit Info',
|
|
'Other Financial Info', 'Precise Location', 'Coarse Location', 'Sensitive Info', 'Contacts', 'Emails or Text Messages', 'Photos or Videos', 'Audio Data',
|
|
'Gameplay Content', 'Customer Support', 'Other User Content', 'Browsing History', 'Search History', 'User ID', 'Device ID', 'Purchase History',
|
|
'Product Interaction', 'Advertising Data', 'Other Usage Data', 'Crash Data', 'Performance Data', 'Other Diagnostic Data', 'Environment Scanning', 'Hands',
|
|
'Head', 'Other Data Types'];
|
|
for (const t of TYPES) { const l = document.createElement('label'); l.innerHTML = '<input type="checkbox"> '; l.append(t); document.getElementById('types').append(l); }
|
|
const PURPOSES = ['Third-Party Advertising', "Developer's Advertising or Marketing", 'Analytics', 'Product Personalization', 'App Functionality', 'Other Purposes'];
|
|
for (const t of ['Device ID', 'Crash Data']) {
|
|
const d = document.createElement('div'); d.setAttribute('role', 'dialog'); d.setAttribute('aria-label', t);
|
|
d.innerHTML = PURPOSES.map(p => `<label><input type="checkbox"> ${p}</label>`).join('') +
|
|
`<label><input type="radio" name="l${t}"> Yes, ${t} collected from this app is linked to the user's identity</label>` +
|
|
`<label><input type="radio" name="l${t}"> No, ${t} collected from this app is not linked to the user's identity</label>` +
|
|
`<label><input type="radio" name="t${t}"> Yes, we use ${t} for tracking purposes</label>` +
|
|
`<label><input type="radio" name="t${t}"> No, we do not use ${t} for tracking purposes</label><button type="button">Save</button>`;
|
|
d.hidden = t !== 'Device ID'; document.getElementById('per').append(d);
|
|
}
|
|
// the owner opens another data type
|
|
window.__type = t => document.querySelectorAll('#per [role=dialog]').forEach(d => { d.hidden = d.getAttribute('aria-label') !== t; });
|
|
</script>
|
|
</body></html>
|