Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions docs/AccountDeletion-en.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ These are the steps to delete your Signalarm account (provider: bannzai) and the
1. Open Signalarm and open "Settings"
2. Select "Delete Account"
3. Confirm and execute the deletion on the confirmation screen
4. If Sign in with Apple is linked, you are asked to authenticate with Sign in with Apple before deletion. After you authenticate, the Apple token is revoked and then the account is deleted. If you close the authentication sheet, or if revoking the token fails, the account is not deleted<!-- source: Alarmify/Account/AccountSession.swift: deleteAccount() runs revokeAppleToken() (a fresh Sign in with Apple to obtain an authorization code, then Auth.auth().revokeToken(withAuthorizationCode:)) when appleIDLinked before calling apiClient.deleteAccount(), and throws without deleting when revocation fails. Alarmify/Settings/SettingsView.swift: ASAuthorizationError.canceled from the closed sheet is treated as the deletion being abandoned -->

Deletion is performed immediately and cannot be undone.

Expand All @@ -16,14 +17,14 @@ If you cannot use the app, send an email to bannzai.app@gmail.com stating that y

## Data That Is Deleted

- Account identifier (anonymous user ID)
- Account identifier (the anonymous user ID, or the user ID of the account when Sign in with Apple is linked; a linked Apple token is revoked)
- Issued API Tokens (after deletion, all calls from external services are rejected)
- Device information (device token, device type, OS and app versions)
- History of alarm requests (sender, date and time, title, delivery results)

## Data Retained After Deletion and Retention Periods

- The purchase history of in-app purchases is retained by RevenueCat, Inc. and Apple Inc. in accordance with each company's policy, for payment processing and refund handling. The purchase information held by the Provider is linked only to anonymous identifiers, and the linkage is removed when the account is deleted
- The purchase history of in-app purchases is retained by RevenueCat, Inc. and Apple Inc. in accordance with each company's policy, for payment processing and refund handling. Because the account identifier of the Service is registered with RevenueCat as the purchaser identifier, the purchase history remains with RevenueCat, Inc. linked to the identifier of the deleted account. The paid plan status stored on the Provider's servers is deleted together with the account<!-- source: Alarmify/Features/Purchase/ProEntitlement.swift: Purchases.logIn is called with the Firebase Auth uid, which becomes the RevenueCat App User ID. firebase/functions/src/account/deleteAccount.ts: deleteUserAccount removes users/{uid} (including plan) with recursiveDelete and does not delete the RevenueCat customer -->
- Inquiry emails are retained as a record of the response for one year from receipt, and are then deleted
- Deleted data included in server backups is erased through backup rotation within a maximum of 30 days after deletion
- A record used to confirm that the deletion has completed (the account identifier only; it contains no other data) is normally erased automatically within 3 hours after deletion (if a cleanup run fails, it is retried every hour and the record is erased once a run succeeds)
Expand Down
5 changes: 3 additions & 2 deletions docs/AccountDeletion-ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Signalarm(提供者: bannzai)のアカウントと、提供者のサーバ
1. Signalarm を開き、「設定」を開きます
2. 「アカウントを削除」を選びます
3. 確認画面で削除を実行します
4. Sign in with Apple を連携している場合は、削除の前に Sign in with Apple の認証を求められます。認証すると、Apple のトークンを失効させてからアカウントを削除します。認証の画面を閉じた場合や、トークンの失効に失敗した場合、アカウントは削除されません<!-- source: Alarmify/Account/AccountSession.swift: deleteAccount() は appleIDLinked なら revokeAppleToken() (Sign in with Apple をやり直して authorization code を受け取り Auth.auth().revokeToken(withAuthorizationCode:)) を済ませてから apiClient.deleteAccount() を呼び、失効に失敗したらエラーを投げて削除に進まない。Alarmify/Settings/SettingsView.swift: シートを閉じた ASAuthorizationError.canceled は削除をやめたものとして扱う -->

削除は即時に実行され、取り消せません。

Expand All @@ -16,14 +17,14 @@ Signalarm(提供者: bannzai)のアカウントと、提供者のサーバ

## 削除されるデータ

