[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBKFZWWSFDBV1MB2H2S1JR":3,"skill-same:01M6CBKFZWWSFDBV1MB2H2S1JR":54},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":33,"commitSha":34,"skillDirectory":35,"forksCount":14,"repositoryHtmlUrl":36,"repositoryHomepageUrl":6,"ownerHtmlUrl":37,"ownerBlogUrl":6,"ownerDescription":38,"updatedAt":39,"install":40,"resources":53},"01M6CBKFZWWSFDBV1MB2H2S1JR","10-remote-data-manager",null,"MobilePackage RemoteDataManager를 통해 VersionCheck(플랫폼 URL 기반)와 Server UTC 동기화(HTTP Date header)를 단일 경로로 제공할 때 사용한다.","devwinsoft\u002Fdevian","devwinsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22570160?v=4","01M6C6RR8W05NH8NPKQNCE3Q72","maoshy","01M6C6RRDJ5TJJCZXRTY801YDH",0,"MIT","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F50-mobile-package\u002F29-remote-data-system\u002F10-remote-data-manager\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[24,25,26,27],"data","10 remote data manager","http","server","2026-11-10 10:12:30",false,"---\nname: 10-remote-data-manager\ndescription: MobilePackage RemoteDataManager를 통해 VersionCheck(플랫폼 URL 기반)와 Server UTC 동기화(HTTP Date header)를 단일 경로로 제공할 때 사용한다.\n---\n\n# 10-remote-data-manager\n\nStatus: ACTIVE\nAppliesTo: v10\n\nRemoteDataManager는 LoginManager\u002FMobileApplication에서 사용하는 버전 체크와 서버 UTC 동기화 기능의 단일 진입점이다.\n\n---\n\n## 1. Class\n\n```csharp\npublic sealed class RemoteDataManager : CompoSingleton\u003CRemoteDataManager>\n```\n\n- namespace: `Devian`\n- asmdef: `Devian.Samples.MobilePackage`\n- `MobileApplication`에서 `RequireComponent(typeof(RemoteDataManager))`로 보장한다.\n\n---\n\n## 2. Public API\n\n```csharp\npublic Task\u003CCommonResult\u003CVersionCheckResult>> InitializeAsync(VersionNumber clientVersion, CancellationToken ct = default)\npublic Task\u003CCommonResult\u003CVersionCheckResult>> VersionCheckAsync(VersionNumber clientVersion, CancellationToken ct = default)\npublic Task\u003CCommonResult> SyncServerUtcAsync(CancellationToken ct = default)\npublic static long ServerNowUtcMs { get; }\npublic VersionNumber CurrentVersionNumber { get; }\npublic VersionNumber MinVersionNumber { get; }\n```\n\n- `InitializeAsync`: 로그인 진입 초기에 호출되는 단일 초기화 API. 버전 체크와 서버 UTC 동기화를 순서대로 수행한다.\n- `VersionCheckAsync`: `MobileApplication.VersionCheckAOS\u002FVersionCheckIOS` URL에서 JSON을 받아 `VersionCheckConfig`([15-version-check-config](..\u002F..\u002F..\u002F..\u002Fdevian\u002F10-module\u002F20-core\u002F15-version-check-config\u002FSKILL.md))로 파싱 후 버전 판정한다.\n- `SyncServerUtcAsync`: `HEAD https:\u002F\u002Fworldtimeapi.org` 응답의 `Date` 헤더를 파싱해 서버 UTC 스냅샷을 갱신한다.\n- `ServerNowUtcMs`: 추정 서버 UTC(ms)를 반환하는 static property. 동기화 스냅샷 + 경과 시간으로 계산하며, 인스턴스가 없으면 클라이언트 UTC fallback.\n- `CurrentVersionNumber`\u002F`MinVersionNumber`: 최근 버전 체크로 해석된 버전값을 보유한다.\n\n---\n\n## 3. Hard Rules\n\n- VersionCheck URL owner는 `MobileApplication`이다. (`VersionCheckAOS`, `VersionCheckIOS`)\n- `LoginManager`는 로그인 초기화 진입 시 `RemoteDataManager.InitializeAsync`를 **가장 먼저** 호출한다.\n- `LoginManager`는 버전 체크\u002F서버 UTC fetch 실구현을 소유하지 않는다.\n- 서버 UTC는 Date header 기반으로 획득한다. (`worldtimeapi` HEAD)\n- 실패 시 앱 흐름을 강제 중단하지 않고 fallback 경로를 허용한다.\n- 과거 RemoteConfig storage\u002Fsnapshot\u002Fsave-codec\u002Ffirebase-config 연동 같은 중복 기능은 유지하지 않는다.\n- VersionCheck 실패 시 전용 에러 코드를 사용한다 (범용 `COMMON_SERVER`\u002F`COMMON_NETWORK` 사용 금지):\n  - `VERSION_CHECK_URL_NOT_CONFIGURED` — 플랫폼 URL 미설정\n  - `VERSION_CHECK_NETWORK_FAILED` — 네트워크 요청 실패\n  - `VERSION_CHECK_RESPONSE_EMPTY` — 응답 본문 비어있음\n  - `VERSION_CHECK_PARSE_FAILED` — JSON 파싱 실패\n\n---\n\n## 4. Implementation Location (3-path mirror)\n\n- UPM (정본): `framework-cs\u002Fupm\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FRemoteData\u002FRemoteDataManager.cs`\n- Packages (sync): `framework-cs\u002Fapps\u002FUnityExample\u002FPackages\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FRemoteData\u002FRemoteDataManager.cs`\n- Assets\u002FSamples (import): `framework-cs\u002Fapps\u002FUnityExample\u002FAssets\u002FSamples\u002FDevian Samples\u002F{version}\u002FMobilePackage\u002FRuntime\u002FRemoteData\u002FRemoteDataManager.cs`\n\n---\n\n## 5. Related\n\n- [11-mobile-application](..\u002F..\u002F11-mobile-application\u002FSKILL.md)\n- [24-login-manager](..\u002F..\u002F24-login-manager\u002FSKILL.md)\n","# 10-remote-data-manager\n\nStatus: ACTIVE\nAppliesTo: v10\n\nRemoteDataManager는 LoginManager\u002FMobileApplication에서 사용하는 버전 체크와 서버 UTC 동기화 기능의 단일 진입점이다.\n\n---\n\n## 1. Class\n\n```csharp\npublic sealed class RemoteDataManager : CompoSingleton\u003CRemoteDataManager>\n```\n\n- namespace: `Devian`\n- asmdef: `Devian.Samples.MobilePackage`\n- `MobileApplication`에서 `RequireComponent(typeof(RemoteDataManager))`로 보장한다.\n\n---\n\n## 2. Public API\n\n```csharp\npublic Task\u003CCommonResult\u003CVersionCheckResult>> InitializeAsync(VersionNumber clientVersion, CancellationToken ct = default)\npublic Task\u003CCommonResult\u003CVersionCheckResult>> VersionCheckAsync(VersionNumber clientVersion, CancellationToken ct = default)\npublic Task\u003CCommonResult> SyncServerUtcAsync(CancellationToken ct = default)\npublic static long ServerNowUtcMs { get; }\npublic VersionNumber CurrentVersionNumber { get; }\npublic VersionNumber MinVersionNumber { get; }\n```\n\n- `InitializeAsync`: 로그인 진입 초기에 호출되는 단일 초기화 API. 버전 체크와 서버 UTC 동기화를 순서대로 수행한다.\n- `VersionCheckAsync`: `MobileApplication.VersionCheckAOS\u002FVersionCheckIOS` URL에서 JSON을 받아 `VersionCheckConfig`([15-version-check-config](..\u002F..\u002F..\u002F..\u002Fdevian\u002F10-module\u002F20-core\u002F15-version-check-config\u002FSKILL.md))로 파싱 후 버전 판정한다.\n- `SyncServerUtcAsync`: `HEAD https:\u002F\u002Fworldtimeapi.org` 응답의 `Date` 헤더를 파싱해 서버 UTC 스냅샷을 갱신한다.\n- `ServerNowUtcMs`: 추정 서버 UTC(ms)를 반환하는 static property. 동기화 스냅샷 + 경과 시간으로 계산하며, 인스턴스가 없으면 클라이언트 UTC fallback.\n- `CurrentVersionNumber`\u002F`MinVersionNumber`: 최근 버전 체크로 해석된 버전값을 보유한다.\n\n---\n\n## 3. Hard Rules\n\n- VersionCheck URL owner는 `MobileApplication`이다. (`VersionCheckAOS`, `VersionCheckIOS`)\n- `LoginManager`는 로그인 초기화 진입 시 `RemoteDataManager.InitializeAsync`를 **가장 먼저** 호출한다.\n- `LoginManager`는 버전 체크\u002F서버 UTC fetch 실구현을 소유하지 않는다.\n- 서버 UTC는 Date header 기반으로 획득한다. (`worldtimeapi` HEAD)\n- 실패 시 앱 흐름을 강제 중단하지 않고 fallback 경로를 허용한다.\n- 과거 RemoteConfig storage\u002Fsnapshot\u002Fsave-codec\u002Ffirebase-config 연동 같은 중복 기능은 유지하지 않는다.\n- VersionCheck 실패 시 전용 에러 코드를 사용한다 (범용 `COMMON_SERVER`\u002F`COMMON_NETWORK` 사용 금지):\n  - `VERSION_CHECK_URL_NOT_CONFIGURED` — 플랫폼 URL 미설정\n  - `VERSION_CHECK_NETWORK_FAILED` — 네트워크 요청 실패\n  - `VERSION_CHECK_RESPONSE_EMPTY` — 응답 본문 비어있음\n  - `VERSION_CHECK_PARSE_FAILED` — JSON 파싱 실패\n\n---\n\n## 4. Implementation Location (3-path mirror)\n\n- UPM (정본): `framework-cs\u002Fupm\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FRemoteData\u002FRemoteDataManager.cs`\n- Packages (sync): `framework-cs\u002Fapps\u002FUnityExample\u002FPackages\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FRemoteData\u002FRemoteDataManager.cs`\n- Assets\u002FSamples (import): `framework-cs\u002Fapps\u002FUnityExample\u002FAssets\u002FSamples\u002FDevian Samples\u002F{version}\u002FMobilePackage\u002FRuntime\u002FRemoteData\u002FRemoteDataManager.cs`\n\n---\n\n## 5. Related\n\n- [11-mobile-application](..\u002F..\u002F11-mobile-application\u002FSKILL.md)\n- [24-login-manager](..\u002F..\u002F24-login-manager\u002FSKILL.md)\n",{"name":5,"description":7},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian-unity\u002F50-mobile-package\u002F29-remote-data-system\u002F10-remote-data-manager","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft","Kim Hyong Joon","2026-04-12 18:44:10",{"source":8,"skillName":5,"commands":41,"prompt":51,"zipAvailable":52},[42,45,48],{"tool":43,"command":44},"npx","npx skills add devwinsoft\u002Fdevian --skill 10-remote-data-manager",{"tool":46,"command":47},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 10-remote-data-manager",{"tool":49,"command":50},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 10-remote-data-manager","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F50-mobile-package\u002F29-remote-data-system\u002F10-remote-data-manager\u002FSKILL.md",true,[],[55,61,69,77,86,93],{"skillNo":56,"name":57,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":60,"publishedAt":28},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[57],{"skillNo":62,"name":63,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":28},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[67,68],"archive","90 project archive",{"skillNo":70,"name":71,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":28},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[75,76],"management","30 env management",{"skillNo":78,"name":79,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":80,"categories":81,"keywords":82,"publishedAt":28},"01M6CBWYD3TGWBQV7V35551THF","19-page-push-send","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F19-page-push-send\u002FSKILL.md",[],[83,84,85],"push","page","19 page push send",{"skillNo":87,"name":88,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":28},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[84,92],"18 page savedata",{"skillNo":94,"name":95,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":28},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[84,99],"17 page deobfuscate"]