Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.
Thanks so much, so just open those two and that's it. So iTunes recognised the phone after the mobile device installer, what do I need the the CoreTypes one for, what does that one do?

17 went quick! Big big shame, hope they sort this on next .1
 
Last edited:
what do I need the the CoreTypes one for, what does that one do?
Based on its contents, I suspect CoreTypes.pkg provides icons, so that iOS devices appear nice in Finder, iTunes and Apple Configurator. 🙂
CoreTypes.jpg
 
  • Like
Reactions: Peter Franks
I’m going to have to (unfortunately, for compatibility reasons) restore an iPhone 11 on iOS 14 to the latest iOS 18 version. I have a 2015 MacBook Pro running… OS X El Capitan 10.11.6. iTunes hasn’t worked with more recent iOS versions in a long time.

If I install this for El Cap, would I be able to restore without issues? Or am I better off doing it on Windows?
 
If I install this for El Cap, would I be able to restore without issues? Or am I better off doing it on Windows?
The two pkg files liked above are also present in the seed catalog for El Capitan. Based on that, I assume that it would be possible, but I don’t have El Capitan to test.

If you have access to Windows with the latest iTunes and Apple software updates, it’s probably safer to restore your iPhone than on El Capitan.

Update Apple software for Microsoft Windows https://support.apple.com/en-us/118406
 

YOU ABSOLUTE LEGEND!! I updated iOS 18.4 last night, went to iTunes this afternoon, the pop up for what I presume is this installation came up on MBP when I plugged iPhone in, and it said 'failed'. As it always does, every time. Come on here, and you've already done the business. I salute you, as do all of us olduns who are still on High Sierra and the like. I've no idea what the installs do or how it makes it work with iOS, or even what they do to make it stop working with iOS every update, but you are a lifesaver. Thanks again.
 
Last edited:
  • Like
