<?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: Lawrence Norman</title>
    <description>The latest articles on DEV Community by Lawrence Norman (@lawrencenorman7hills).</description>
    <link>https://dev.to/lawrencenorman7hills</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3072609%2F5763886f-54e4-48e4-94cf-b0f3da8f6071.png</url>
      <title>DEV Community: Lawrence Norman</title>
      <link>https://dev.to/lawrencenorman7hills</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lawrencenorman7hills"/>
    <language>en</language>
    <item>
      <title>React Native Expo SDK 51 Upgrade: Starting April 24, 2025, iOS apps must be built with the iOS 18 SDK.</title>
      <dc:creator>Lawrence Norman</dc:creator>
      <pubDate>Tue, 22 Apr 2025 19:13:39 +0000</pubDate>
      <link>https://dev.to/lawrencenorman7hills/react-native-expo-sdk-51-upgrade-starting-april-24-2025-ios-apps-must-be-built-with-the-ios-18-5634</link>
      <guid>https://dev.to/lawrencenorman7hills/react-native-expo-sdk-51-upgrade-starting-april-24-2025-ios-apps-must-be-built-with-the-ios-18-5634</guid>
      <description>&lt;p&gt;My Descent into the Podfile Abyss (and How I Climbed Out) Upgrading Expo SDK 50 → 51 in the Bare workflow to meet Apple’s iOS 18 SDK requirement.&lt;/p&gt;

&lt;p&gt;If you’re a React Native developer you want to stay in the sweet spot of library stability—but sometimes a looming deadline forces your hand. You start getting emails like this:&lt;/p&gt;

&lt;p&gt;App Store Connect Warning&lt;/p&gt;

&lt;p&gt;Hello,&lt;/p&gt;

&lt;p&gt;We noticed one or more issues with a recent delivery for the following app:&lt;/p&gt;

&lt;p&gt;Quiznect&lt;br&gt;&lt;br&gt;
Version 1.0.40&lt;br&gt;&lt;br&gt;
Build 40&lt;/p&gt;

&lt;p&gt;ITMS-90725: SDK version issue - This app was built with the iOS 17.5 SDK. Starting April 24, 2025, all iOS and iPadOS apps must be built with the iOS 18 SDK or later, included in Xcode 16 or later, in order to be uploaded to App Store Connect or submitted for distribution.&lt;/p&gt;

&lt;p&gt;Apple’s deadline arrived, so I had to upgrade my Expo app. I ran:&lt;/p&gt;

&lt;p&gt;npx expo upgrade&lt;/p&gt;

&lt;p&gt;…and hoped for the best. Sometimes it works flawlessly. Other times you end up on a multi‑day debugging odyssey through Podfiles, build logs, environment variables, and EAS configurations.&lt;/p&gt;

&lt;p&gt;This is the story of my upgrade from Expo SDK 50 → SDK 51 in the Bare Workflow. It wasn’t pretty, but I emerged with an iOS 18 SDK‑compliant build. May my tale of woe and triumph save you some time and sanity!&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;The Goal&lt;br&gt;
    • Upgrade from Expo SDK 50 to SDK 51&lt;br&gt;
    • Meet Apple’s iOS 18 SDK requirement (Xcode 16+) by April 24, 2025&lt;br&gt;
    • Stay reasonably up‑to‑date without jumping straight to SDK 52&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Initial Steps &amp;amp; The First Hurdle: Dependencies &amp;amp; Workflow&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Commit all changes, then run: npx expo upgrade&lt;/li&gt;
&lt;li&gt;Expo CLI pointed out manual steps—because I use the Bare workflow (I manage ios/ &amp;amp; android/ in Git).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Lesson 1: Know your workflow (Managed vs. Bare). The native‑dir upgrades differ significantly. I had an old patch-package workaround causing build failures on the build server.&lt;/p&gt;

&lt;p&gt;Lesson 2: Clean up obsolete workarounds &amp;amp; devDependencies before upgrading.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Targeting the Right SDK (and Dependencies)&lt;/p&gt;

&lt;p&gt;I first tried expo@latest (SDK 52) but pivoted to the stable SDK 51. In package.json:&lt;/p&gt;

&lt;p&gt;"dependencies": {&lt;br&gt;
   "expo": "~51.0.0",      // target SDK 51&lt;br&gt;
   "react": "...",&lt;br&gt;
   "react-native": "...",&lt;br&gt;
   // …&lt;br&gt;
 },&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;p&gt;npx expo install --fix&lt;/p&gt;

&lt;p&gt;npm list expo react react-native expo-modules-core&lt;/p&gt;

&lt;p&gt;When mismatches persisted, I:&lt;/p&gt;

&lt;p&gt;npm cache clean --force&lt;br&gt;
sudo rm -rf node_modules&lt;br&gt;
rm package-lock.json&lt;br&gt;
npx expo install --fix&lt;/p&gt;

&lt;p&gt;Verified correct versions:&lt;br&gt;
    • Expo 51.x&lt;br&gt;
    • React 18.2.0&lt;br&gt;
    • RN 0.74.x&lt;br&gt;
    • expo‑modules‑core 1.12.x&lt;/p&gt;

