{"id":51040186,"url":"https://github.com/gameframex/com.gameframex.unity.systeminfo","last_synced_at":"2026-06-22T10:01:51.125Z","repository":{"id":102917872,"uuid":"71104369","full_name":"GameFrameX/com.gameframex.unity.systeminfo","owner":"GameFrameX","description":"A Unity3D plugin for retrieving device unique identifiers (OAID, IDFA, IMEI, hardware fingerprint) on Android and iOS — pure C# with JNI, no Java/JAR required.","archived":false,"fork":false,"pushed_at":"2026-06-07T08:39:15.000Z","size":11499,"stargazers_count":23,"open_issues_count":0,"forks_count":7,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-06-07T10:21:19.630Z","etag":null,"topics":["android","androidid","device-identifier","deviceid","idfa","imei","ios","iosdevice","jni","keychain","oaid","unique-id","unique-id-generator","unique-identifier","uniqueid","unity","unity-3d","unity3d","unity3d-plugin"],"latest_commit_sha":null,"homepage":"https://gameframex.doc.alianblank.com","language":"Objective-C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GameFrameX.png","metadata":{"files":{"readme":"README.ja.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-10-17T05:54:22.000Z","updated_at":"2026-06-07T08:39:17.000Z","dependencies_parsed_at":null,"dependency_job_id":"56769016-7e0a-44a9-94ae-426c61da2593","html_url":"https://github.com/GameFrameX/com.gameframex.unity.systeminfo","commit_stats":null,"previous_names":["gameframex/com.gameframex.unity.systeminfo"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/GameFrameX/com.gameframex.unity.systeminfo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.systeminfo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.systeminfo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.systeminfo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.systeminfo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GameFrameX","download_url":"https://codeload.github.com/GameFrameX/com.gameframex.unity.systeminfo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GameFrameX%2Fcom.gameframex.unity.systeminfo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34643624,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-22T02:00:06.391Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","androidid","device-identifier","deviceid","idfa","imei","ios","iosdevice","jni","keychain","oaid","unique-id","unique-id-generator","unique-identifier","uniqueid","unity","unity-3d","unity3d","unity3d-plugin"],"created_at":"2026-06-22T10:01:49.782Z","updated_at":"2026-06-22T10:01:51.108Z","avatar_url":"https://github.com/GameFrameX.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"https://download.alianblank.com/gameframex/gameframex_logo_320.png\" alt=\"Game Frame X Logo\" width=\"160\" /\u003e\n\n# BlankDeviceUniqueIdentifier\n\n[![License](https://img.shields.io/github/license/GameFrameX/com.gameframex.unity.systeminfo)](https://github.com/GameFrameX/com.gameframex.unity.systeminfo/blob/main/LICENSE.md)\n[![Version](https://img.shields.io/github/v/release/GameFrameX/com.gameframex.unity.systeminfo)](https://github.com/GameFrameX/com.gameframex.unity.systeminfo/releases)\n[![Unity Version](https://img.shields.io/badge/Unity-2019.4-black?logo=unity)](https://unity.com/)\n[![Documentation](https://img.shields.io/badge/Documentation-docs-blue)](https://gameframex.doc.alianblank.com)\n\nインディゲーム開発者向けオールインワンソリューション · インディ開発者の夢を支援\n\n\u003cbr /\u003e\n\n[ドキュメント](https://gameframex.doc.alianblank.com) · [クイックスタート](#quick-start) · QQグループ: 467608841 / 233840761\n\n\u003cbr /\u003e\n\n[English](README.md) | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | **日本語** | [한국어](README.ko.md)\n\n\u003c/div\u003e\n\n## 機能\n\n| API | 説明 | 戻り値 |\n|-----|------|--------|\n| `DeviceGetOaid` | デバイス OAID を取得（Android のみ） | OAID 元の値（`-` 除去、最大 32 文字） |\n| `DeviceGetIdfa` | デバイス IDFA を取得（iOS のみ） | IDFA 元の値（`-` 除去、最大 32 文字） |\n| `DeviceGetImei` | デバイス IMEI を取得 | IMEI 元の値（`-` 除去、最大 32 文字） |\n| `DeviceUniqueIdentifier` | デバイス固有マシン ID を取得 | MD5 ハッシュ（32 文字の 16 進数文字列） |\n\nすべての API は `PlayerPrefs` を通じて結果をキャッシュし、初回取得後はシステムインターフェースを再呼び出ししません。\n\n\n\n\n\n## クイックスタート\n\n### インストール\n\n以下のいずれかの方法を選択してください：\n\n1. Unity プロジェクトの `Packages/manifest.json` を編集し、`scopedRegistries` セクションを追加してください：\n   ```json\n   {\n     \"scopedRegistries\": [\n       {\n         \"name\": \"GameFrameX\",\n         \"url\": \"https://gameframex.upm.alianblank.uk\",\n         \"scopes\": [\n           \"com.gameframex\"\n         ]\n       }\n     ],\n     \"dependencies\": {\n       \"com.gameframex.unity.systeminfo\": \"3.0.1\"\n     }\n   }\n   ```\n\n   `scopes` は、どのパッケージをこのレジストリから解決するかを制御します。`com.gameframex` で始まるパッケージのみがこのレジストリから取得されます。\n\n2. `manifest.json` の `dependencies` に直接追加：\n   ```json\n   {\n      \"com.gameframex.unity.systeminfo\": \"https://github.com/gameframex/com.gameframex.unity.systeminfo.git\"\n   }\n   ```\n3. Unity の **Package Manager** で **Git URL** を使用して追加：`https://github.com/gameframex/com.gameframex.unity.systeminfo.git`\n4. リポジトリを Unity プロジェクトの `Packages` ディレクトリにクローンしてください。自動的に読み込まれます.\n\n## クイックスタート\n\n### インストール\n\n以下のいずれかの方法を選択してください：\n\n1. Unity プロジェクトの `Packages/manifest.json` を編集し、`scopedRegistries` セクションを追加してください：\n   ```json\n   {\n     \"scopedRegistries\": [\n       {\n         \"name\": \"GameFrameX\",\n         \"url\": \"https://gameframex.upm.alianblank.uk\",\n         \"scopes\": [\n           \"com.gameframex\"\n         ]\n       }\n     ],\n     \"dependencies\": {\n       \"com.gameframex.unity.systeminfo\": \"3.0.1\"\n     }\n   }\n   ```\n\n   `scopes` は、どのパッケージをこのレジストリから解決するかを制御します。`com.gameframex` で始まるパッケージのみがこのレジストリから取得されます。\n\n2. `manifest.json` の `dependencies` に直接追加：\n   ```json\n   {\n      \"com.gameframex.unity.systeminfo\": \"https://github.com/gameframex/com.gameframex.unity.systeminfo.git\"\n   }\n   ```\n3. Unity の **Package Manager** で **Git URL** を使用して追加：`https://github.com/gameframex/com.gameframex.unity.systeminfo.git`\n4. リポジトリを Unity プロジェクトの `Packages` ディレクトリにクローンしてください。自動的に読み込まれます.\n\n## プラットフォーム実装\n\n| プラットフォーム | `DeviceGetOaid` | `DeviceGetIdfa` | `DeviceGetImei` | `DeviceUniqueIdentifier` |\n|----------|-----------------|-----------------|-----------------|--------------------------|\n| Android | JNI リフレクション取得（MSA / Huawei / Xiaomi / OPPO / vivo / Samsung） | `SystemInfo.deviceUniqueIdentifier`（フォールバック） | JNI による `TelephonyManager` 呼び出し | IMEI + ハードウェア情報 + Android ID + WLAN MAC + BT MAC の MD5 |\n| iOS | `SystemInfo.deviceUniqueIdentifier`（フォールバック） | `ASIdentifierManager.advertisingIdentifier` | native `__DeviceGetIMEI()` (IDFV) | native `DeviceUniqueId()` (SSKeychain) |\n| WebGL | jslib：`localStorage` に永続化された UUID | jslib：`localStorage` に永続化された UUID | jslib：`localStorage` に永続化された UUID | jslib：`localStorage` に永続化された UUID |\n| Editor / その他 | `SystemInfo.deviceUniqueIdentifier` | `SystemInfo.deviceUniqueIdentifier` | `SystemInfo.deviceUniqueIdentifier` | `SystemInfo.deviceUniqueIdentifier` |\n\n\u003e **WebGL 補足**：`SystemInfo.deviceUniqueIdentifier` はブラウザコンテキストで不安定なため、jslib は初回呼び出し時に UUID を生成し、`localStorage` の `GameFrameX.DeviceUniqueIdentifier` キーに永続化することで、同じブラウザ内では安定します。\n\n## 権限（オプション）\n\n本プラグインは**権限を一切要求しません**。権限がない場合はグレースフルにフォールバックします。プラグインは `AndroidManifest.xml` を同梱していません。以下の権限は**使用側プロジェクト**の `AndroidManifest.xml` で必要に応じて宣言してください。\n\n### Android\n\n| 権限 | `DeviceUniqueIdentifier` の一意性向上 | `DeviceGetImei` の一意性向上 |\n|------------|------|------|\n| `READ_PHONE_STATE` | IMEI がハッシュ計算に含まれる | 実際の IMEI を取得可能 |\n| `ACCESS_WIFI_STATE` | WLAN MAC がハッシュ計算に含まれる | - |\n| `BLUETOOTH` | Bluetooth MAC がハッシュ計算に含まれる | - |\n\n```xml\n\u003c!-- 使用側プロジェクトの AndroidManifest.xml に必要に応じて追加 --\u003e\n\u003cuses-permission android:name=\"android.permission.READ_PHONE_STATE\" /\u003e\n\u003cuses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" /\u003e\n\u003cuses-permission android:name=\"android.permission.BLUETOOTH\" /\u003e\n```\n\n### iOS\n\n| 設定 | 目的 |\n|------|------|\n| `NSUserTrackingUsageDescription` | IDFA に必要な ATT 認証の説明 |\n\n```xml\n\u003c!-- 使用側プロジェクトの Info.plist に追加 --\u003e\n\u003ckey\u003eNSUserTrackingUsageDescription\u003c/key\u003e\n\u003cstring\u003e広告識別子はより良いサービスの提供に使用されます\u003c/string\u003e\n```\n\n## 使用例\n\n```csharp\nusing GameFrameX.SystemInfo.Runtime;\n\n// デバイス OAID を取得（Android のみ、iOS/Editor では SystemInfo.deviceUniqueIdentifier にフォールバック）\nstring oaid = BlankDeviceUniqueIdentifier.DeviceGetOaid;\n\n// デバイス IDFA を取得（iOS のみ、Android/Editor では SystemInfo.deviceUniqueIdentifier にフォールバック）\nstring idfa = BlankDeviceUniqueIdentifier.DeviceGetIdfa;\n\n// デバイス IMEI を取得\nstring imei = BlankDeviceUniqueIdentifier.DeviceGetImei;\n\n// デバイス一意識別子を取得\nstring deviceId = BlankDeviceUniqueIdentifier.DeviceUniqueIdentifier;\n```\n\n### iOS IDFA の注意事項\n\nIDFA は ATT（App Tracking Transparency）によるユーザー認証が必要です。使用前に `Info.plist` に追加：\n\n```xml\n\u003ckey\u003eNSUserTrackingUsageDescription\u003c/key\u003e\n\u003cstring\u003e広告識別子はより良いサービスの提供に使用されます\u003c/string\u003e\n```\n\n`DeviceGetIdfa` を呼び出す前に認証を要求：\n\n```csharp\n#if UNITY_IOS || UNITY_IPHONE\n// iOS 14+ では先に ATT 認証を要求\nif (UnityEngine.iOS.Device.systemVersion.CompareTo(\"14\") \u003e= 0)\n{\n    UnityEngine.iOS.Device.RequestUserAuthorization(UnityEngine.iOS.UserTracking.Authorization);\n}\n#endif\nstring idfa = BlankDeviceUniqueIdentifier.DeviceGetIdfa;\n```\n\n未認証の場合、`DeviceGetIdfa` は空文字列を返し、クラッシュしません。\n\n## ディレクトリ構造\n\n```\nPlugins/\n  iOS/\n    BlankDeviceUniqueIdentifier/\n      AHDeviceUniqueIdentifier.h               # iOS native ヘッダ\n      AHDeviceUniqueIdentifier.mm              # iOS native 実装\n      SSKeychain.h                              # SSKeychain キーチェーンユーティリティ\n      SSKeychain.m\n  WebGL/\n    BlankDeviceUniqueIdentifier.jslib         # WebGL jslib ブリッジ（localStorage 永続化 UUID）\nRuntime/\n  BlankDeviceUniqueIdentifier.cs               # C# 統一インターフェース（Android は JNI でシステム API を直接呼び出し、Java/JAR 不要）\n```\n\n\u003e Android では `AndroidJavaClass` / `AndroidJavaObject` を使用してシステム API とベンダー SDK を直接呼び出します。Java コードのコンパイルや JAR ファイルは不要です。\n\n\n## 依存関係\n\n| パッケージ | 説明 |\n|----------|------|\n| (无) | - |\n\n\n## ドキュメントとリソース\n\n- [ドキュメント](https://gameframex.doc.alianblank.com)\n\n## コミュニティとサポート\n\n- QQグループ: 467608841 / 233840761\n\n## 変更履歴\n\n[Releases](https://github.com/GameFrameX/gameframex/com.gameframex.unity.systeminfo/releases) で変更履歴を確認してください。\n## ライセンス\n\n詳しくは [LICENSE.md](LICENSE.md) をご参照ください。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgameframex%2Fcom.gameframex.unity.systeminfo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgameframex%2Fcom.gameframex.unity.systeminfo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgameframex%2Fcom.gameframex.unity.systeminfo/lists"}