<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: dailytech.id</title>
    <description>The latest articles on DEV Community by dailytech.id (@dailytechid).</description>
    <link>https://dev.to/dailytechid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3333428%2F980eeefc-6f40-4a62-9421-2ae02e5c5221.jpg</url>
      <title>DEV Community: dailytech.id</title>
      <link>https://dev.to/dailytechid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dailytechid"/>
    <language>en</language>
    <item>
      <title>canvas.toBlob() Can Silently Hand You Back a PNG When It Can't Encode What You Asked For</title>
      <dc:creator>dailytech.id</dc:creator>
      <pubDate>Tue, 28 Jul 2026 01:19:23 +0000</pubDate>
      <link>https://dev.to/dailytechid/canvastoblob-can-silently-hand-you-back-a-png-when-it-cant-encode-what-you-asked-for-4blo</link>
      <guid>https://dev.to/dailytechid/canvastoblob-can-silently-hand-you-back-a-png-when-it-cant-encode-what-you-asked-for-4blo</guid>
      <description>&lt;p&gt;I was building a small in-browser image converter — drop in a PNG or JPEG, get back a WebP or AVIF, no server involved — and ran into a failure mode that doesn't look like a failure at all. The conversion "succeeds." The download works. The file just isn't the format you asked for, and unless you check for it, you'll never know.&lt;/p&gt;

&lt;h2&gt;
  
  
  The shape of the problem
&lt;/h2&gt;

&lt;p&gt;The whole point of doing this client-side is that the image never leaves the browser. No upload, no server round trip, no queue. The pipeline is short:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loadBitmap&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;File&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;createImageBitmap&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;createImageBitmap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLImageElement&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Image&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onerror&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;createImageBitmap(file)&lt;/code&gt; is the fast path — it decodes the file off the main thread without you needing to wire up an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; element first. Not every environment has it, though, so there's a fallback to the classic &lt;code&gt;new Image()&lt;/code&gt; plus &lt;code&gt;URL.createObjectURL&lt;/code&gt;, which works everywhere but ties up the main thread during decode.&lt;/p&gt;