&lt;p&gt;Lesson 3: Manually set your SDK version in package.json&lt;br&gt;
• Clean‑install when deps get stuck&lt;br&gt;
• Always verify with npm list, don’t blindly trust --fix&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;The Pod Install Gauntlet&lt;/p&gt;

&lt;p&gt;cd ios&lt;br&gt;
npx pod-install&lt;/p&gt;

&lt;p&gt;Common Errors &amp;amp; Fixes&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;uninitialized constant FlipperConfiguration - Remove or comment out old Flipper logic in ios/Podfile.&lt;/li&gt;
&lt;li&gt;cannot load such file ... native_modules - Comment out the bad require_relative in Podfile or install @react-native-community/cli.&lt;/li&gt;
&lt;li&gt;undefined method use_expo_modules! - Ensure require for expo/scripts/autolinking is present.&lt;/li&gt;
&lt;li&gt;React-Runtime Hermes → minimum deployment target; Bump platform :ios, '15.0' (RN 0.74 needs ≥ 14.0/15.0).&lt;/li&gt;
&lt;li&gt;Unable to find a specification for fmt: rm ios/Podfile.lock to clear stale lock.&lt;/li&gt;
&lt;li&gt;Unable to find a specification for ExpoModulesCore: npm uninstall expo-random → npx expo install expo-crypto
npx expo install expo-modules-core
pod cache clean --all + pod repo update
Ensure source: '&lt;a href="https://cdn.cocoapods.org/" rel="noopener noreferrer"&gt;https://cdn.cocoapods.org/&lt;/a&gt;' in Podfile.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Lesson 4: Pod errors come in waves—fix one, the next appears.&lt;/p&gt;

&lt;p&gt;Lesson 5: Match your iOS deployment target to your RN version.&lt;/p&gt;

&lt;p&gt;Lesson 6: Deleting Podfile.lock often forces a fresh, clean resolution.&lt;/p&gt;

&lt;p&gt;Lesson 7: Migrate deprecated packages early.&lt;/p&gt;

&lt;p&gt;Lesson 8: Verify JS 👉 Native (.podspec) alignment.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;The EAS Build Environment Saga&lt;/p&gt;

&lt;p&gt;Cloud builds have their own quirks:&lt;/p&gt;

&lt;p&gt;eas build --profile production --platform ios&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;• expo doctor failures → fix locally, commit lockfiles.
• eas.json rejected cocoapodsVersion → remove it or update eas-cli.
• module redefinition (ReactCommon) → selective :modular_headers =&amp;gt; true in Podfile.
• Apple required Xcode 16 → set in eas.json:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;// eas.json excerpt&lt;br&gt;
{&lt;br&gt;
  "build": {&lt;br&gt;
    "production": {&lt;br&gt;
      "ios": {&lt;br&gt;
        "image": "macos-sonoma-14.6-xcode-16.1"&lt;br&gt;
      }&lt;br&gt;
    }&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Lesson 9: Always fix expo doctor issues locally and commit everything.&lt;/p&gt;

&lt;p&gt;Lesson 10: Keep your eas-cli up‑to‑date and resolve PATH conflicts.&lt;/p&gt;

&lt;p&gt;Lesson 11: If eas.json keys fail, check for deprecations or CLI versions.&lt;/p&gt;

&lt;p&gt;Lesson 12: Complex native errors sometimes need granular CocoaPods tweaks.&lt;/p&gt;

&lt;p&gt;⸻&lt;/p&gt;

&lt;p&gt;Success!&lt;/p&gt;

&lt;p&gt;Final command:&lt;/p&gt;

&lt;p&gt;eas build --profile production --platform ios --clear-cache&lt;/p&gt;

&lt;p&gt;✅ Result: A successful Expo SDK 51 build against Xcode 16/iOS 18 SDK.&lt;/p&gt;

&lt;p&gt;Upgrading in the Bare workflow isn’t always straightforward, but with methodical troubleshooting—both on the JS side and in CocoaPods &amp;amp; EAS—you can emerge victorious. Happy upgrading!&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>expo</category>
      <category>ios</category>
      <category>cocoapods</category>
    </item>
    <item>
      <title>I am in the process of converting my existing AI functions into ADK Agents for my learning platform Quiznect.com, and here I’ve started with validation of any learning goal in real‑time &amp; wiring it into the Quiznect React Native app</title>
      <dc:creator>Lawrence Norman</dc:creator>
      <pubDate>Mon, 21 Apr 2025 19:40:07 +0000</pubDate>
      <link>https://dev.to/lawrencenorman7hills/i-am-in-the-process-of-converting-my-existing-ai-functions-into-adk-agents-for-my-learning-platform-2h61</link>
      <guid>https://dev.to/lawrencenorman7hills/i-am-in-the-process-of-converting-my-existing-ai-functions-into-adk-agents-for-my-learning-platform-2h61</guid>
      <description></description>
      <category>ai</category>
      <category>reactnative</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