Reactions: bogdanw
I’m glad the files are helpful and I hope this will be even more.
Here is a small script that get the links from Apple. All you have to do is open Terminal (/Applications/Utilities/Terminal), copy-paste the code below and press return.
The script:
Bash:
link=$( plutil -p /System/Library/PrivateFrameworks/Seeding.framework/Resources/SeedCatalogs.plist | grep 'DeveloperSeed' | sed -e s/'"DeveloperSeed" => "'//g -e s/'.gz"'//g -e s/\ //g )
for file in $(curl -# $link | grep MobileDeviceOnDemand.pkg | grep -Evw '(MobileDeviceOnDemand.smd|MobileDeviceOnDemand.pkm)' | sed -e s/"<string>"//g -e s/"<\/string>"//g -e s/\ //g); do
    echo $file
    echo $file | sed -e "s/MobileDeviceOnDemand.pkg/CoreTypes.pkg/g"
done

Video demonstration:


Explanation: The script reads the seed catalog link, that lists available pkg updates, from /System/Library/PrivateFrameworks/Seeding.framework/Resources/SeedCatalogs.plist and selects from it only the links for MobileDeviceOnDemand.pkg & CoreTypes.pkg.
 
I’m glad the files are helpful and I hope this will be even more.
Here is a small script that get the links from Apple. All you have to do is open Terminal (/Applications/Utilities/Terminal), copy-paste the code below and press return.
The script:
Bash:
link=$( plutil -p /System/Library/PrivateFrameworks/Seeding.framework/Resources/SeedCatalogs.plist | grep 'DeveloperSeed' | sed -e s/'"DeveloperSeed" => "'//g -e s/'.gz"'//g -e s/\ //g )
for file in $(curl -# $link | grep MobileDeviceOnDemand.pkg | grep -Evw '(MobileDeviceOnDemand.smd|MobileDeviceOnDemand.pkm)' | sed -e s/"<string>"//g -e s/"<\/string>"//g -e s/\ //g); do
    echo $file
    echo $file | sed -e "s/MobileDeviceOnDemand.pkg/CoreTypes.pkg/g"
done

Video demonstration:
View attachment 2508838

Explanation: The script reads the seed catalog link, that lists available pkg updates, from /System/Library/PrivateFrameworks/Seeding.framework/Resources/SeedCatalogs.plist and selects from it only the links for MobileDeviceOnDemand.pkg & CoreTypes.pkg.
They've done it again, but interestingly it still connected to iOS26, but when iOS26.0.1 came out, iTunes 12.8.3.1 locked it out again. Why do they keep doing it, what changes all the time? @bogdanw your script worked great, so many thanks as always!
 
Last edited:
Here is a more robust version of @bogdanw Script:
all I added was so it auto fetches the latest release by post date, downloads to users downloads folder, installs them & restarts mobile device services.

as running:
Code:
"/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/Current/Resources/MobileDeviceUpdater.app/Contents/MacOS/MobileDeviceUpdater"
was not doing it for me, old system just refuses to do it. (hangs for hours on end)

Bash:
#!/usr/bin/env zsh

set -euo pipefail

# Foundation of this script came from a MacRumors post by bogdanw:
# https://forums.macrumors.com/threads/itunes-software-updates.2416893/page-3?post=33894235#post-33894235

# Download destination.
TARGET_DIR="$HOME/Downloads"
mkdir -p "$TARGET_DIR"

echo "Getting DeveloperSeed catalog URL..."

CATALOG_URL=$(
  plutil -p /System/Library/PrivateFrameworks/Seeding.framework/Resources/SeedCatalogs.plist \
  | awk -F'"' '/DeveloperSeed/ {print $4; exit}' \
  | sed 's/\.gz$//'
)

if [[ -z "${CATALOG_URL:-}" ]]; then
  echo "Failed to find DeveloperSeed catalog URL."
  exit 1
fi

echo "Catalog URL:"
echo "$CATALOG_URL"
echo

CATALOG_FILE="$(mktemp)"
URLS_FILE="$(mktemp)"

cleanup() {
  rm -f "$CATALOG_FILE" "$URLS_FILE"
}

trap cleanup EXIT

if (( EUID == 0 )); then
  INSTALLER_CMD=(/usr/sbin/installer)
  LAUNCHCTL_CMD=(/bin/launchctl)
else
  INSTALLER_CMD=(sudo /usr/sbin/installer)
  LAUNCHCTL_CMD=(sudo /bin/launchctl)
fi

echo "Fetching catalog..."
curl -fsSL "$CATALOG_URL" -o "$CATALOG_FILE"

echo "Selecting newest package URLs..."

LATEST_URL=$(
  awk '
    /<string>.*MobileDeviceOnDemand\.pkg<\/string>/ {
      if ($0 !~ /MobileDeviceOnDemand\.(smd|pkm)<\/string>/) {
        line = $0
        sub(/^.*<string>/, "", line)
        sub(/<\/string>.*$/, "", line)
        current_url = line
      }
    }
    /<key>PostDate<\/key>/ {
      expect_date = 1
      next
    }
    expect_date && /<date>/ {
      line = $0
      sub(/^.*<date>/, "", line)
      sub(/<\/date>.*$/, "", line)
      if (current_url != "") {
        print line "\t" current_url
        current_url = ""
      }
      expect_date = 0
    }
  ' "$CATALOG_FILE" \
  | sort -r \
  | awk 'NR == 1 { print $2 }'
)

if [[ -z "${LATEST_URL:-}" ]]; then
  echo "No MobileDeviceOnDemand.pkg URL found."
  exit 1
fi

{
  echo "$LATEST_URL"
  echo "${LATEST_URL/MobileDeviceOnDemand.pkg/CoreTypes.pkg}"
} | awk '!seen[$0]++' > "$URLS_FILE"

if [[ ! -s "$URLS_FILE" ]]; then
  echo "No package URLs found."
  exit 1
fi

echo
echo "URLs to download:"
cat "$URLS_FILE"
echo

echo "Downloading to: $TARGET_DIR"
echo

while IFS= read -r pkg_url; do
  [[ -n "$pkg_url" ]] || continue
  echo "Downloading URL:"
  echo "$pkg_url"
  curl -fL --show-error --progress-bar -o "$TARGET_DIR/$(basename "$pkg_url")" "$pkg_url"
  echo
done < "$URLS_FILE"

echo "Files saved in: $TARGET_DIR"
echo

install_pkg() {
  local pkg_path="$1"

  if [[ ! -f "$pkg_path" ]]; then
    echo "Missing package: $pkg_path"
    exit 1
  fi

  echo "Installing package:"
  echo "$pkg_path"
  "${INSTALLER_CMD[@]}" -verboseR -pkg "$pkg_path" -target /
  echo
}

restart_mobile_services() {
  local usbmux_label="com.apple.usbmuxd"
  local usbmux_plist="/System/Library/LaunchDaemons/com.apple.usbmuxd.plist"
  local old_pid=""
  local new_pid=""

  echo "Restarting mobile device services..."
  echo

  old_pid="$(/usr/bin/pgrep -x usbmuxd | head -n 1 || true)"

  # Kill usbmuxd first and let launchd respawn it.
  if /usr/bin/pgrep -x usbmuxd >/dev/null 2>&1; then
    echo "Stopping usbmuxd with killall..."
    if (( EUID == 0 )); then
      /usr/bin/killall -TERM usbmuxd >/dev/null 2>&1 || true
    else
      sudo /usr/bin/killall -TERM usbmuxd >/dev/null 2>&1 || true
    fi
    sleep 2
  fi

  new_pid="$(/usr/bin/pgrep -x usbmuxd | head -n 1 || true)"
  if [[ -n "$new_pid" ]]; then
    if [[ -n "$old_pid" && "$new_pid" != "$old_pid" ]]; then
      echo "usbmuxd restarted successfully with new PID: $new_pid"
    else
      echo "usbmuxd is running with PID: $new_pid"
    fi
    return 0
  fi

  echo "Trying launchctl kickstart..."
  if "${LAUNCHCTL_CMD[@]}" kickstart "system/$usbmux_label" >/dev/null 2>&1; then
    sleep 2
    new_pid="$(/usr/bin/pgrep -x usbmuxd | head -n 1 || true)"
    if [[ -n "$new_pid" ]]; then
      if [[ -n "$old_pid" && "$new_pid" != "$old_pid" ]]; then
        echo "usbmuxd restarted via launchctl kickstart with new PID: $new_pid"
      else
        echo "usbmuxd is running after launchctl kickstart with PID: $new_pid"
      fi
      return 0
    fi
  fi

  if [[ -e "$usbmux_plist" ]]; then
    echo "Trying legacy launchctl unload/load..."
    "${LAUNCHCTL_CMD[@]}" unload "$usbmux_plist" >/dev/null 2>&1 || true
    sleep 1
    "${LAUNCHCTL_CMD[@]}" load "$usbmux_plist" >/dev/null 2>&1 || true
    sleep 2

    new_pid="$(/usr/bin/pgrep -x usbmuxd | head -n 1 || true)"
    if [[ -n "$new_pid" ]]; then
      if [[ -n "$old_pid" && "$new_pid" != "$old_pid" ]]; then
        echo "usbmuxd restarted via legacy unload/load with new PID: $new_pid"
      else
        echo "usbmuxd is running after legacy unload/load with PID: $new_pid"
      fi
      return 0
    fi
  fi

  echo "Could not confirm usbmuxd restarted."
  echo "Most reliable fallback: unplug the iPhone, reconnect it, or reboot the Mac."
  return 1
}

CORETYPES_PATH="$TARGET_DIR/$(basename "${LATEST_URL/MobileDeviceOnDemand.pkg/CoreTypes.pkg}")"
MOBILEDEVICE_PATH="$TARGET_DIR/$(basename "$LATEST_URL")"

echo "Installing downloaded packages..."
echo
install_pkg "$CORETYPES_PATH"
install_pkg "$MOBILEDEVICE_PATH"

echo "Install completed successfully."
if ! restart_mobile_services; then
  echo "Mobile device services restart could not be confirmed."
fi
echo "Done."

just call via
Code:
zsh fetch-ios-pkgs.zsh
Live Updated ver on my repo: zsh fetch-ios-pkgs.zsh
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.