<?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&amp;nbsp;50 →&amp;nbsp;51 in the Bare workflow to meet Apple’s iOS&amp;nbsp;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&amp;nbsp;17.5 SDK. Starting April&amp;nbsp;24,&amp;nbsp;2025, all iOS and iPadOS apps must be built with the iOS&amp;nbsp;18 SDK or later, included in Xcode&amp;nbsp;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&amp;nbsp;SDK&amp;nbsp;50 →&amp;nbsp;SDK&amp;nbsp;51 in the Bare Workflow. It wasn’t pretty, but I emerged with an iOS&amp;nbsp;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&amp;nbsp;SDK&amp;nbsp;50 to SDK&amp;nbsp;51&lt;br&gt;
    • Meet Apple’s iOS&amp;nbsp;18 SDK requirement (Xcode&amp;nbsp;16+) by April&amp;nbsp;24,&amp;nbsp;2025&lt;br&gt;
    • Stay reasonably up‑to‑date without jumping straight to SDK&amp;nbsp;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&amp;nbsp;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&amp;nbsp;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&amp;nbsp;52) but pivoted to the stable SDK&amp;nbsp;51. In package.json:&lt;/p&gt;

&lt;p&gt;"dependencies": {&lt;br&gt;
   "expo": "~51.0.0",      // target SDK&amp;nbsp;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&amp;nbsp;51.x&lt;br&gt;
    • React&amp;nbsp;18.2.0&lt;br&gt;
    • RN&amp;nbsp;0.74.x&lt;br&gt;
    • expo‑modules‑core&amp;nbsp;1.12.x&lt;/p&gt;

&lt;p&gt;Lesson&amp;nbsp;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&amp;nbsp;0.74 needs ≥&amp;nbsp;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&amp;nbsp;4: Pod errors come in waves—fix one, the next appears.&lt;/p&gt;

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

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

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

&lt;p&gt;Lesson&amp;nbsp;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&amp;nbsp;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&amp;nbsp;9: Always fix expo doctor issues locally and commit everything.&lt;/p&gt;

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

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

&lt;p&gt;Lesson&amp;nbsp;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&amp;nbsp;SDK&amp;nbsp;51 build against Xcode&amp;nbsp;16/iOS&amp;nbsp;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>
