[{"data":1,"prerenderedAt":680},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Fv1\u002Fnativephp\u002Flifecycle":121,"\u002Fdocs\u002Fv1\u002Fnativephp\u002Flifecycle-surround":675},[4],{"title":5,"path":6,"stem":7,"children":8,"page":44},"Docs","\u002Fdocs","docs",[9],{"title":10,"path":11,"stem":12,"children":13,"page":44},"V1","\u002Fdocs\u002Fv1","docs\u002Fv1",[14,18,22,45,58,80,93,111],{"title":15,"path":16,"stem":17},"Introduction","\u002Fdocs\u002Fv1\u002Fintroduction","docs\u002Fv1\u002F0.introduction",{"title":19,"path":20,"stem":21},"How It Works","\u002Fdocs\u002Fv1\u002Fhow-it-works","docs\u002Fv1\u002F1.how-it-works",{"title":23,"icon":24,"path":25,"stem":26,"children":27,"page":44},"Client","i-lucide-laptop","\u002Fdocs\u002Fv1\u002Fclient","docs\u002Fv1\u002F2.client",[28,32,36,40],{"title":29,"path":30,"stem":31},"Client Setup","\u002Fdocs\u002Fv1\u002Fclient\u002Fsetup","docs\u002Fv1\u002F2.client\u002F1.setup",{"title":33,"path":34,"stem":35},"Syncing","\u002Fdocs\u002Fv1\u002Fclient\u002Fsyncing","docs\u002Fv1\u002F2.client\u002F2.syncing",{"title":37,"path":38,"stem":39},"Events","\u002Fdocs\u002Fv1\u002Fclient\u002Fevents","docs\u002Fv1\u002F2.client\u002F3.events",{"title":41,"path":42,"stem":43},"Configuration","\u002Fdocs\u002Fv1\u002Fclient\u002Fconfiguration","docs\u002Fv1\u002F2.client\u002F4.configuration",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"Server","i-lucide-server","\u002Fdocs\u002Fv1\u002Fserver","docs\u002Fv1\u002F3.server",[51,55],{"title":52,"path":53,"stem":54},"Server Setup","\u002Fdocs\u002Fv1\u002Fserver\u002Fsetup","docs\u002Fv1\u002F3.server\u002F1.setup",{"title":41,"path":56,"stem":57},"\u002Fdocs\u002Fv1\u002Fserver\u002Fconfiguration","docs\u002Fv1\u002F3.server\u002F2.configuration",{"title":59,"icon":60,"badge":61,"path":62,"stem":63,"children":64,"page":44},"NativePHP","i-lucide-smartphone","Commercial","\u002Fdocs\u002Fv1\u002Fnativephp","docs\u002Fv1\u002F4.nativephp",[65,69,73,76],{"title":66,"path":67,"stem":68},"Overview","\u002Fdocs\u002Fv1\u002Fnativephp\u002Foverview","docs\u002Fv1\u002F4.nativephp\u002F1.overview",{"title":70,"path":71,"stem":72},"Setup","\u002Fdocs\u002Fv1\u002Fnativephp\u002Fsetup","docs\u002Fv1\u002F4.nativephp\u002F2.setup",{"title":41,"path":74,"stem":75},"\u002Fdocs\u002Fv1\u002Fnativephp\u002Fconfiguration","docs\u002Fv1\u002F4.nativephp\u002F3.configuration",{"title":77,"path":78,"stem":79},"Lifecycle & Events","\u002Fdocs\u002Fv1\u002Fnativephp\u002Flifecycle","docs\u002Fv1\u002F4.nativephp\u002F4.lifecycle",{"title":81,"icon":82,"badge":61,"path":83,"stem":84,"children":85,"page":44},"Server Pro","i-lucide-bar-chart-2","\u002Fdocs\u002Fv1\u002Fserver-pro","docs\u002Fv1\u002F5.server-pro",[86,89],{"title":66,"path":87,"stem":88},"\u002Fdocs\u002Fv1\u002Fserver-pro\u002Foverview","docs\u002Fv1\u002F5.server-pro\u002F1.overview",{"title":90,"path":91,"stem":92},"Features","\u002Fdocs\u002Fv1\u002Fserver-pro\u002Ffeatures","docs\u002Fv1\u002F5.server-pro\u002F2.features",{"title":94,"icon":95,"path":96,"stem":97,"children":98,"page":44},"Advanced","i-lucide-settings-2","\u002Fdocs\u002Fv1\u002Fadvanced","docs\u002Fv1\u002F6.advanced",[99,103,107],{"title":100,"path":101,"stem":102},"Service Container","\u002Fdocs\u002Fv1\u002Fadvanced\u002Fservice-container","docs\u002Fv1\u002F6.advanced\u002F0.service-container",{"title":104,"path":105,"stem":106},"Conflict Resolution","\u002Fdocs\u002Fv1\u002Fadvanced\u002Fconflict-resolution","docs\u002Fv1\u002F6.advanced\u002F1.conflict-resolution",{"title":108,"path":109,"stem":110},"Payload Mapping","\u002Fdocs\u002Fv1\u002Fadvanced\u002Fpayload-mapping","docs\u002Fv1\u002F6.advanced\u002F2.payload-mapping",{"title":112,"icon":113,"path":114,"stem":115,"children":116,"page":44},"Examples","i-lucide-book-open","\u002Fdocs\u002Fv1\u002Fexamples","docs\u002Fv1\u002F7.examples",[117],{"title":118,"path":119,"stem":120},"Task Manager","\u002Fdocs\u002Fv1\u002Fexamples\u002Ftask-manager","docs\u002Fv1\u002F7.examples\u002F1.task-manager",{"id":122,"title":77,"body":123,"description":668,"extension":669,"links":670,"meta":671,"navigation":428,"path":78,"seo":672,"stem":79,"__hash__":674},"docs\u002Fdocs\u002Fv1\u002F4.nativephp\u002F4.lifecycle.md",{"type":124,"value":125,"toc":659},"minimark",[126,134,162,165,168,173,179,182,231,240,245,247,251,256,258,276,279,281,285,295,366,372,378,380,384,387,393,500,505,510,652,655],[127,128,129,133],"p",{},[130,131,132],"code",{},"tether\u002Fnativephp-client"," turns NativePHP mobile lifecycle and connectivity changes into normal Laravel events and automatic offline sync jobs:",[135,136,137,148,156],"ul",{},[138,139,140,141,144,145],"li",{},"app resumes -> ",[130,142,143],{},"AppResumed"," event -> optional ",[130,146,147],{},"PushJob",[138,149,150,151,144,154],{},"network returns -> ",[130,152,153],{},"NetworkStatusChanged",[130,155,147],{},[138,157,158,159],{},"background schedule runs -> ",[130,160,161],{},"tether:sync",[127,163,164],{},"Configure the triggers you want, then handle the Laravel events only if your app needs custom behaviour.",[166,167],"hr",{},[169,170,172],"h2",{"id":171},"app-resume-sync","App resume sync",[127,174,175,176,178],{},"When the app is opened again after being in the background, the package can dispatch ",[130,177,147],{},".",[127,180,181],{},"This is controlled by:",[183,184,189],"pre",{"className":185,"code":186,"language":187,"meta":188,"style":188},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","'auto_sync_on_resume' => true,\n'resume_cooldown' => 30,\n","php","",[130,190,191,212],{"__ignoreMap":188},[192,193,196,200,204,206,209],"span",{"class":194,"line":195},"line",1,[192,197,199],{"class":198},"sMK4o","'",[192,201,203],{"class":202},"sfazB","auto_sync_on_resume",[192,205,199],{"class":198},[192,207,208],{"class":198}," =>",[192,210,211],{"class":198}," true,\n",[192,213,215,217,220,222,224,228],{"class":194,"line":214},2,[192,216,199],{"class":198},[192,218,219],{"class":202},"resume_cooldown",[192,221,199],{"class":198},[192,223,208],{"class":198},[192,225,227],{"class":226},"sbssI"," 30",[192,229,230],{"class":198},",\n",[127,232,233,235,236,239],{},[130,234,219],{}," prevents repeated push jobs when the user switches between apps quickly. The cooldown is stored in ",[130,237,238],{},"SyncStateStore",", so it survives normal app restarts.",[127,241,242,244],{},[130,243,147],{}," performs a push sync. It sends pending local mutations to the server without blocking the user from continuing to use the app.",[166,246],{},[169,248,250],{"id":249},"connectivity-sync","Connectivity sync",[127,252,253,254,178],{},"When the device gets network access after being offline, the package can dispatch ",[130,255,147],{},[127,257,181],{},[183,259,261],{"className":185,"code":260,"language":187,"meta":188,"style":188},"'auto_sync_on_connectivity' => true,\n",[130,262,263],{"__ignoreMap":188},[192,264,265,267,270,272,274],{"class":194,"line":195},[192,266,199],{"class":198},[192,268,269],{"class":202},"auto_sync_on_connectivity",[192,271,199],{"class":198},[192,273,208],{"class":198},[192,275,211],{"class":198},[127,277,278],{},"Only reconnection triggers a push job. Losing network access does not dispatch one.",[166,280],{},[169,282,284],{"id":283},"background-sync","Background sync",[127,286,287,288,290,291,294],{},"Background sync is optional. When enabled, Tether schedules the ",[130,289,161],{}," Artisan command through ",[130,292,293],{},"nativephp\u002Fmobile-background-tasks",":",[183,296,298],{"className":185,"code":297,"language":187,"meta":188,"style":188},"'background_sync' => true,\n'background_interval' => 60,\n'background_network' => 'any',\n'background_long_running' => false,\n",[130,299,300,313,329,351],{"__ignoreMap":188},[192,301,302,304,307,309,311],{"class":194,"line":195},[192,303,199],{"class":198},[192,305,306],{"class":202},"background_sync",[192,308,199],{"class":198},[192,310,208],{"class":198},[192,312,211],{"class":198},[192,314,315,317,320,322,324,327],{"class":194,"line":214},[192,316,199],{"class":198},[192,318,319],{"class":202},"background_interval",[192,321,199],{"class":198},[192,323,208],{"class":198},[192,325,326],{"class":226}," 60",[192,328,230],{"class":198},[192,330,332,334,337,339,341,344,347,349],{"class":194,"line":331},3,[192,333,199],{"class":198},[192,335,336],{"class":202},"background_network",[192,338,199],{"class":198},[192,340,208],{"class":198},[192,342,343],{"class":198}," '",[192,345,346],{"class":202},"any",[192,348,199],{"class":198},[192,350,230],{"class":198},[192,352,354,356,359,361,363],{"class":194,"line":353},4,[192,355,199],{"class":198},[192,357,358],{"class":202},"background_long_running",[192,360,199],{"class":198},[192,362,208],{"class":198},[192,364,365],{"class":198}," false,\n",[127,367,368,369,371],{},"Unlike resume and connectivity sync, background sync runs the full ",[130,370,161],{}," command, so it performs push and pull.",[127,373,374,375,377],{},"If ",[130,376,293],{}," is not installed, Tether logs a warning and continues without background sync.",[166,379],{},[169,381,383],{"id":382},"listening-to-events","Listening to events",[127,385,386],{},"You can listen to the package events from your Laravel app if you want to update local UI state, write logs, or trigger your own application logic.",[388,389,391],"h3",{"id":390},"appresumed",[130,392,143],{},[183,394,396],{"className":185,"code":395,"language":187,"meta":188,"style":188},"use Tether\\NativephpClient\\Events\\AppResumed;\n\nclass RefreshLocalDashboard\n{\n    public function handle(AppResumed $event): void\n    {\n        \u002F\u002F Refresh local state after the app becomes active again.\n    }\n}\n",[130,397,398,424,430,440,445,475,481,488,494],{"__ignoreMap":188},[192,399,400,403,407,410,413,415,417,419,421],{"class":194,"line":195},[192,401,402],{"class":226},"use",[192,404,406],{"class":405},"sTEyZ"," Tether",[192,408,409],{"class":198},"\\",[192,411,412],{"class":405},"NativephpClient",[192,414,409],{"class":198},[192,416,37],{"class":405},[192,418,409],{"class":198},[192,420,143],{"class":405},[192,422,423],{"class":198},";\n",[192,425,426],{"class":194,"line":214},[192,427,429],{"emptyLinePlaceholder":428},true,"\n",[192,431,432,436],{"class":194,"line":331},[192,433,435],{"class":434},"spNyl","class",[192,437,439],{"class":438},"sBMFI"," RefreshLocalDashboard\n",[192,441,442],{"class":194,"line":353},[192,443,444],{"class":198},"{\n",[192,446,448,451,454,458,461,463,466,469,472],{"class":194,"line":447},5,[192,449,450],{"class":434},"    public",[192,452,453],{"class":434}," function",[192,455,457],{"class":456},"s2Zo4"," handle",[192,459,460],{"class":198},"(",[192,462,143],{"class":438},[192,464,465],{"class":198}," $",[192,467,468],{"class":405},"event",[192,470,471],{"class":198},"):",[192,473,474],{"class":226}," void\n",[192,476,478],{"class":194,"line":477},6,[192,479,480],{"class":198},"    {\n",[192,482,484],{"class":194,"line":483},7,[192,485,487],{"class":486},"sHwdD","        \u002F\u002F Refresh local state after the app becomes active again.\n",[192,489,491],{"class":194,"line":490},8,[192,492,493],{"class":198},"    }\n",[192,495,497],{"class":194,"line":496},9,[192,498,499],{"class":198},"}\n",[127,501,502,504],{},[130,503,143],{}," is a signal event and has no additional properties.",[388,506,508],{"id":507},"networkstatuschanged",[130,509,153],{},[183,511,513],{"className":185,"code":512,"language":187,"meta":188,"style":188},"use Tether\\NativephpClient\\Events\\NetworkStatusChanged;\n\nclass UpdateConnectionState\n{\n    public function handle(NetworkStatusChanged $event): void\n    {\n        $event->connected;     \u002F\u002F bool - true when network is available\n        $event->type;          \u002F\u002F string - wifi, cellular, unknown, etc.\n        $event->isExpensive;   \u002F\u002F bool - true for metered connections\n        $event->isConstrained; \u002F\u002F bool - true when low data mode is active\n    }\n}\n",[130,514,515,535,539,546,550,570,574,593,609,625,642,647],{"__ignoreMap":188},[192,516,517,519,521,523,525,527,529,531,533],{"class":194,"line":195},[192,518,402],{"class":226},[192,520,406],{"class":405},[192,522,409],{"class":198},[192,524,412],{"class":405},[192,526,409],{"class":198},[192,528,37],{"class":405},[192,530,409],{"class":198},[192,532,153],{"class":405},[192,534,423],{"class":198},[192,536,537],{"class":194,"line":214},[192,538,429],{"emptyLinePlaceholder":428},[192,540,541,543],{"class":194,"line":331},[192,542,435],{"class":434},[192,544,545],{"class":438}," UpdateConnectionState\n",[192,547,548],{"class":194,"line":353},[192,549,444],{"class":198},[192,551,552,554,556,558,560,562,564,566,568],{"class":194,"line":447},[192,553,450],{"class":434},[192,555,453],{"class":434},[192,557,457],{"class":456},[192,559,460],{"class":198},[192,561,153],{"class":438},[192,563,465],{"class":198},[192,565,468],{"class":405},[192,567,471],{"class":198},[192,569,474],{"class":226},[192,571,572],{"class":194,"line":477},[192,573,480],{"class":198},[192,575,576,579,581,584,587,590],{"class":194,"line":483},[192,577,578],{"class":198},"        $",[192,580,468],{"class":405},[192,582,583],{"class":198},"->",[192,585,586],{"class":405},"connected",[192,588,589],{"class":198},";",[192,591,592],{"class":486},"     \u002F\u002F bool - true when network is available\n",[192,594,595,597,599,601,604,606],{"class":194,"line":490},[192,596,578],{"class":198},[192,598,468],{"class":405},[192,600,583],{"class":198},[192,602,603],{"class":405},"type",[192,605,589],{"class":198},[192,607,608],{"class":486},"          \u002F\u002F string - wifi, cellular, unknown, etc.\n",[192,610,611,613,615,617,620,622],{"class":194,"line":496},[192,612,578],{"class":198},[192,614,468],{"class":405},[192,616,583],{"class":198},[192,618,619],{"class":405},"isExpensive",[192,621,589],{"class":198},[192,623,624],{"class":486},"   \u002F\u002F bool - true for metered connections\n",[192,626,628,630,632,634,637,639],{"class":194,"line":627},10,[192,629,578],{"class":198},[192,631,468],{"class":405},[192,633,583],{"class":198},[192,635,636],{"class":405},"isConstrained",[192,638,589],{"class":198},[192,640,641],{"class":486}," \u002F\u002F bool - true when low data mode is active\n",[192,643,645],{"class":194,"line":644},11,[192,646,493],{"class":198},[192,648,650],{"class":194,"line":649},12,[192,651,499],{"class":198},[127,653,654],{},"The package's own sync listeners are registered alongside yours, so adding custom listeners does not disable automatic sync.",[656,657,658],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}",{"title":188,"searchDepth":195,"depth":214,"links":660},[661,662,663,664],{"id":171,"depth":214,"text":172},{"id":249,"depth":214,"text":250},{"id":283,"depth":214,"text":284},{"id":382,"depth":214,"text":383,"children":665},[666,667],{"id":390,"depth":331,"text":143},{"id":507,"depth":331,"text":153},"Understand how NativePHP lifecycle and connectivity events map to Laravel events and automatic Tether sync jobs in mobile apps.","md",null,{"badge":61},{"title":673,"description":668},"NativePHP Sync Lifecycle Events - Laravel Tether","yCnBbIeionZQs1k0Ri72X9ZjlpQuJoH9lrvgEn43rf8",[676,678],{"title":41,"path":74,"stem":75,"description":677,"children":-1},"Configure NativePHP offline sync triggers for app resume, connectivity restore, background scheduling, cooldowns, and network constraints.",{"title":66,"path":87,"stem":88,"description":679,"children":-1},"Learn how tether\u002Fpro-server adds a production Laravel dashboard for sync history, request inspection, conflict review, replay, and telemetry.",1780481014760]