- アカウント識別子(匿名ユーザー ID)
- アカウント識別子(匿名ユーザー ID、または Sign in with Apple を連携した場合のユーザー ID。連携している Apple のトークンは失効させます)
- 発行済みの API トークン(削除後は外部サービスからの呼び出しがすべて拒否されます)
- 端末情報(デバイストークン、端末種別、OS・アプリのバージョン)
- アラーム要求の履歴(送信元、日時、タイトル、配送結果)

## 削除後に保持されるデータと保持期間

- アプリ内購入の購入履歴は、決済処理と返金対応のため RevenueCat, Inc. および Apple Inc. が各社のポリシーに基づき保持します。提供者側の購入情報は匿名の識別子に紐づくもののみで、アカウント削除時に紐付けを解除します
- アプリ内購入の購入履歴は、決済処理と返金対応のため RevenueCat, Inc. および Apple Inc. が各社のポリシーに基づき保持します。RevenueCat には本サービスのアカウント識別子を購入者の識別子として登録しているため、購入履歴は削除したアカウントの識別子に紐づいたまま RevenueCat, Inc. に残ります。提供者のサーバーに保存している有料プランの状態は、アカウントと一緒に削除します<!-- source: Alarmify/Features/Purchase/ProEntitlement.swift: Purchases.logIn に Firebase Auth の uid を渡し RevenueCat の App User ID にしている。firebase/functions/src/account/deleteAccount.ts: deleteUserAccount は users/{uid} (plan を含む) を recursiveDelete で消し、RevenueCat 側の顧客は削除しない -->
- お問い合わせのメールは、対応の記録として受信から 1 年間保持した後に削除します
- サーバーのバックアップに含まれる削除済みデータは、削除から最大 30 日でバックアップの世代交代により消去されます
- 削除処理の完了を確認するための記録 (アカウント識別子のみ。他のデータは含みません) は、通常は削除から 3 時間以内に自動的に消去されます (消去処理が失敗した場合は 1 時間ごとに再試行し、成功した時点で消去されます)
Expand Down
9 changes: 6 additions & 3 deletions docs/PrivacyPolicy-en.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@ In this Policy, "user information" means information relating to the identificat
### Information Collected by the Provider
In order to deliver requests sent from external services to the user's device and register alarms, the Service collects and stores the following information on the Provider's servers (Firebase / Google Cloud provided by Google LLC; data is stored in a region in Japan).

- **Account identifier**: An anonymous user ID automatically issued when the app is first launched
- **Account identifier**: An anonymous user ID automatically issued when the app is first launched, or the user ID of the account when Sign in with Apple is linked. When Sign in with Apple is linked, the only information received from Apple Inc. is the Apple user identifier; the email address and name are neither requested nor stored<!-- source: Alarmify/Account/AccountSession.swift: prepare(appleIDRequest:) sets requestedScopes = [], so the identity token carries no email address or name and Firebase Auth holds only the Apple user identifier (documents/app-privacy.md) -->
- **API Token**: A token issued by the user to call the Service from external services. Only a hashed value is stored on the Provider's servers
- **Device information**: The device token required to deliver push notifications, the device type, the OS version, and the app version, and a Firebase App Check token used to verify that requests originate from this app
- **Alarm requests**: The date and time, title, and sender identifier of alarms sent from external services, and the results of delivery and registration. Alarm titles include text set by the user or by an external service linked by the user. This information is automatically deleted 30 days after transmission
- **Inquiry information**: The contact information and content of an inquiry when a user makes an inquiry by email or from within the app

