<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>react-native on Ikoma's Blog</title><link>https://blog.yusukeikoma.com/tags/react-native/</link><description>Recent content in react-native on Ikoma's Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 30 Sep 2026 11:33:30 +0900</lastBuildDate><atom:link href="https://blog.yusukeikoma.com/tags/react-native/index.xml" rel="self" type="application/rss+xml"/><item><title>Expo's Fingerprint Runtime Version Changes When You Edit extra, Not Your JavaScript</title><link>https://blog.yusukeikoma.com/posts/fingerprint-runtime-version-changes-when-you-edit-extra/</link><pubDate>Wed, 30 Sep 2026 11:33:30 +0900</pubDate><guid>https://blog.yusukeikoma.com/posts/fingerprint-runtime-version-changes-when-you-edit-extra/</guid><description>An over-the-air update is JavaScript that calls into a native binary you cannot change. Treat the runtime version as the ABI version of that binary. Experiments with @expo/fingerprint 0.20.13 show which edits change the hash (extra, version, build numbers, native modules) and which do not (JavaScript, pure-JS dependencies), and a skip list that silently drops a default.</description></item><item><title>React Native's Built-In URL Does Not Resolve '../x'</title><link>https://blog.yusukeikoma.com/posts/react-native-builtin-url-does-not-resolve-dot-dot/</link><pubDate>Sat, 26 Sep 2026 21:31:14 +0900</pubDate><guid>https://blog.yusukeikoma.com/posts/react-native-builtin-url-does-not-resolve-dot-dot/</guid><description>A client library shared between a website and a React Native app usually fails on the boring parts of the Web platform, not on fetch. Reading React Native 0.87.1 and Expo 57 sources shows three layers of runtime, a URL class that returns &amp;lsquo;/b/c/d/../x&amp;rsquo; where the web returns &amp;lsquo;/b/x&amp;rsquo;, and a fetch with no response stream unless Expo replaces it. A small client that checks what it needs, tested against four simulated runtimes.</description></item><item><title>After Backgrounding, a WebSocket Reporting OPEN Is Only a Claim</title><link>https://blog.yusukeikoma.com/posts/mobile-os-background-sockets/</link><pubDate>Sat, 12 Sep 2026 14:18:24 +0900</pubDate><guid>https://blog.yusukeikoma.com/posts/mobile-os-background-sockets/</guid><description>Apple&amp;rsquo;s and Android&amp;rsquo;s own documentation say a backgrounded app can be suspended, its network access deferred, and its existing connections closed. So when your app comes back, readyState === OPEN is only a memory of the last event, not a measurement. This post derives a small foreground routine (probe, rebuild, catch up) from those documented rules, runs it against a frozen-process stand-in on Linux, and is explicit about what no device was used to check.</description></item><item><title>Replace Polling with Change Subscriptions, and Keep the Poll as the Fallback</title><link>https://blog.yusukeikoma.com/posts/replace-polling-with-subscriptions-keep-poll-as-fallback/</link><pubDate>Thu, 20 Aug 2026 18:03:49 +0900</pubDate><guid>https://blog.yusukeikoma.com/posts/replace-polling-with-subscriptions-keep-poll-as-fallback/</guid><description>How a mobile client moved from timer-driven polling to shared change subscriptions over a per-message-billed relay. The subtle part is not the stream. It is deciding honestly when the fallback poll may stand down.</description></item><item><title>When the Close Event Never Comes</title><link>https://blog.yusukeikoma.com/posts/when-the-close-event-never-comes/</link><pubDate>Mon, 17 Aug 2026 17:27:04 +0900</pubDate><guid>https://blog.yusukeikoma.com/posts/when-the-close-event-never-comes/</guid><description>A client that waits for its own socket&amp;rsquo;s close event before cleaning up can stall silently when that event never arrives. Settle your state when you decide to end the connection, make the cleanup idempotent, and keep the event for closes you did not start.</description></item></channel></rss>