{"id":9359,"date":"2026-08-10T19:00:00","date_gmt":"2026-08-10T10:00:00","guid":{"rendered":"https:\/\/www.wetch.co.jp\/note\/?p=9359"},"modified":"2026-08-11T09:36:17","modified_gmt":"2026-08-11T00:36:17","slug":"%e3%83%90%e3%83%83%e3%82%af%e3%82%a8%e3%83%b3%e3%83%89%e3%81%ae%e4%ba%ba%e3%81%8cnativephp%e3%81%ae%e5%8a%9b%e3%82%92%e5%80%9f%e3%82%8a%e3%81%a6%e5%88%9d%e3%82%81%e3%81%a6%e3%83%a2%e3%83%90%e3%82%a4-3","status":"publish","type":"post","link":"https:\/\/www.wetch.co.jp\/note\/%e3%83%90%e3%83%83%e3%82%af%e3%82%a8%e3%83%b3%e3%83%89%e3%81%ae%e4%ba%ba%e3%81%8cnativephp%e3%81%ae%e5%8a%9b%e3%82%92%e5%80%9f%e3%82%8a%e3%81%a6%e5%88%9d%e3%82%81%e3%81%a6%e3%83%a2%e3%83%90%e3%82%a4-3\/","title":{"rendered":"\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e\u4eba\u304cNativePHP\u306e\u529b\u3092\u501f\u308a\u3066\u521d\u3081\u3066\u30e2\u30d0\u30a4\u30eb\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u307f\u305f\u306e\u5dfb\uff08\u7279\u5225\u7de8\uff09"},"content":{"rendered":"<p>\u524d\u56de\u306e\u6295\u7a3f\u3067\u306f\u3001\u30bf\u30a4\u30e0\u30ec\u30b3\u30fc\u30c0\u30fc\u753b\u9762\u3068\u6253\u523b API\u3001\u624b\u52d5\u5ea7\u6a19\u3067\u306e\u534a\u5f84\u5224\u5b9a\u307e\u3067\u3092\u78ba\u8a8d\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u624b\u52d5\u5ea7\u6a19\u306f\u30c7\u30e2\u3084\u5931\u6557\u30d1\u30bf\u30fc\u30f3\u306e\u518d\u73fe\u306b\u306f\u4fbf\u5229\u3067\u3059\u304c\u3001\u305b\u3063\u304b\u304f\u30e2\u30d0\u30a4\u30eb\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u3044\u308b\u306e\u3067\u3001\u30b9\u30de\u30db\u306a\u3089\u3067\u306f\u306e GPS\u00a0\u3067\u4f4d\u7f6e\u3092\u53d6\u308a\u305f\u3044\u6c17\u6301\u3061\u304c\u3042\u308a\u307e\u3059\u3002SuperNative \u306e\u4fa1\u5024\u3092\u793a\u3059\u3046\u3048\u3067\u3082\u3001\u30cd\u30a4\u30c6\u30a3\u30d6\u5074\u304b\u3089\u4f4d\u7f6e\u3092\u53d6\u308b\u3068\u3053\u308d\u307e\u3067\u884c\u304d\u305f\u3044\u3068\u3053\u308d\u3067\u3059\u3002<\/p>\n<p>Marketplace \u306b nativephp\/mobile-geolocation \u306f\u3042\u308a\u307e\u3059\u304c\u3001\u6709\u6599\u3067\u3059\u306e\u3067\u3001\u4eca\u56de\u306f\u3001\u6253\u523b\u306b\u5fc5\u8981\u306a\u300c\u3044\u307e\u306e\u4f4d\u7f6e\u3092 1 \u56de\u53d6\u308b\u300d\u3060\u3051\u306b\u7d5e\u3063\u3066\u3001\u81ea\u4f5c\u306e\u30ef\u30f3\u30b7\u30e7\u30c3\u30c8 GPS \u30d7\u30e9\u30b0\u30a4\u30f3 local\/simple-geolocation \u3092\u5b9f\u88c5\u3057\u3001\u624b\u52d5\u5ea7\u6a19\u3092 OFF \u306b\u3057\u305f\u307e\u307e\u51fa\u52e4\u3067\u304d\u308b\u3068\u3053\u308d\u307e\u3067\u9032\u3081\u307e\u3059\u3002<\/p>\n<p>\u305f\u3060\u3001\u81ea\u4f5c\u30d7\u30e9\u30b0\u30a4\u30f3\u306b\u306a\u308b\u3068 Android \u5074\u306f\u00a0Kotlin\u00a0\u306b\u3082\u89e6\u308c\u308b\u3053\u3068\u306b\u306a\u308a\u307e\u3059\u3002\u666e\u6bb5\u306e PHP \u304b\u3089\u306f\u5c11\u3057\u96e2\u308c\u308b\u5185\u5bb9\u306a\u306e\u3067\u3001\u672c\u7de8\u3068\u306f\u5207\u308a\u5206\u3051\u3066\u00a0\u7279\u5225\u7de8\u00a0\u3068\u3057\u3066\u307e\u3068\u3081\u307e\u3059\u3002<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"569\" src=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-01-1024x569.png\" alt=\"\" class=\"wp-image-9360\" srcset=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-01-1024x569.png 1024w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-01-300x167.png 300w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-01-768x426.png 768w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-01-150x83.png 150w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-01-696x386.png 696w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-01-1068x593.png 1068w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-01.png 1529w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n<h3>\uff11\uff09\u4eca\u56de\u306e\u7bc4\u56f2\u3068\u5236\u9650\u4e8b\u9805<\/h3>\n<p>\u81ea\u524d\u30d7\u30e9\u30b0\u30a4\u30f3\u3067\u306e\u52d5\u4f5c\u7bc4\u56f2\u3068\u5236\u9650\u4e8b\u9805\u3092\u4ee5\u4e0b\u306b\u8a18\u8f09\u3057\u307e\u3059\u3002<\/p>\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>\u52d5\u4f5c\u7bc4\u56f2\uff08\u3067\u304d\u308b\u3053\u3068\uff09<\/td><td>\u5236\u9650\u4e8b\u9805\uff08\u3084\u3089\u306a\u3044\u3053\u3068\uff09<\/td><\/tr><tr><td>\u73fe\u5728\u5730\u3092 1 \u56de\u53d6\u5f97\u3057\u3001Event \u3067 PHP \u306b\u8fd4\u3059<\/td><td>\u5e38\u6642\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u30fb\u30d0\u30c3\u30af\u30b0\u30e9\u30a6\u30f3\u30c9\u8ffd\u5f93<\/td><\/tr><tr><td>Android \/ iOS \u3067\u540c\u3058 Bridge API<\/td><td>\u5730\u56f3\u8868\u793a<\/td><\/tr><tr><td>\u6a29\u9650\u30c0\u30a4\u30a2\u30ed\u30b0\u306e\u8868\u793a<\/td><td>\u6709\u6599\u30d7\u30e9\u30b0\u30a4\u30f3\u76f8\u5f53\u306e\u6a5f\u80fd\u5b9f\u88c5<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<p>\u6253\u523b\u3059\u308b\u969b\u306b\u5fc5\u8981\u306a\u300c\u73fe\u5728\u306e\u4f4d\u7f6e\u3092\u53d6\u5f97\u300d\u3060\u3051\u306b\u7d5e\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<h3>\uff12\uff09\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u69cb\u6210<\/h3>\n<p>\u914d\u7f6e\u306f packages\/simple-geolocation \u3067\u3001Composer \u306e path \u30ea\u30dd\u30b8\u30c8\u30ea\u3068\u3057\u3066\u8aad\u307f\u8fbc\u307f\u307e\u3059\u3002<\/p>\n<p>Composer \u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u540d\u306f\u3001\u901a\u5e38 \u30d9\u30f3\u30c0\u30fc\u540d\/\u30d1\u30c3\u30b1\u30fc\u30b8\u540d \u306e\u5f62\u306b\u306a\u308a\u307e\u3059\u3002\u793e\u5185\u5411\u3051\u306a\u3089 \u4f1a\u793e\u540d\/&#8230; \u306e\u3088\u3046\u306b\u793e\u540d\u3092\u30d9\u30f3\u30c0\u30fc\u306b\u3059\u308b\u3053\u3068\u304c\u591a\u3044\u3067\u3059\u304c\u3001\u4eca\u56de\u306f\u691c\u8a3c\u3067\u3059\u306e\u3067\u3001\u793e\u540d\u306b\u306f\u4f9d\u5b58\u3057\u306a\u3044 local\/simple-geolocation \u306b\u3057\u307e\u3057\u305f\u3002PHP \u306e\u540d\u524d\u7a7a\u9593\u3082\u3042\u308f\u305b\u3066 Local\\SimpleGeolocation \u3067\u3059\u3002<\/p>\n<ul>\n<li>PHP : Facade \/ Pending \/ LocationReceived Event<\/li>\n<li>Android : SimpleGeolocationFunctions.kt\uff08LocationManager\uff09<\/li>\n<li>iOS : SimpleGeolocationFunctions.swift\uff08CLLocationManager\uff09<\/li>\n<li>\u30de\u30cb\u30d5\u30a7\u30b9\u30c8 : nativephp.json\uff08\u6a29\u9650\u30fbBridge\u30fbEvent \u306e\u5b9a\u7fa9\uff09<\/li>\n<\/ul>\n<p>\u4ee5\u4e0b\u306f\u30d1\u30c3\u30b1\u30fc\u30b8\u30c4\u30ea\u30fc\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"888\" height=\"612\" src=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-02.png\" alt=\"\" class=\"wp-image-9361\" srcset=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-02.png 888w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-02-300x207.png 300w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-02-768x529.png 768w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-02-150x103.png 150w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-02-218x150.png 218w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-02-696x480.png 696w\" sizes=\"auto, (max-width: 888px) 100vw, 888px\" \/><\/figure>\n\n\n<p>\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u51e6\u7406\u306e\u6d41\u308c\u306f\u30b7\u30f3\u30d7\u30eb\u3067\u3059\u3002\u6253\u523b\u30dc\u30bf\u30f3\u3092\u62bc\u3059\u3068\u3001PHP \u304b\u3089\u30cd\u30a4\u30c6\u30a3\u30d6\u3078\u300c\u73fe\u5728\u306e\u4f4d\u7f6e\u3092\u53d6\u3063\u3066\u300d\u3068\u983c\u307f\u3001\u7d50\u679c\u304c\u623b\u3063\u3066\u304d\u3066\u304b\u3089\u3001\u524d\u56de\u3068\u540c\u3058\u534a\u5f84\u5224\u5b9a\u3068 API \u9001\u4fe1\u306b\u5165\u308a\u307e\u3059\u3002<\/p>\n<ol>\n<li>Timecard\uff08PHP\uff09\u304c\u4f4d\u7f6e\u53d6\u5f97\u3092\u8981\u6c42\u3059\u308b<\/li>\n<li>Bridge\uff08SimpleGeolocation.GetCurrentPosition\uff09\u7d4c\u7531\u3067\u30cd\u30a4\u30c6\u30a3\u30d6\u3078\u6e21\u3059<\/li>\n<li>Android \u306f Kotlin\u3001iOS \u306f Swift \u304c GPS \u3092\u53d6\u308b<\/li>\n<li>\u7d50\u679c\u3092 LocationReceived Event \u3068\u3057\u3066 PHP \u306b\u8fd4\u3059<\/li>\n<li>\u534a\u5f84\u5224\u5b9a\u306e\u3042\u3068\u3001\u554f\u984c\u306a\u3051\u308c\u3070\u6253\u523b API \u3078\u9001\u308b<\/li>\n<\/ol>\n<p>\u30d7\u30e9\u30b0\u30a4\u30f3\u69cb\u6210\u56f3\u306e\u8a18\u8ff0\u3067\u793a\u3059\u3068\u3059\u308b\u3068\u3001\u6b21\u306e\u3068\u304a\u308a\u3067\u3059\u3002<\/p>\n<p>Timecard\uff08PHP\uff09\u2192 Bridge\uff08SimpleGeolocation.GetCurrentPosition\uff09\u2192 Kotlin \/ Swift \u2192 LocationReceived Event \u2192 \u534a\u5f84\u5224\u5b9a \u2192 \u6253\u523b API<\/p>\n<p>\u524d\u56de\u3068\u9055\u3046\u306e\u306f\u3001\u4f4d\u7f6e\u306e\u53d6\u308a\u65b9\u3060\u3051\u3067\u3059\u3002\u5224\u5b9a\u3084 API \u9023\u643a\u306f\u305d\u306e\u307e\u307e\u4f7f\u3048\u307e\u3059\u3002<\/p>\n<h3>\uff13\uff09\u30d7\u30e9\u30b0\u30a4\u30f3\u30bd\u30fc\u30b9\u306e\u8aac\u660e<\/h3>\n<p>composer.json \u306f Composer \u7528\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u5b9a\u7fa9\u3067\u3059\u3002\u30d1\u30c3\u30b1\u30fc\u30b8\u540d\u3001PHP \/ NativePHP \u3078\u306e\u4f9d\u5b58\u3001\u30aa\u30fc\u30c8\u30ed\u30fc\u30c9\u3001ServiceProvider \u3068 nativephp.json \u306e\u5834\u6240\u3092\u3053\u3053\u3067\u6307\u5b9a\u3057\u307e\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>packages\/simple-geolocation\/composer.json\n\n{\n    \"name\": \"local\/simple-geolocation\",\n    \"description\": \"Minimal one-shot GPS plugin for NativePHP Mobile SuperNative (blog Part3)\",\n    \"type\": \"nativephp-plugin\",\n    \"version\": \"1.0.0\",\n    \"license\": \"MIT\",\n    \"authors\": &#91;\n        {\n            \"name\": \"Local\",\n            \"email\": \"dev@example.com\"\n        }\n    ],\n    \"require\": {\n        \"php\": \"^8.2\",\n        \"nativephp\/mobile\": \"^4.0\"\n    },\n    \"autoload\": {\n        \"psr-4\": {\n            \"Local\\\\SimpleGeolocation\\\\\": \"src\/\"\n        }\n    },\n    \"extra\": {\n        \"laravel\": {\n            \"providers\": &#91;\n                \"Local\\\\SimpleGeolocation\\\\SimpleGeolocationServiceProvider\"\n            ]\n        },\n        \"nativephp\": {\n            \"manifest\": \"nativephp.json\"\n        }\n    },\n    \"minimum-stability\": \"stable\"\n}<\/code><\/pre>\n\n\n<p>nativephp.json \u306f NativePHP \u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30de\u30cb\u30d5\u30a7\u30b9\u30c8\u3067\u3059\u3002Bridge \u540d\uff08 SimpleGeolocation.GetCurrentPosition \uff09\u3001Android \/ iOS \u306e\u5b9f\u88c5\u30af\u30e9\u30b9\u3001\u4f4d\u7f6e\u60c5\u5831\u306e\u6a29\u9650\u3001\u8fd4\u3059 Event\u3001ServiceProvider \u3092\u5ba3\u8a00\u3057\u307e\u3059\u3002\u3053\u3053\u304c\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u5165\u53e3\u3067\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>packages\/simple-geolocation\/nativephp.json\n\n{\n    \"name\": \"local\/simple-geolocation\",\n    \"version\": \"1.0.0\",\n    \"description\": \"Minimal one-shot GPS for NativePHP Mobile SuperNative screens\",\n    \"namespace\": \"SimpleGeolocation\",\n    \"keywords\": &#91;\"geolocation\", \"gps\", \"location\"],\n    \"category\": \"utilities\",\n    \"license\": \"MIT\",\n    \"pricing\": {\n        \"type\": \"free\"\n    },\n    \"platforms\": &#91;\"android\", \"ios\"],\n    \"bridge_functions\": &#91;\n        {\n            \"name\": \"SimpleGeolocation.GetCurrentPosition\",\n            \"android\": \"com.local.plugins.simplegeolocation.SimpleGeolocationFunctions.GetCurrentPosition\",\n            \"ios\": \"SimpleGeolocationFunctions.GetCurrentPosition\",\n            \"android_params\": &#91;\"activity\"],\n            \"description\": \"Request a one-shot GPS fix and dispatch LocationReceived\"\n        }\n    ],\n    \"android\": {\n        \"min_version\": 26,\n        \"permissions\": &#91;\n            \"android.permission.ACCESS_COARSE_LOCATION\",\n            \"android.permission.ACCESS_FINE_LOCATION\"\n        ],\n        \"repositories\": &#91;],\n        \"dependencies\": {\n            \"implementation\": &#91;]\n        }\n    },\n    \"ios\": {\n        \"min_version\": \"15.0\",\n        \"info_plist\": {\n            \"NSLocationWhenInUseUsageDescription\": \"\u51fa\u9000\u52e4\u306e\u6253\u523b\u6642\u306b\u3001\u4f1a\u793e\u6240\u5728\u5730\u3068\u306e\u8ddd\u96e2\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b\u4f4d\u7f6e\u60c5\u5831\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002\"\n        },\n        \"dependencies\": {\n            \"swift_packages\": &#91;],\n            \"pods\": &#91;]\n        }\n    },\n    \"events\": &#91;\n        \"Local\\\\SimpleGeolocation\\\\Events\\\\LocationReceived\"\n    ],\n    \"service_provider\": \"Local\\\\SimpleGeolocation\\\\SimpleGeolocationServiceProvider\"\n}<\/code><\/pre>\n\n\n<p>SimpleGeolocation.php \u306f\u30e2\u30d0\u30a4\u30eb\u30a2\u30d7\u30ea\u5074\u304b\u3089 SimpleGeolocation:: \u301c \u3068\u66f8\u304f\u305f\u3081\u306e Facade \u3067\u3059\u3002Timecard \u306f\u3053\u306e\u30af\u30e9\u30b9\u7d4c\u7531\u3067\u4f4d\u7f6e\u53d6\u5f97\u3092\u547c\u3073\u51fa\u3057\u307e\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>packages\/simple-geolocation\/src\/Facades\/SimpleGeolocation.php\n\n&lt;?php\n\nnamespace Local\\SimpleGeolocation\\Facades;\n\nuse Illuminate\\Support\\Facades\\Facade;\nuse Local\\SimpleGeolocation\\PendingGetCurrentPosition;\n\n\/**\n * @method static PendingGetCurrentPosition getCurrentPosition(bool $fineAccuracy = true)\n *\n * @see \\Local\\SimpleGeolocation\\SimpleGeolocation\n *\/\nclass SimpleGeolocation extends Facade\n{\n    protected static function getFacadeAccessor(): string\n    {\n        return \\Local\\SimpleGeolocation\\SimpleGeolocation::class;\n    }\n}<\/code><\/pre>\n\n\n<p>SimpleGeolocation.php \u306f Facade \u306e\u5b9f\u4f53\u3067\u3059\u3002getCurrentPosition() \u306f\u3059\u3050\u5ea7\u6a19\u3092\u8fd4\u3055\u305a\u3001\u4f9d\u983c\u7528\u306e PendingGetCurrentPosition \u3092\u8fd4\u3057\u307e\u3059\u3002<\/p>\n<p>\u3055\u304d\u307b\u3069\u306e Facades \u914d\u4e0b\u3068\u30d5\u30a1\u30a4\u30eb\u540d\u304c\u540c\u3058\u3067\u3001\u3069\u3061\u3089\u3082 SimpleGeolocation.php \u3067\u3059\u304c\u3001Facades \u914d\u4e0b\u306f\u547c\u3073\u51fa\u3057\u7528\u3001\u3053\u3061\u3089\u306f\u5b9f\u4f53\u3067\u3059\u3002\u540d\u524d\u7a7a\u9593\u304c\u9055\u3046\u306e\u3067\u5225\u30af\u30e9\u30b9\u3067\u3059\u3002<\/p>\n<\/p>\n\n\n<pre class=\"wp-block-code\"><code>packages\/simple-geolocation\/src\/SimpleGeolocation.php\n\n&lt;?php\n\nnamespace Local\\SimpleGeolocation;\n\nclass SimpleGeolocation\n{\n    \/**\n     * Request a one-shot GPS fix.\n     * Listen with -&gt;locationReceived() or #&#91;On(LocationReceived::class)].\n     *\/\n    public function getCurrentPosition(bool $fineAccuracy = true): PendingGetCurrentPosition\n    {\n        return (new PendingGetCurrentPosition)-&gt;fineAccuracy($fineAccuracy);\n    }\n}<\/code><\/pre>\n\n\n<p>PendingGetCurrentPosition.php \u306f\u4f4d\u7f6e\u53d6\u5f97\u306e\u4f9d\u983c\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3067\u3059\u3002 locationReceived(&#8230;) \u3067\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u3092\u767b\u9332\u3057\u3001\u30c7\u30b9\u30c8\u30e9\u30af\u30bf\uff08\u307e\u305f\u306f get() \uff09\u3067 NativePHP \u672c\u4f53\u306e nativephp_call \u3092\u547c\u3073\u51fa\u3057\u3066 Bridge \u306b\u6e21\u3057\u307e\u3059\u3002\u7d50\u679c\u306e\u53d7\u3051\u53d6\u308a\u53e3\u306f LocationReceived \u3067\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>packages\/simple-geolocation\/src\/PendingGetCurrentPosition.php\n\n&lt;?php\n\nnamespace Local\\SimpleGeolocation;\n\nuse Illuminate\\Support\\Str;\nuse Native\\Mobile\\Concerns\\HandlesNativeCallbacks;\nuse Local\\SimpleGeolocation\\Events\\LocationReceived;\n\n\/**\n * @method $this locationReceived(\\Closure|array|string $callback)\n *\/\nclass PendingGetCurrentPosition\n{\n    use HandlesNativeCallbacks;\n\n    protected ?string $id = null;\n\n    protected string $eventClass = LocationReceived::class;\n\n    protected bool $fineAccuracy = true;\n\n    protected bool $started = false;\n\n    public function id(string $id): self\n    {\n        $this-&gt;id = $id;\n\n        return $this;\n    }\n\n    public function getId(): string\n    {\n        if ($this-&gt;id === null) {\n            $this-&gt;id = (string) Str::uuid();\n        }\n\n        return $this-&gt;id;\n    }\n\n    public function fineAccuracy(bool $fine = true): self\n    {\n        $this-&gt;fineAccuracy = $fine;\n\n        return $this;\n    }\n\n    public function get(): bool\n    {\n        if ($this-&gt;started) {\n            return false;\n        }\n\n        $this-&gt;started = true;\n\n        if (! function_exists('nativephp_call')) {\n            return false;\n        }\n\n        nativephp_call('SimpleGeolocation.GetCurrentPosition', json_encode(&#91;\n            'id' =&gt; $this-&gt;getId(),\n            'event' =&gt; $this-&gt;eventClass,\n            'fineAccuracy' =&gt; $this-&gt;fineAccuracy,\n        ]));\n\n        return true;\n    }\n\n    public function __destruct()\n    {\n        if (! $this-&gt;started) {\n            $this-&gt;get();\n        }\n    }\n}<\/code><\/pre>\n\n\n<p>LocationReceived.php \u306f\u30cd\u30a4\u30c6\u30a3\u30d6\u304b\u3089\u623b\u3063\u3066\u304d\u305f\u7d50\u679c\u3092\u8868\u3059 Event \u3067\u3059\u3002\u6210\u529f\u53ef\u5426\u3001\u7def\u5ea6\u30fb\u7d4c\u5ea6\u3001\u7cbe\u5ea6\u3001\u30a8\u30e9\u30fc\u30e1\u30c3\u30bb\u30fc\u30b8\u3001\u30ea\u30af\u30a8\u30b9\u30c8 ID \u3092\u6301\u3061\u307e\u3059\u3002Timecard \u306e locationReceived \u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u306b\u6e21\u308b $event \u304c\u3053\u308c\u3067\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>packages\/simple-geolocation\/src\/Events\/LocationReceived.php\n\n&lt;?php\n\nnamespace Local\\SimpleGeolocation\\Events;\n\nuse Illuminate\\Foundation\\Events\\Dispatchable;\n\nclass LocationReceived\n{\n    use Dispatchable;\n\n    public function __construct(\n        public bool $success,\n        public ?float $latitude = null,\n        public ?float $longitude = null,\n        public ?float $accuracy = null,\n        public ?string $error = null,\n        public ?string $id = null,\n    ) {}\n}<\/code><\/pre>\n\n\n<p>SimpleGeolocationServiceProvider.php\u00a0\u306f Laravel \u306e ServiceProvider \u3067\u3059\u3002SimpleGeolocation \u3092\u30b3\u30f3\u30c6\u30ca\u306b singleton \u767b\u9332\u3057\u307e\u3059\u3002composer.json \/ nativephp.json \u306e\u4e21\u65b9\u304b\u3089\u53c2\u7167\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>packages\/simple-geolocation\/src\/SimpleGeolocationServiceProvider.php\n\n&lt;?php\n\nnamespace Local\\SimpleGeolocation;\n\nuse Illuminate\\Support\\ServiceProvider;\n\nclass SimpleGeolocationServiceProvider extends ServiceProvider\n{\n    public function register(): void\n    {\n        $this-&gt;app-&gt;singleton(SimpleGeolocation::class);\n    }\n\n    public function boot(): void\n    {\n        \/\/\n    }\n}<\/code><\/pre>\n\n\n<p>SimpleGeolocationFunctions.kt \u306f\u00a0Android \u5074\u306e Bridge \u5b9f\u88c5\u3067\u3059\u3002GetCurrentPosition \u304c PHP \u304b\u3089\u306e\u547c\u3073\u51fa\u3057\u3092\u53d7\u3051\u3001\u6a29\u9650\u78ba\u8a8d\u306e\u3042\u3068 LocationManager \u3067\u4f4d\u7f6e\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002\u6210\u529f\uff0f\u5931\u6557\u306f LocationReceived \u76f8\u5f53\u306e Event \u3068\u3057\u3066 PHP \u306b\u8fd4\u3057\u307e\u3059\u3002<\/p>\n<p>\u4e3b\u306b\u30a8\u30df\u30e5\u30ec\u30fc\u30bf\u3067\u4f4d\u7f6e\u306e\u66f4\u65b0\u304c\u6765\u306b\u304f\u3044\u3053\u3068\u3078\u306e\u5bfe\u7b56\u3068\u3057\u3066\u3001\u6b21\u306e\u5de5\u592b\u3092\u5165\u308c\u3066\u3044\u307e\u3059\u3002\u5b9f\u6a5f\u3067\u3082\u5c4b\u5185\u3084\u8d77\u52d5\u76f4\u5f8c\u306a\u3069\u3067\u306f\u5f79\u7acb\u3061\u307e\u3059\u304c\u3001\u6253\u523b\u306e\u3088\u3046\u306b\u534a\u5f84\u306e\u72ed\u3044\u7528\u9014\u3067\u306f\u3001\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u65b0\u3057\u3055\u306b\u3082\u6ce8\u610f\u304c\u5fc5\u8981\u3067\u3059\u3002<\/p>\n<ol>\n<li>\u6570\u5206\u4ee5\u5185\u306e\u6700\u7d42\u4f4d\u7f6e\u30ad\u30e3\u30c3\u30b7\u30e5\u304c\u3042\u308c\u3070\u3059\u3050\u8fd4\u3059\uff08geo fix \u76f4\u5f8c\u306b\u52b9\u304f\uff09<\/li>\n<li>\u8907\u6570\u30d7\u30ed\u30d0\u30a4\u30c0\u3067\u8cfc\u8aad\u3059\u308b\uff08GPS \/ NETWORK \/ PASSIVE \u306a\u3069\uff09<\/li>\n<li>\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u6642\u3082 last-known \u304c\u3042\u308c\u3070\u30d5\u30a9\u30fc\u30eb\u30d0\u30c3\u30af\u3059\u308b<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\"><code>packages\/simple-geolocation\/resources\/android\/SimpleGeolocationFunctions.kt\n\npackage com.local.plugins.simplegeolocation\n\nimport android.Manifest\nimport android.annotation.SuppressLint\nimport android.content.Context\nimport android.content.pm.PackageManager\nimport android.location.Criteria\nimport android.location.Location\nimport android.location.LocationListener\nimport android.location.LocationManager\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.Handler\nimport android.os.Looper\nimport androidx.activity.result.contract.ActivityResultContracts\nimport androidx.core.content.ContextCompat\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentActivity\nimport com.nativephp.mobile.bridge.BridgeFunction\nimport com.nativephp.mobile.utils.NativeActionCoordinator\nimport org.json.JSONObject\n\n\/**\n * Minimal one-shot GPS bridge for SuperNative screens.\n *\n * Emulators often keep a last-known fix but never deliver a fresh GPS\n * update. Prefer a recent cache, listen on multiple providers, and fall\n * back to any last-known location on timeout.\n *\/\nobject SimpleGeolocationFunctions {\n\n    class GetCurrentPosition(private val activity: FragmentActivity) : BridgeFunction {\n        override fun execute(parameters: Map&lt;String, Any&gt;): Map&lt;String, Any&gt; {\n            val id = parameters&#91;\"id\"] as? String\n            val event = parameters&#91;\"event\"] as? String\n                ?: \"Local\\\\SimpleGeolocation\\\\Events\\\\LocationReceived\"\n            val fineAccuracy = when (val value = parameters&#91;\"fineAccuracy\"]) {\n                is Boolean -&gt; value\n                is Number -&gt; value.toInt() != 0\n                else -&gt; true\n            }\n\n            Handler(Looper.getMainLooper()).post {\n                ensureHelper(activity).requestLocation(\n                    id = id,\n                    event = event,\n                    fineAccuracy = fineAccuracy,\n                )\n            }\n\n            return emptyMap()\n        }\n    }\n\n    private fun ensureHelper(activity: FragmentActivity): LocationHelperFragment {\n        val tag = \"SimpleGeolocationHelper\"\n        val existing = activity.supportFragmentManager.findFragmentByTag(tag) as? LocationHelperFragment\n        if (existing != null) {\n            return existing\n        }\n\n        val helper = LocationHelperFragment()\n        activity.supportFragmentManager.beginTransaction()\n            .add(helper, tag)\n            .commitNowAllowingStateLoss()\n\n        return helper\n    }\n}\n\nclass LocationHelperFragment : Fragment() {\n    private var pendingId: String? = null\n    private var pendingEvent: String = \"Local\\\\SimpleGeolocation\\\\Events\\\\LocationReceived\"\n    private var pendingFine: Boolean = true\n    private var locationListener: LocationListener? = null\n    private var settled = false\n    private val timeoutHandler = Handler(Looper.getMainLooper())\n\n    private val permissionLauncher = registerForActivityResult(\n        ActivityResultContracts.RequestMultiplePermissions()\n    ) { result -&gt;\n        val granted = result&#91;Manifest.permission.ACCESS_FINE_LOCATION] == true ||\n            result&#91;Manifest.permission.ACCESS_COARSE_LOCATION] == true\n\n        if (granted) {\n            fetchLocation()\n        } else {\n            dispatchError(\"\u4f4d\u7f6e\u60c5\u5831\u306e\u5229\u7528\u304c\u8a31\u53ef\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u7aef\u672b\u306e\u8a2d\u5b9a\u304b\u3089\u4f4d\u7f6e\u60c5\u5831\u3092\u8a31\u53ef\u3057\u3066\u304f\u3060\u3055\u3044\u3002\")\n        }\n    }\n\n    fun requestLocation(id: String?, event: String, fineAccuracy: Boolean) {\n        pendingId = id\n        pendingEvent = event\n        pendingFine = fineAccuracy\n        settled = false\n\n        val fine = ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_FINE_LOCATION)\n        val coarse = ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.ACCESS_COARSE_LOCATION)\n\n        if (fine == PackageManager.PERMISSION_GRANTED || coarse == PackageManager.PERMISSION_GRANTED) {\n            fetchLocation()\n            return\n        }\n\n        permissionLauncher.launch(\n            arrayOf(\n                Manifest.permission.ACCESS_FINE_LOCATION,\n                Manifest.permission.ACCESS_COARSE_LOCATION,\n            )\n        )\n    }\n\n    @SuppressLint(\"MissingPermission\")\n    private fun fetchLocation() {\n        val context = context ?: run {\n            dispatchError(\"\u4f4d\u7f6e\u60c5\u5831\u3092\u53d6\u5f97\u3059\u308b\u6e96\u5099\u304c\u3067\u304d\u3066\u3044\u307e\u305b\u3093\u3002\")\n            return\n        }\n\n        val manager = context.getSystemService(Context.LOCATION_SERVICE) as? LocationManager\n        if (manager == null) {\n            dispatchError(\"\u3053\u306e\u7aef\u672b\u3067\u306f\u4f4d\u7f6e\u60c5\u5831\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3002\")\n            return\n        }\n\n        \/\/ Fresh enough cache \u2192 return immediately (common on emulators after geo fix).\n        bestLastKnownLocation(manager)?.let { last -&gt;\n            if (locationAgeMs(last) &lt;= FRESH_CACHE_MS) {\n                dispatchSuccess(last)\n                return\n            }\n        }\n\n        val providers = preferredProviders(manager)\n        if (providers.isEmpty()) {\n            bestLastKnownLocation(manager)?.let {\n                dispatchSuccess(it)\n                return\n            }\n            dispatchError(\"\u73fe\u5728\u5730\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u7aef\u672b\u306e\u4f4d\u7f6e\u60c5\u5831\u3092\u30aa\u30f3\u306b\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002\")\n            return\n        }\n\n        val listener = object : LocationListener {\n            override fun onLocationChanged(location: Location) {\n                settleSuccess(manager, location)\n            }\n\n            @Deprecated(\"Deprecated in Java\")\n            override fun onStatusChanged(provider: String?, status: Int, extras: Bundle?) {}\n\n            override fun onProviderEnabled(provider: String) {}\n\n            override fun onProviderDisabled(provider: String) {}\n        }\n\n        locationListener = listener\n\n        try {\n            for (provider in providers) {\n                if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.R) {\n                    manager.getCurrentLocation(provider, null, context.mainExecutor) { location -&gt;\n                        if (location != null) {\n                            settleSuccess(manager, location)\n                        }\n                    }\n                }\n\n                manager.requestLocationUpdates(provider, 0L, 0f, listener, Looper.getMainLooper())\n            }\n        } catch (e: Exception) {\n            cleanupListener(manager)\n            bestLastKnownLocation(manager)?.let {\n                dispatchSuccess(it)\n                return\n            }\n            dispatchError(e.message ?: \"\u4f4d\u7f6e\u60c5\u5831\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\")\n            return\n        }\n\n        timeoutHandler.postDelayed({\n            if (settled) {\n                return@postDelayed\n            }\n\n            cleanupListener(manager)\n            bestLastKnownLocation(manager)?.let {\n                dispatchSuccess(it)\n                return@postDelayed\n            }\n\n            dispatchError(\"\u4f4d\u7f6e\u60c5\u5831\u306e\u53d6\u5f97\u304c\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3057\u307e\u3057\u305f\u3002\u96fb\u6ce2\u72b6\u6cc1\u3092\u78ba\u8a8d\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002\")\n        }, TIMEOUT_MS)\n    }\n\n    private fun preferredProviders(manager: LocationManager): List&lt;String&gt; {\n        val criteria = Criteria().apply {\n            accuracy = if (pendingFine) Criteria.ACCURACY_FINE else Criteria.ACCURACY_COARSE\n            powerRequirement = Criteria.POWER_HIGH\n        }\n\n        val ordered = linkedSetOf&lt;String&gt;()\n        manager.getBestProvider(criteria, true)?.let { ordered.add(it) }\n\n        listOf(\n            LocationManager.GPS_PROVIDER,\n            LocationManager.NETWORK_PROVIDER,\n            LocationManager.PASSIVE_PROVIDER,\n        ).forEach { name -&gt;\n            if (manager.isProviderEnabled(name) || manager.allProviders.contains(name)) {\n                ordered.add(name)\n            }\n        }\n\n        manager.getProviders(true).forEach { ordered.add(it) }\n\n        return ordered.filter { provider -&gt;\n            try {\n                manager.isProviderEnabled(provider) || provider == LocationManager.PASSIVE_PROVIDER\n            } catch (_: Exception) {\n                false\n            }\n        }\n    }\n\n    @SuppressLint(\"MissingPermission\")\n    private fun bestLastKnownLocation(manager: LocationManager): Location? {\n        val providers = try {\n            manager.getProviders(true).ifEmpty { manager.allProviders }\n        } catch (_: Exception) {\n            manager.allProviders\n        }\n\n        return providers.mapNotNull { provider -&gt;\n            try {\n                manager.getLastKnownLocation(provider)\n            } catch (_: Exception) {\n                null\n            }\n        }.maxWithOrNull(compareBy&lt;Location&gt; { it.time }.thenByDescending { it.accuracy })\n    }\n\n    private fun locationAgeMs(location: Location): Long {\n        return if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.JELLY_BEAN_MR1) {\n            val ageElapsed = android.os.SystemClock.elapsedRealtimeNanos() - location.elapsedRealtimeNanos\n            (ageElapsed \/ 1_000_000L).coerceAtLeast(0L)\n        } else {\n            (System.currentTimeMillis() - location.time).coerceAtLeast(0L)\n        }\n    }\n\n    private fun settleSuccess(manager: LocationManager, location: Location) {\n        if (settled) {\n            return\n        }\n        settled = true\n        cleanupListener(manager)\n        dispatchSuccess(location)\n    }\n\n    private fun cleanupListener(manager: LocationManager) {\n        timeoutHandler.removeCallbacksAndMessages(null)\n        locationListener?.let {\n            try {\n                manager.removeUpdates(it)\n            } catch (_: Exception) {\n            }\n        }\n        locationListener = null\n    }\n\n    private fun dispatchSuccess(location: Location) {\n        settled = true\n        val payload = JSONObject()\n            .put(\"success\", true)\n            .put(\"latitude\", location.latitude)\n            .put(\"longitude\", location.longitude)\n            .put(\"accuracy\", location.accuracy.toDouble())\n            .put(\"error\", JSONObject.NULL)\n            .put(\"id\", pendingId ?: JSONObject.NULL)\n\n        NativeActionCoordinator.dispatchEvent(\n            requireActivity(),\n            pendingEvent,\n            payload.toString(),\n        )\n    }\n\n    private fun dispatchError(message: String) {\n        settled = true\n        val host = activity ?: return\n        val payload = JSONObject()\n            .put(\"success\", false)\n            .put(\"latitude\", JSONObject.NULL)\n            .put(\"longitude\", JSONObject.NULL)\n            .put(\"accuracy\", JSONObject.NULL)\n            .put(\"error\", message)\n            .put(\"id\", pendingId ?: JSONObject.NULL)\n\n        NativeActionCoordinator.dispatchEvent(host, pendingEvent, payload.toString())\n    }\n\n    companion object {\n        private const val FRESH_CACHE_MS = 5 * 60 * 1000L\n        private const val TIMEOUT_MS = 20_000L\n    }\n}<\/code><\/pre>\n\n\n<p>SimpleGeolocationFunctions.swift\u00a0\u306f iOS \u5074\u306e Bridge \u5b9f\u88c5\u3067\u3059\u3002CLLocationManager \u3067\u30ef\u30f3\u30b7\u30e7\u30c3\u30c8\u53d6\u5f97\uff08 requestLocation() \uff09\u3092\u884c\u3044\u307e\u3059\u3002\u672a\u8a31\u53ef\u306a\u3089 requestWhenInUseAuthorization() \u3092\u51fa\u3057\u3001\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u6642\u306f\u53d6\u5f97\u6e08\u307f\u306e location \u304c\u3042\u308c\u3070\u305d\u308c\u3092\u8fd4\u3057\u307e\u3059\u3002\u6a29\u9650\u30c0\u30a4\u30a2\u30ed\u30b0\u306e\u8aac\u660e\u6587\u306f nativephp.json \u306e NSLocationWhenInUseUsageDescription \u3067\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>packages\/simple-geolocation\/resources\/ios\/Sources\/SimpleGeolocationFunctions.swift\n\nimport CoreLocation\nimport Foundation\n\n\/\/\/ Minimal one-shot GPS bridge for SuperNative screens.\nenum SimpleGeolocationFunctions {\n\n    class GetCurrentPosition: NSObject, BridgeFunction, CLLocationManagerDelegate {\n        private let locationManager = CLLocationManager()\n        private var pendingId: String?\n        private var pendingEvent: String = \"Local\\\\SimpleGeolocation\\\\Events\\\\LocationReceived\"\n        private var fineAccuracy: Bool = true\n        private var started = false\n        private var timeoutWorkItem: DispatchWorkItem?\n\n        func execute(parameters: &#91;String: Any]) throws -&gt; &#91;String: Any] {\n            pendingId = parameters&#91;\"id\"] as? String\n            pendingEvent = parameters&#91;\"event\"] as? String\n                ?? \"Local\\\\SimpleGeolocation\\\\Events\\\\LocationReceived\"\n            fineAccuracy = (parameters&#91;\"fineAccuracy\"] as? Bool) ?? true\n            started = false\n\n            DispatchQueue.main.async {\n                self.locationManager.delegate = self\n                self.locationManager.desiredAccuracy = self.fineAccuracy\n                    ? kCLLocationAccuracyBest\n                    : kCLLocationAccuracyHundredMeters\n\n                switch self.locationManager.authorizationStatus {\n                case .authorizedAlways, .authorizedWhenInUse:\n                    self.startUpdating()\n                case .notDetermined:\n                    self.locationManager.requestWhenInUseAuthorization()\n                case .denied, .restricted:\n                    self.dispatchError(\"\u4f4d\u7f6e\u60c5\u5831\u306e\u5229\u7528\u304c\u8a31\u53ef\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u7aef\u672b\u306e\u8a2d\u5b9a\u304b\u3089\u4f4d\u7f6e\u60c5\u5831\u3092\u8a31\u53ef\u3057\u3066\u304f\u3060\u3055\u3044\u3002\")\n                @unknown default:\n                    self.dispatchError(\"\u4f4d\u7f6e\u60c5\u5831\u306e\u53d6\u5f97\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002\")\n                }\n            }\n\n            return &#91;:]\n        }\n\n        private func startUpdating() {\n            guard !started else { return }\n            started = true\n            locationManager.requestLocation()\n\n            let work = DispatchWorkItem { &#91;weak self] in\n                guard let self else { return }\n                if let location = self.locationManager.location {\n                    self.dispatchSuccess(location)\n                    return\n                }\n                self.dispatchError(\"\u4f4d\u7f6e\u60c5\u5831\u306e\u53d6\u5f97\u304c\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3057\u307e\u3057\u305f\u3002\u96fb\u6ce2\u72b6\u6cc1\u3092\u78ba\u8a8d\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002\")\n            }\n            timeoutWorkItem = work\n            DispatchQueue.main.asyncAfter(deadline: .now() + 20, execute: work)\n        }\n\n        func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {\n            switch manager.authorizationStatus {\n            case .authorizedAlways, .authorizedWhenInUse:\n                startUpdating()\n            case .denied, .restricted:\n                dispatchError(\"\u4f4d\u7f6e\u60c5\u5831\u306e\u5229\u7528\u304c\u8a31\u53ef\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u7aef\u672b\u306e\u8a2d\u5b9a\u304b\u3089\u4f4d\u7f6e\u60c5\u5831\u3092\u8a31\u53ef\u3057\u3066\u304f\u3060\u3055\u3044\u3002\")\n            default:\n                break\n            }\n        }\n\n        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: &#91;CLLocation]) {\n            timeoutWorkItem?.cancel()\n            guard let location = locations.last else {\n                dispatchError(\"\u73fe\u5728\u5730\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u7aef\u672b\u306e\u4f4d\u7f6e\u60c5\u5831\u3092\u30aa\u30f3\u306b\u3057\u3066\u3001\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002\")\n                return\n            }\n\n            dispatchSuccess(location)\n        }\n\n        private func dispatchSuccess(_ location: CLLocation) {\n            timeoutWorkItem?.cancel()\n            var payload: &#91;String: Any] = &#91;\n                \"success\": true,\n                \"latitude\": location.coordinate.latitude,\n                \"longitude\": location.coordinate.longitude,\n                \"accuracy\": location.horizontalAccuracy,\n            ]\n            if let pendingId {\n                payload&#91;\"id\"] = pendingId\n            }\n\n            LaravelBridge.shared.send?(pendingEvent, payload)\n        }\n\n        func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {\n            timeoutWorkItem?.cancel()\n            dispatchError(error.localizedDescription)\n        }\n\n        private func dispatchError(_ message: String) {\n            timeoutWorkItem?.cancel()\n            var payload: &#91;String: Any] = &#91;\n                \"success\": false,\n                \"error\": message,\n            ]\n            if let pendingId {\n                payload&#91;\"id\"] = pendingId\n            }\n            LaravelBridge.shared.send?(pendingEvent, payload)\n        }\n    }\n}<\/code><\/pre>\n\n\n<h3>\uff14\uff09\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u5c0e\u5165<\/h3>\n<p>\u4ee5\u4e0b\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u3001\u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>$ composer config repositories.simple-geolocation path packages\/simple-geolocation\n$ composer require local\/simple-geolocation:@dev\n$ php artisan native:plugin:register local\/simple-geolocation\n$ php artisan native:plugin:list\n$ php artisan native:run android --no-interaction --no-tty<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"890\" height=\"616\" src=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-07.png\" alt=\"\" class=\"wp-image-9365\" srcset=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-07.png 890w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-07-300x208.png 300w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-07-768x532.png 768w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-07-150x104.png 150w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-07-218x150.png 218w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-07-696x482.png 696w\" sizes=\"auto, (max-width: 890px) 100vw, 890px\" \/><\/figure>\n\n\n<p dir=\"ltr\">\u30d7\u30e9\u30b0\u30a4\u30f3\u8ffd\u52a0\u5f8c\u306f\u3001\u30cd\u30a4\u30c6\u30a3\u30d6\u30b3\u30fc\u30c9\u304c\u30a2\u30d7\u30ea\u306b\u7d44\u307f\u8fbc\u307e\u308c\u308b\u306e\u3067 \u518d\u30d3\u30eb\u30c9\uff08 native:run \uff09\u304c\u5fc5\u8981\u3067\u3059\u3002PHP \/ Blade \u3060\u3051\u89e6\u3063\u305f\u5834\u5408\u3082\u3001\u53cd\u6620\u306f native:run \u3067\u884c\u3044\u307e\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>$ php artisan native:run android --no-interaction --no-tty<\/code><\/pre>\n\n\n<h3>\uff15\uff09Timecard \u304b\u3089\u306e\u547c\u3073\u51fa\u3057<\/h3>\n<p><a href=\"https:\/\/nativephp.com\/\">NativePHP<\/a> \u306b\u306f\u3001<a href=\"https:\/\/nativephp.com\/plugins\/nativephp\/mobile-geolocation#usage\">\u4f4d\u7f6e\u60c5\u5831\u7528\u306e Facade \uff08 Geolocation \uff09<\/a>\u00a0\u304c\u3042\u308a\u307e\u3059\u3002 \u547c\u3073\u65b9\u306f\u6b21\u306e\u3088\u3046\u306a\u5f62\u3067\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>Geolocation::getCurrentPosition()\n    -&gt;locationReceived(function ($event) { ... });<\/code><\/pre>\n\n\n<p>\u4eca\u56de\u306e\u81ea\u4f5c\u30d7\u30e9\u30b0\u30a4\u30f3\u3082\u3001\u30e2\u30d0\u30a4\u30eb\u30a2\u30d7\u30ea\u5074\u304b\u3089\u306f\u540c\u3058\u6d41\u308c\u3067\u4f7f\u3048\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u307e\u3059\u3002\u30af\u30e9\u30b9\u540d\u304c SimpleGeolocation\u00a0\u306b\u5909\u308f\u308b\u30a4\u30e1\u30fc\u30b8\u3067\u3059\u3002<\/p>\n<p><a href=\"https:\/\/www.wetch.co.jp\/note\/\u30d0\u30c3\u30af\u30a8\u30f3\u30c9\u306e\u4eba\u304cnativephp\u306e\u529b\u3092\u501f\u308a\u3066\u521d\u3081\u3066\u30e2\u30d0\u30a4-2\/\">\u524d\u56de\u306e\u30bf\u30a4\u30e0\u30ec\u30b3\u30fc\u30c0\u30fc\u753b\u9762<\/a>\u3067\u300c\u624b\u52d5\u5ea7\u6a19\u3092\u4f7f\u3046\u300d\u306e\u30c1\u30a7\u30c3\u30af\u3092 OFF \u306b\u3059\u308b\u3068\u3001\u3053\u306e\u7d4c\u8def\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>app\/NativeComponents\/Timecard.php\uff08\u629c\u7c8b\uff09\n                \u30fb\n                \u30fb\n                \u30fb\n            SimpleGeolocation::getCurrentPosition(true)\n                -&gt;id('timecard-punch')\n                -&gt;locationReceived(function ($event) {\n                    if (! ($event-&gt;success ?? false)) {\n                        $this-&gt;finishWithError(\n                            $this-&gt;geolocationErrorMessage($event-&gt;error ?? null)\n                        );\n\n                        return;\n                    }\n\n                    $type = $this-&gt;pendingType;\n\n                    if ($type === null) {\n                        $this-&gt;finishWithError('\u6253\u523b\u7a2e\u5225\u304c\u4e0d\u660e\u3067\u3059\u3002');\n\n                        return;\n                    }\n\n                    $this-&gt;submitPunch(\n                        $type,\n                        (float) $event-&gt;latitude,\n                        (float) $event-&gt;longitude,\n                        isset($event-&gt;accuracy) ? (float) $event-&gt;accuracy : null,\n                    );\n                });\n                \u30fb\n                \u30fb\n                \u30fb<\/code><\/pre>\n\n\n<p>\u3053\u3053\u3067\u306e\u30dd\u30a4\u30f3\u30c8\u306f\u6b21\u306e2\u3064\u3067\u3059\u3002<\/p>\n<ol>\n<li>\n<p>SimpleGeolocation::getCurrentPosition(true)<br \/>\u3053\u3053\u3067\u4f4d\u7f6e\u53d6\u5f97\u3092\u4f9d\u983c\u3057\u307e\u3059\u3002true \u306f\u9ad8\u7cbe\u5ea6\uff08GPS\uff09\u5bc4\u308a\u306e\u6307\u5b9a\u3067\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>-&gt;locationReceived(function ($event) { &#8230; })<br \/>\u7d50\u679c\u304c\u8fd4\u3063\u3066\u304d\u305f\u3068\u304d\u306b\u5b9f\u884c\u3059\u308b\u51e6\u7406\u3092\u6e21\u3057\u307e\u3059\u3002\u307e\u3060\u3053\u306e\u6642\u70b9\u3067\u306f\u5ea7\u6a19\u306f\u5165\u3063\u3066\u3044\u307e\u305b\u3093\u3002<\/p>\n<\/li>\n<\/ol>\n<p>\u5ea7\u6a19\u306f\u3059\u3050 return \u3055\u308c\u308b\u306e\u3067\u306f\u306a\u304f\u3001\u3042\u3068\u304b\u3089\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u306e $event \u306b\u5165\u308a\u307e\u3059\u3002\u305d\u306e $event \u3092\u4f7f\u3063\u3066 submitPunch\uff08\u534a\u5f84\u5224\u5b9a \u2192 \u6253\u523b API\uff09\u3078\u9032\u3080\u3068\u3053\u308d\u306f\u3001\u524d\u56de\u3068\u540c\u3058\u3067\u3059\u3002<\/p>\n<h3>\uff16\uff09PHP \u304b\u3089\u30cd\u30a4\u30c6\u30a3\u30d6\u3078\u6e21\u308b\u3068\u3053\u308d<\/h3>\n<p>Timecard \u306e\u547c\u3073\u51fa\u3057\u306e\u88cf\u5074\u306f\u3001\u6b21\u306e\u6d41\u308c\u3067\u3059\u3002<\/p>\n<ol>\n<li>\n<p>SimpleGeolocation::getCurrentPosition(true)<br \/>\u3053\u3053\u3067\u4f4d\u7f6e\u53d6\u5f97\u3092\u4f9d\u983c\u3057\u307e\u3059\u3002\u8fd4\u308a\u5024\u306f\u3059\u3050\u5ea7\u6a19\u3067\u306f\u306a\u304f\u3001\u4f9d\u983c\u7528\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8 PendingGetCurrentPosition \u3067\u3059\u3002<br \/>true \u306f\u9ad8\u7cbe\u5ea6\uff08GPS\uff09\u5bc4\u308a\u306e\u6307\u5b9a\u3067\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>-&gt;locationReceived(function ($event) { &#8230; })<br \/>\u7d50\u679c\u304c\u8fd4\u3063\u3066\u304d\u305f\u3068\u304d\u306b\u5b9f\u884c\u3059\u308b\u51e6\u7406\u3092\u3001\u3053\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b\u767b\u9332\u3057\u307e\u3059\u3002<br \/>\u307e\u3060\u3053\u306e\u6642\u70b9\u3067\u306f\u5ea7\u6a19\u306f\u5165\u3063\u3066\u3044\u307e\u305b\u3093\u3002<\/p>\n<\/li>\n<li>\n<p>\u30c1\u30a7\u30fc\u30f3\u304c\u7d42\u308f\u308b\u3068\u3001PendingGetCurrentPosition \u306e\u30c7\u30b9\u30c8\u30e9\u30af\u30bf\u304c\u8d70\u308b<br \/>\u81ea\u524d\u30d7\u30e9\u30b0\u30a4\u30f3\u306e PHP \u5074\u304b\u3089\u3001NativePHP \u672c\u4f53\u306e nativephp_call(&#8216;SimpleGeolocation.GetCurrentPosition&#8217;, \u2026) \u304c\u5b9f\u884c\u3055\u308c\u3001Bridge\uff08SimpleGeolocation.GetCurrentPosition\uff09\u3092\u547c\u3073\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>\u30cd\u30a4\u30c6\u30a3\u30d6\u5074\u306e\u51e6\u7406\u304c\u7d42\u308f\u308b\u3068\u3001LocationReceived \u30a4\u30d9\u30f3\u30c8\u3067\u7d50\u679c\u304c\u623b\u308b<br \/>\u624b\u9806 2 \u3067\u6e21\u3057\u305f function ($event) \u304c\u547c\u3070\u308c\u3001$event \u306b\u6210\u529f\u53ef\u5426\u3084\u7def\u5ea6\u30fb\u7d4c\u5ea6\u306a\u3069\u304c\u5165\u308a\u307e\u3059\u3002<\/p>\n<\/li>\n<li>\n<p>$event-&gt;latitude \/ $event-&gt;longitude \u3092\u4f7f\u3063\u3066 submitPunch(&#8230;) \u3078\u9032\u3080<br \/>\u3053\u3053\u304b\u3089\u5148\u306e\u534a\u5f84\u5224\u5b9a\u3068\u6253\u523b API \u306f\u3001\u524d\u56de\u3068\u540c\u3058\u3067\u3059\u3002<\/p>\n<\/li>\n<\/ol>\n<p><a href=\"https:\/\/nativephp.com\/plugins\/nativephp\/mobile-geolocation\">\u516c\u5f0f\u306e Geolocation<\/a> \u3082\u3001\u300c\u4f9d\u983c\u7528\u30aa\u30d6\u30b8\u30a7\u30af\u30c8 \u2192 \u30cd\u30a4\u30c6\u30a3\u30d6\u547c\u3073\u51fa\u3057 \u2192 \u30a4\u30d9\u30f3\u30c8\u3067\u53d7\u3051\u53d6\u308b\u300d\u3068\u3044\u3046\u8003\u3048\u65b9\u306f\u540c\u3058\u3067\u3059\u3002<\/p>\n<h3>\uff17\uff09\u30a8\u30df\u30e5\u30ec\u30fc\u30bf\u3067\u306e\u691c\u8a3c<\/h3>\n<p>\u3067\u306f\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u52d5\u4f5c\u3092\u30a8\u30df\u30e5\u30ec\u30fc\u30bf\u3067\u691c\u8a3c\u3059\u308b\u305f\u3081\u306b\u3001\u307e\u305a\u306f\u30a8\u30df\u30e5\u30ec\u30fc\u30bf\u306b\u300c\u3044\u307e\u3044\u308b\u5834\u6240\u300d\u3092\u5165\u308c\u307e\u3059\u3002\u6253\u523b\u306f\u3001\u3053\u306e\u4f4d\u7f6e\u304c .env \u306e\u4f1a\u793e\u5ea7\u6a19\uff08COMPANY_LAT \/ COMPANY_LNG\uff09\u304b\u3089\u534a\u5f84\u5185\u304b\u3069\u3046\u304b\u3067\u5224\u5b9a\u3059\u308b\u306e\u3067\u3001\u4f1a\u793e\u5ea7\u6a19\u306e\u8fd1\u304f\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002<\/p>\n<p>adb \u306e\u9806\u756a\u306f \u7d4c\u5ea6 \u2192 \u7def\u5ea6 \u3067\u3001.env \u306e\u7def\u5ea6\u30fb\u7d4c\u5ea6\u306e\u4e26\u3073\u3068\u306f\u9006\u3067\u3059\u3002<\/p>\n\n\n<pre class=\"wp-block-code\"><code>adb emu geo fix XXX.XXXXXX XX.XXXXXX\n\nadb shell am force-stop com.native_test.testapp\nadb shell am start -n com.native_test.testapp\/com.nativephp.mobile.ui.MainActivity<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"889\" height=\"615\" src=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-01.png\" alt=\"\" class=\"wp-image-9366\" srcset=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-01.png 889w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-01-300x208.png 300w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-01-768x531.png 768w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-01-150x104.png 150w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-01-218x150.png 218w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-01-696x481.png 696w\" sizes=\"auto, (max-width: 889px) 100vw, 889px\" \/><\/figure>\n\n\n<p>\u300c\u624b\u52d5\u5ea7\u6a19\u3092\u4f7f\u3046\u300d\u306f OFF \u306b\u3057\u3066\u3001\u51fa\u52e4\u3092\u30bf\u30c3\u30d7\u3057\u307e\u3059\u3002\u521d\u56de\u306e\u5834\u5408\u3001\u4f4d\u7f6e\u60c5\u5831\u306e\u6a29\u9650\u30c0\u30a4\u30a2\u30ed\u30b0\u304c\u8868\u793a\u3055\u308c\u308b\u306e\u3067\u3001\u8a31\u53ef\u3057\u307e\u3059\u3002<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"413\" height=\"667\" src=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-02.png\" alt=\"\" class=\"wp-image-9367\" srcset=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-02.png 413w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-02-186x300.png 186w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-02-150x242.png 150w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-08-02-300x485.png 300w\" sizes=\"auto, (max-width: 413px) 100vw, 413px\" \/><\/figure>\n\n\n<p>\u8a31\u53ef\u5f8c\u306b\u6253\u523b\u304c\u6210\u529f\u3059\u308b\u3068\u3001\u753b\u9762\u306b\u306f\u30c7\u30d0\u30c3\u30b0\u5185\u5bb9\u3068\u3057\u3066\u3001\u8ddd\u96e2\u30fb\u7cbe\u5ea6\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"412\" height=\"665\" src=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-01.png\" alt=\"\" class=\"wp-image-9368\" srcset=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-01.png 412w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-01-186x300.png 186w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-01-150x242.png 150w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-01-300x484.png 300w\" sizes=\"auto, (max-width: 412px) 100vw, 412px\" \/><\/figure>\n\n\n<p>Web \u6253\u523b\u4e00\u89a7\u753b\u9762\u3067\u3082\u3001\u53cd\u6620\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"474\" src=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-02-1-1024x474.png\" alt=\"\" class=\"wp-image-9370\" srcset=\"https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-02-1-1024x474.png 1024w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-02-1-300x139.png 300w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-02-1-768x356.png 768w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-02-1-1536x711.png 1536w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-02-1-150x69.png 150w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-02-1-696x322.png 696w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-02-1-1068x495.png 1068w, https:\/\/www.wetch.co.jp\/note\/wp-content\/uploads\/2026\/08\/SN3-09-02-1.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n<p>\u9577\u304f\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u304c\u3001\u3053\u3053\u307e\u3067\u3067\u30bf\u30a4\u30e0\u30ec\u30b3\u30fc\u30c0\u30fc\u306e\u753b\u9762\u30fbAPI\u30fb\u534a\u5f84\u5224\u5b9a\u306b\u52a0\u3048\u3001\u7aef\u672b GPS \u307e\u3067\u4e00\u901a\u308a\u89e6\u308c\u307e\u3057\u305f\u3002<br \/>\u8a66\u7528\u3067\u306f\u3042\u308a\u307e\u3059\u304c\u3001\u30b9\u30de\u30db\u306a\u3089\u3067\u306f\u306e\u6a5f\u80fd\u3084\u5b9f\u88c5\u306b\u89e6\u308c\u308b\u3088\u3044\u6a5f\u4f1a\u3060\u3063\u305f\u3068\u601d\u3044\u307e\u3059\u3002<br \/>\u307e\u305f\u30a2\u30a4\u30c7\u30a3\u30a2\u304c\u6e67\u3044\u305f\u3068\u304d\u306f\u3001\u304a\u8a66\u3057\u3057\u3066\u307f\u305f\u3044\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u56de\u306e\u6295\u7a3f\u3067\u306f\u3001\u30bf\u30a4\u30e0\u30ec\u30b3\u30fc\u30c0\u30fc\u753b\u9762\u3068\u6253\u523b API\u3001\u624b\u52d5\u5ea7\u6a19\u3067\u306e\u534a\u5f84\u5224\u5b9a\u307e\u3067\u3092\u78ba\u8a8d\u3057\u307e\u3057\u305f\u3002 \u624b\u52d5\u5ea7\u6a19\u306f\u30c7\u30e2\u3084\u5931\u6557\u30d1\u30bf\u30fc\u30f3\u306e\u518d\u73fe\u306b\u306f\u4fbf\u5229\u3067\u3059\u304c\u3001\u305b\u3063\u304b\u304f\u30e2\u30d0\u30a4\u30eb\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u3044\u308b\u306e\u3067\u3001\u30b9\u30de\u30db\u306a\u3089\u3067\u306f\u306e GPS\u00a0\u3067\u4f4d\u7f6e\u3092\u53d6 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":9371,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[210],"tags":[],"class_list":["post-9359","post","type-post","status-publish","format-standard","has-post-thumbnail","category-210"],"_links":{"self":[{"href":"https:\/\/www.wetch.co.jp\/note\/wp-json\/wp\/v2\/posts\/9359","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wetch.co.jp\/note\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wetch.co.jp\/note\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wetch.co.jp\/note\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wetch.co.jp\/note\/wp-json\/wp\/v2\/comments?post=9359"}],"version-history":[{"count":0,"href":"https:\/\/www.wetch.co.jp\/note\/wp-json\/wp\/v2\/posts\/9359\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wetch.co.jp\/note\/wp-json\/wp\/v2\/media\/9371"}],"wp:attachment":[{"href":"https:\/\/www.wetch.co.jp\/note\/wp-json\/wp\/v2\/media?parent=9359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wetch.co.jp\/note\/wp-json\/wp\/v2\/categories?post=9359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wetch.co.jp\/note\/wp-json\/wp\/v2\/tags?post=9359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}