&lt;p&gt;Once you have a bitmap, you draw it into a canvas — optionally downscaled — and ask the canvas for a blob in the target format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;canvas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bitmap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;close&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;bitmap&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;bitmap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;close&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;function&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;bitmap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mimeType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`image/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;targetFormat&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Blob&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toBlob&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mimeType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Calling &lt;code&gt;bitmap.close()&lt;/code&gt; matters more than it looks — &lt;code&gt;ImageBitmap&lt;/code&gt; objects hold decoded pixel data, and if you're running this over a batch of files, forgetting to release each one adds up fast in a single tab.&lt;/p&gt;

&lt;p&gt;That code above is basically the whole feature. It's short enough that it's tempting to ship it as-is. Don't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it quietly goes wrong
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;canvas.toBlob(callback, mimeType, quality)&lt;/code&gt; does not throw or reject when it can't produce the format you asked for. If the browser doesn't support encoding to that &lt;code&gt;mimeType&lt;/code&gt;, it just falls back to PNG and calls your callback like nothing happened. No exception, no rejected promise, nothing in the console. This isn't a browser bug either — it's the specified behaviour, spelled out in &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toBlob" rel="noopener noreferrer"&gt;MDN's &lt;code&gt;toBlob()&lt;/code&gt; reference&lt;/a&gt;: an unsupported type falls back to &lt;code&gt;image/png&lt;/code&gt;. The blob you get back is a real, valid, decodable image — it's just not the one you requested.&lt;/p&gt;

&lt;p&gt;For a converter whose entire premise is "give me a smaller file in a modern format," this is close to the worst possible failure mode. AVIF and WebP exist specifically to be smaller than PNG for photographic content. If the encode silently downgrades to PNG, the user downloads a file that's often &lt;em&gt;larger&lt;/em&gt; than what they started with, believing they got the compression they asked for. There's no error to catch, because nothing threw.&lt;/p&gt;

&lt;p&gt;The only signal you have is the blob itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;mimeType&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;unsupported&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That one line is doing the actual work of catching the failure. It compares the &lt;code&gt;type&lt;/code&gt; the browser reports on the resulting blob against the &lt;code&gt;mimeType&lt;/code&gt; you requested. If they don't match, that's the silent-PNG-fallback case, and only then do we turn it into a real &lt;code&gt;Error&lt;/code&gt; the rest of the app can react to — surfaced in the UI as an explicit "your browser couldn't encode this format" message instead of a mysteriously oversized download.&lt;/p&gt;

&lt;p&gt;Encode support for something like AVIF isn't uniform across browsers and platforms the way JPEG decoding is — it depends on the underlying codec libraries a given browser ships with. Rather than trying to maintain a browser/version support matrix and hope it stays accurate, checking &lt;code&gt;blob.type&lt;/code&gt; after the fact is the one method that's actually correct by construction: it asks the browser what it did, instead of guessing what it should be able to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest of the machinery
&lt;/h2&gt;

&lt;p&gt;A few other details worth knowing if you're building something similar:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Downscaling is optional and cheap.&lt;/strong&gt; A &lt;code&gt;maxWidth&lt;/code&gt; setting only kicks in if it's set and the source is actually wider than it; otherwise the canvas is sized to the original dimensions and nothing is resized. It's a plain ratio calculation before &lt;code&gt;drawImage&lt;/code&gt;, not a separate resize pass.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quality defaults differ per format&lt;/strong&gt; — 0.82 for WebP, 0.72 for AVIF. The &lt;code&gt;quality&lt;/code&gt; argument is just a number between 0 and 1 handed to whichever encoder the browser uses, and the two codecs don't treat the same number the same way, so a single shared default doesn't make much sense. Whatever you pick, pick it per format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accepted inputs and batch size are both bounded.&lt;/strong&gt; The converter accepts PNG, JPEG, GIF, WebP, and AVIF as input, and caps a batch at 50 files. That's a deliberate ceiling, not a technical one — decoding and holding dozens of full-resolution bitmaps in memory at once is exactly the kind of thing that degrades gracefully until it very suddenly doesn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Object URLs get cleaned up.&lt;/strong&gt; Every file gets a &lt;code&gt;URL.createObjectURL()&lt;/code&gt; preview, and every converted result gets another one for the download link. Both get explicitly revoked when a batch is cleared or re-converted. Blob URLs aren't garbage collected just because nothing references them anymore in your JS — leave enough of them alive in a long session and you'll leak memory for no visible reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this approach doesn't give you
&lt;/h2&gt;

&lt;p&gt;Worth being upfront about the tradeoffs of doing this in a canvas rather than server-side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EXIF and orientation metadata are gone.&lt;/strong&gt; &lt;code&gt;drawImage&lt;/code&gt; followed by &lt;code&gt;toBlob&lt;/code&gt; rasterizes pixels onto a canvas and re-encodes from there — none of the original file's metadata survives that trip. If you need to preserve camera info, GPS tags, or orientation flags, canvas-based conversion isn't the tool for it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everything lives in the tab's memory.&lt;/strong&gt; There's no streaming, no chunking — the whole bitmap gets decoded and drawn in memory. A handful of large source images can push a browser tab further than you'd expect, especially on lower-memory devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encode support isn't guaranteed&lt;/strong&gt;, which is the whole reason the &lt;code&gt;blob.type&lt;/code&gt; check exists in the first place, rather than being an edge case you can ignore.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of this makes client-side conversion a bad idea — it's exactly why doing the work in the browser is appealing: no server storage, no upload wait, and the failure mode above is fully fixable in one line once you know to look for it. I ended up wrapping this into a small &lt;a href="https://tools.dailytech.id/en/image-to-webp/" rel="noopener noreferrer"&gt;image-to-WebP tool&lt;/a&gt; I maintain, and if you're deciding between AVIF and WebP as your target format, I wrote up the actual tradeoffs in more detail &lt;a href="https://tools.dailytech.id/en/blog/avif-vs-webp-comparison/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're building anything with &lt;code&gt;canvas.toBlob()&lt;/code&gt;, the takeaway is narrow but worth remembering: a successful callback is not proof you got the format you asked for. Check &lt;code&gt;blob.type&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>performance</category>
      <category>browser</category>
    </item>
    <item>
      <title>iPhone Suddenly Stuck on SOS Only? This Simple Fix Saves Your Signal</title>
      <dc:creator>dailytech.id</dc:creator>
      <pubDate>Fri, 02 Jan 2026 15:16:41 +0000</pubDate>
      <link>https://dev.to/dailytechid/iphone-suddenly-stuck-on-sos-only-this-simple-fix-saves-your-signal-2dag</link>
      <guid>https://dev.to/dailytechid/iphone-suddenly-stuck-on-sos-only-this-simple-fix-saves-your-signal-2dag</guid>
      <description>&lt;p&gt;We’ve all been there: you pull out your iPhone to check a commit or a notification, and instead of 5G or LTE, the status bar displays &lt;strong&gt;"SOS Only."&lt;/strong&gt; It’s a frustrating experience that usually happens at the worst possible time—after an iOS update, during travel, or randomly in the middle of your day.&lt;/p&gt;

&lt;p&gt;But what does this state actually signify? Technically, "SOS Only" means your iPhone's modem cannot establish a handshake with your specific carrier (Verizon, T-Mobile, etc.), but it &lt;strong&gt;is&lt;/strong&gt; detecting a signal from other nearby towers. Under international emergency standards, your phone is allowed to route emergency calls (911/112) through any available network, even if you aren't a subscriber.&lt;/p&gt;

&lt;p&gt;If you’re stuck in this loop, here is the technical 8-step hierarchy to resolve the issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Airplane Mode "Soft Reset"
&lt;/h2&gt;

&lt;p&gt;The fastest way to force a re-scan of local frequencies is the Airplane Mode toggle. This forces the radio power amplifier to cycle off and on, clearing the current state of the cellular stack.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open &lt;strong&gt;Control Center&lt;/strong&gt; &amp;gt; Toggle &lt;strong&gt;Airplane Mode&lt;/strong&gt; ON.&lt;/li&gt;
&lt;li&gt;Wait &lt;strong&gt;15 seconds&lt;/strong&gt; (essential to let the capacitors discharge and the radio fully power down).&lt;/li&gt;
&lt;li&gt;Toggle it OFF and wait for the "Searching" animation to lock onto a tower.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Verify Cellular Data &amp;amp; Line Settings
&lt;/h2&gt;

&lt;p&gt;Sometimes, the logic governing multi-SIM or roaming gets toggled off due to a software glitch.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; Cellular&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ensure &lt;strong&gt;Cellular Data&lt;/strong&gt; is toggled ON.&lt;/li&gt;
&lt;li&gt;If you use an eSIM/Physical SIM combo, tap your primary line and ensure &lt;strong&gt;"Turn On This Line"&lt;/strong&gt; is active.&lt;/li&gt;
&lt;li&gt;Check that &lt;strong&gt;Voice &amp;amp; Data&lt;/strong&gt; is set to a supported protocol (LTE or 5G Auto).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Reseat the Hardware (SIM &amp;amp; eSIM)
&lt;/h2&gt;

&lt;p&gt;Physical displacement is a common culprit for "SOS Only." Even a fraction of a millimeter misalignment can cause a communication failure between the SIM chip and the logic board.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Physical SIM:&lt;/strong&gt; Eject the tray using a SIM tool, inspect the gold contacts for debris or scratches, and re-insert it firmly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;eSIM:&lt;/strong&gt; While you can’t move it physically, you can "re-seat" the software profile. Toggle the line OFF in settings, wait 10 seconds, and toggle it back ON to re-initiate the handshake.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Reset Network Settings
&lt;/h2&gt;

&lt;p&gt;This is the "magic bullet" for persistent software-side connectivity issues. It flushes all cellular caches, temporary files, DNS settings, and APN configurations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; General &amp;gt; Transfer or Reset iPhone &amp;gt; Reset &amp;gt; Reset Network Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warning:&lt;/strong&gt; This will delete your saved Wi-Fi passwords and Bluetooth pairings. It’s a clean slate for your network stack.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Update iOS to the Latest Version
&lt;/h2&gt;

&lt;p&gt;Apple frequently bundles modem firmware updates within iOS releases. If you are running an outdated version, your phone might be trying to connect using outdated protocols.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect to a stable Wi-Fi network.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; General &amp;gt; Software Update&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If a patch is available, install it. This often fixes bugs introduced by previous versions that affect how the modem interacts with 5G infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. Manual Carrier Selection
&lt;/h2&gt;

&lt;p&gt;By default, iPhones use "Automatic" network selection. If the phone gets "confused" or tries to connect to a restricted tower (e.g., a roaming partner with a broken agreement), it defaults to SOS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; Cellular &amp;gt; Network Selection&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Turn &lt;strong&gt;Automatic OFF&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Wait for the list to populate (this can take a minute) and manually select your specific carrier. This forces the modem to ignore other broadcasts and focus solely on your provider.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  7. Trigger a Carrier Settings Update
&lt;/h2&gt;

&lt;p&gt;These are separate from iOS updates. They are small &lt;code&gt;.plist&lt;/code&gt; files sent by your provider to update network frequencies and roaming configurations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure you are on Wi-Fi.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; General &amp;gt; About&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Stay on this screen for 30 seconds. If an update is available, a pop-up will appear saying &lt;strong&gt;"Carrier Settings Update"&lt;/strong&gt;. Tap &lt;strong&gt;Update&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Factory Reset (The Last Resort)
&lt;/h2&gt;

&lt;p&gt;If you’ve tried everything and the "SOS Only" persists, you might be dealing with deep system corruption. A factory reset wipes the device and reinstalls a fresh copy of the OS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CRITICAL:&lt;/strong&gt; Back up your iPhone to iCloud or a Mac/PC first.&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; General &amp;gt; Transfer or Reset iPhone &amp;gt; Erase All Content and Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set up the phone as "New" initially to see if the signal returns before restoring your backup.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Technical Indicators of Hardware Failure
&lt;/h2&gt;

&lt;p&gt;If you have completed all 8 steps and the "SOS Only" remains, it is likely a hardware issue:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Empty Modem Firmware:&lt;/strong&gt; Go to &lt;em&gt;Settings &amp;gt; General &amp;gt; About&lt;/em&gt;. If the "Modem Firmware" field is blank, the baseband chip has likely failed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account Suspension:&lt;/strong&gt; Contact your carrier. If you missed a payment or if there is a "SIM Swap" flag on your account, they will block the SIM from the network.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; Always check &lt;strong&gt;DownDetector&lt;/strong&gt; first. If your carrier’s tower is down in your zip code, no amount of software resetting will bring your bars back!&lt;/p&gt;

</description>
      <category>iphone</category>
    </item>
  </channel>
</rss>