### Information Collected by External Services
The Service uses RevenueCat, provided by RevenueCat, Inc., to manage purchase status of paid services and to process payments. RevenueCat collects purchase information (such as purchased products, purchase date and time, and anonymous device identifiers). The collected information is managed in accordance with the privacy policy of RevenueCat, Inc. (https://www.revenuecat.com/privacy).
The Service uses RevenueCat, provided by RevenueCat, Inc., to manage purchase status of paid services and to process payments. RevenueCat collects purchase information (such as purchased products, purchase date and time, and the account identifier of the Service).<!-- source: Alarmify/Features/Purchase/ProEntitlement.swift: Purchases.logIn is called with the Firebase Auth uid (the account identifier), which becomes the RevenueCat App User ID --> The collected information is managed in accordance with the privacy policy of RevenueCat, Inc. (https://www.revenuecat.com/privacy).

For the optional authentication that lets multiple iPhones be used under a single account, the Service uses Sign in with Apple provided by Apple Inc. As described above, the only information received from Apple Inc. when linking is the Apple user identifier. Apple Inc. handles information in accordance with Apple's privacy policy (https://www.apple.com/legal/privacy/).

The Service uses the Apple Push Notification service of Apple Inc. and Firebase Cloud Messaging of Google LLC to deliver push notifications. Payments for in-app purchases are processed by Apple Inc. The Provider does not obtain payment information such as credit card details.

Expand All @@ -27,6 +29,7 @@ The specific purposes of use of user information are as follows:

- To deliver requests from external services to the user's device and to register, update, and cancel alarms
- To authenticate API Tokens, prevent unauthorized use, and determine limits on the number of uses (such as the limits of the free plan)
- To identify and authenticate the user's account (including combining multiple iPhones into a single account through Sign in with Apple)
- To provide, maintain, protect, and improve the Service, including confirming and restoring purchase status of paid services
- To provide information about the Service and respond to inquiries
- To respond to acts that violate the Provider's terms, policies, or other rules regarding the Service
Expand All @@ -43,7 +46,7 @@ The Provider will not provide personal information among user information to thi
## Disclosure, Correction, Suspension of Use, and Deletion of Personal Information
When the Provider is requested by a user to disclose, correct, suspend the use of, or delete personal information based on the provisions of the Personal Information Protection Act, the Provider will respond without delay after confirming that the request is made by the user themselves (if such personal information does not exist, the Provider will notify the user to that effect). However, this does not apply where the Provider is not obligated to do so under the Personal Information Protection Act or other laws and regulations.

You can delete your account from the settings screen in the app. When you delete your account, your account identifier, API Tokens, device information, and the history of alarm requests are deleted from the Provider's servers. For details of the procedure, see "[How to Delete Your Account and Data](./AccountDeletion-en)".
You can delete your account from the settings screen in the app. When you delete your account, your account identifier, API Tokens, device information, and the history of alarm requests are deleted from the Provider's servers. If Sign in with Apple is linked, you are asked to authenticate with Sign in with Apple before deletion, and after authentication the Apple token is revoked before the account is deleted.<!-- source: Alarmify/Account/AccountSession.swift: deleteAccount() runs revokeAppleToken() (a fresh Sign in with Apple to obtain an authorization code, then Auth.auth().revokeToken(withAuthorizationCode:)) when appleIDLinked, before calling apiClient.deleteAccount() --> For details of the procedure, see "[How to Delete Your Account and Data](./AccountDeletion-en)".

## Contact
For opinions, questions, complaints, and other inquiries regarding the handling of user information, please contact:
Expand Down
9 changes: 6 additions & 3 deletions docs/PrivacyPolicy-ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@ bannzai(以下「提供者」といいます。)は、提供者の提供す
### 提供者が収集する情報
本サービスは、外部のサービスから送信されたリクエストをユーザーの端末に配送してアラームを登録するため、以下の情報を提供者のサーバー(Google LLC が提供する Firebase / Google Cloud。データの保存先は日本のリージョンです。)で収集・保管します。

- **アカウント識別子**: アプリの初回起動時に自動で発行される匿名のユーザー ID
- **アカウント識別子**: アプリの初回起動時に自動で発行される匿名のユーザー ID、または Sign in with Apple を連携した場合のユーザー ID。Sign in with Apple の連携時に Apple Inc. から受け取るのは Apple のユーザー識別子のみで、メールアドレスおよび氏名は要求も保存もしません<!-- source: Alarmify/Account/AccountSession.swift: prepare(appleIDRequest:) が requestedScopes = [] にしているため identity token にメールアドレス・氏名が含まれず、Firebase Auth が保持するのは Apple のユーザー識別子だけ (documents/app-privacy.md) -->
- **API トークン**: 外部サービスから本サービスを呼び出すためにユーザーが発行するトークン。提供者のサーバーにはハッシュ化した値のみを保存します
- **端末情報**: プッシュ通知の配送に必要なデバイストークン、端末の種別、OS のバージョン、アプリのバージョン、および本アプリからのリクエストであることを検証するための Firebase App Check のトークン
- **アラーム要求**: 外部サービスから送信されたアラームの日時・タイトル・送信元の識別子、および配送・登録の結果。アラームのタイトルには、ユーザーまたはユーザーが連携した外部サービスが設定した文言が含まれます。これらの情報は送信から 30 日で自動的に削除されます
- **お問い合わせ情報**: ユーザーがメールまたはアプリ内からお問い合わせを行った場合の連絡先と問い合わせ内容

### 外部サービスが収集する情報
本サービスでは、有料サービスの購入状況の管理および決済処理のため、RevenueCat, Inc. が提供する RevenueCat を利用しています。RevenueCat は購入情報(購入した商品、購入日時、匿名の端末識別子等)を収集します。収集された情報は RevenueCat, Inc. のプライバシーポリシー(https://www.revenuecat.com/privacy )に基づき管理されます。
本サービスでは、有料サービスの購入状況の管理および決済処理のため、RevenueCat, Inc. が提供する RevenueCat を利用しています。RevenueCat は購入情報(購入した商品、購入日時、本サービスのアカウント識別子等)を収集します。<!-- source: Alarmify/Features/Purchase/ProEntitlement.swift: Purchases.logIn に Firebase Auth の uid (アカウント識別子) を渡し、RevenueCat の App User ID にしている -->収集された情報は RevenueCat, Inc. のプライバシーポリシー(https://www.revenuecat.com/privacy )に基づき管理されます。

複数の iPhone を 1 つのアカウントにまとめるための任意の認証には、Apple Inc. が提供する Sign in with Apple を利用します。連携時に Apple Inc. から受け取る情報は、上記のとおり Apple のユーザー識別子のみです。Apple Inc. による情報の取扱いは Apple のプライバシーポリシー(https://www.apple.com/legal/privacy/ )に基づきます。

プッシュ通知の配送には Apple Inc. の Apple Push Notification service および Google LLC の Firebase Cloud Messaging を利用します。アプリ内購入の決済は Apple Inc. が処理します。提供者はクレジットカード情報等の決済情報を取得しません。

Expand All @@ -27,6 +29,7 @@ bannzai(以下「提供者」といいます。)は、提供者の提供す

- 外部サービスからのリクエストをユーザーの端末に配送し、アラームを登録・更新・取消するため
- API トークンの認証、不正利用の防止、利用回数の制限(無料プランの上限等)の判定のため
- ユーザーのアカウントの識別および認証(Sign in with Apple による複数の iPhone の 1 つのアカウントへの統合を含みます。)のため
- 有料サービスの購入状況の確認・復元等、本サービスの提供、維持、保護および改善のため
- 本サービスに関するご案内、お問い合わせ等への対応のため
- 本サービスに関する提供者の規約、ポリシー等に違反する行為に対する対応のため
Expand All @@ -43,7 +46,7 @@ bannzai(以下「提供者」といいます。)は、提供者の提供す
## 個人情報の開示・訂正・利用停止・消去
提供者は、ユーザーから、個人情報保護法の定めに基づき個人情報の開示・訂正・利用停止・消去を求められたときは、ユーザーご本人からのご請求であることを確認の上で、遅滞なく対応します(当該個人情報が存在しないときにはその旨を通知いたします。)。ただし、個人情報保護法その他の法令により提供者が義務を負わない場合は、この限りではありません。

ユーザーは、アプリ内の設定画面からアカウントを削除できます。アカウントを削除すると、アカウント識別子、API トークン、端末情報、アラーム要求の履歴は提供者のサーバーから削除されます。手順の詳細は「[アカウントとデータの削除方法](./AccountDeletion-ja)」をご覧ください。
ユーザーは、アプリ内の設定画面からアカウントを削除できます。アカウントを削除すると、アカウント識別子、API トークン、端末情報、アラーム要求の履歴は提供者のサーバーから削除されます。Sign in with Apple を連携している場合は、削除の前に Sign in with Apple の認証を求め、認証後に Apple のトークンを失効させてから削除します。<!-- source: Alarmify/Account/AccountSession.swift: deleteAccount() は appleIDLinked なら revokeAppleToken() (Sign in with Apple をやり直して authorization code を受け取り Auth.auth().revokeToken(withAuthorizationCode:)) を済ませてから apiClient.deleteAccount() を呼ぶ -->手順の詳細は「[アカウントとデータの削除方法](./AccountDeletion-ja)」をご覧ください。

## お問い合わせ窓口
ご意見、ご質問、苦情のお申出その他利用者情報の取扱いに関するお問い合わせは、以下の窓口までお願いいたします。
Expand Down
Loading
Loading