SwiftUI: Automatic preview updating paused, always

XcodeSwiftui

Xcode Problem Overview


I have an existing App, basically a shopping list app, to which I'm trying to add some sweet sweet SwiftUI lovin.

My issue is the real time preview updating doesn't work - the warning "Automatic preview updating paused" continually shows. I hit the resume button, it builds the app, it shows the current view, and that warning immediately shows again. I can never see changes to the code reflected in the canvas without using the resume button.

This is happening in Xcode 11.1, and 11.2 beta 2. I can find literally no other mention of this either here on SO, and there's one thread with no answers on Apple's Dev forums.

Xcode Solutions


Solution 1 - Xcode

If you're having custom Run Script Phases in Build Phases and you don't want (or can't) remove them, then try to check checkbox "Run script only when installing".

enter image description here

Solution 2 - Xcode

The problem with all the given answers is that you need to check or uncheck your script in debug mode if you want to make the preview work.

Here is a convenient alternative using the environment variables.

This is really simple

Embed all the content of your script in an if statement that check if we're using the preview or not. If we're in preview, then don't run the content of your script, otherwise, let's run it. And you don't have to sacrifice your script for release versions only.

Here is the template :

if [ $ENABLE_PREVIEWS == "NO" ]
then
  # your code to execute here
else
  echo "Skipping the script because of preview mode"
fi

And below a full example that I use to bump my build version number

# xcode-build-bump.sh
# @desc Auto-increment the build number every time the project is run.
# @usage
# 1. Select: your Target in Xcode
# 2. Select: Build Phases Tab
# 3. Select: Add Build Phase -> Add Run Script
# 4. Paste code below in to new "Run Script" section
# 5. Drag the "Run Script" below "Link Binaries With Libraries"
# 6. Insure that your starting build number is set to a whole integer and not a float (e.g. 1, not 1.0)
if [ $ENABLE_PREVIEWS == "NO" ]
then
  buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${PROJECT_DIR}/${INFOPLIST_FILE}")
  buildNumber=$(($buildNumber + 1))
  /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"
else
  echo "Skipping Bump of version"
  echo $ENABLE_PREVIEWS
fi

Solution 3 - Xcode

I ended up sending in feedback to Apple, and they responded with a fix. I have a build script in the target that auto-increments the build number. If I remove that script then previewing works as intended.

So if you're having this issue remove anything in Target -> Build Phases -> Run Script and try again. The canvas preview should update as you would expect.

Solution 4 - Xcode

For me, Canvas did not work when I had Legacy Build System.

You can change it via,

File -> Project Settings (or Workspace Settings) -> Build System -> Choose "New Build System(Default).

As it says, it is the default option. If for any reason Legacy build system was chosen, Canvas won't work.

Edit on June 30, 2020: We no longer have Legacy Build System in Xcode 12 beta.

Solution 5 - Xcode

In my experiements I found that ENABLE_PREVIEWS is always set to YES in a SwiftUI project. Instead I found that in normal builds Xcode sets TARGET_DEVICE_MODEL and in SwiftUI it does not.

So the solution is like the one described in this answer: https://stackoverflow.com/a/62216533/833197 but using a different variable.

On another note, setting anything in the Info.plist in a build script seems to be "too late" in recent Xcode versions. It will not be used until next build. Also you end up with a modified version control working copy of your files which might not be what you want.

To resolve this I have

  1. Used a pre-build script in the build scheme instead
  2. Generated a xcconfig with the build number and made it ignored by the version control system (git in my case).

The variables set in a xcconfig file can be referenced in the Info.plist file.

Solution 6 - Xcode

What worked for me was to "clean" Xcode

On the Mac

Open Xcode

command+k (Clean console)

command+option+k (Reload console)

command+option+shift+k (Clean build folder)

Exit Xcode

From a terminal window, clean the derived data. I run the following based on where my Xcode is installed. I believe its the base location

rm -rf ~/Library/Developer/Xcode/DerivedData

Re-open xcode and it worked great!

Solution 7 - Xcode

It's strange. But for me automatic preview always fails when I name projects using digits only (i. e. "111"). When naming using letters (with or without digits), everything is ok. 12.3 beta (12C5020f), Big Sur beta 11.1 (20C5048k).

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBrian MView Question on Stackoverflow
Solution 1 - XcodeKacper DziubekView Answer on Stackoverflow
Solution 2 - XcodeVaseltiorView Answer on Stackoverflow
Solution 3 - XcodeBrian MView Answer on Stackoverflow
Solution 4 - XcodeImthathView Answer on Stackoverflow
Solution 5 - XcodeNicolai HenriksenView Answer on Stackoverflow
Solution 6 - XcodeJacksonsoxView Answer on Stackoverflow
Solution 7 - XcodeДмитрий АкимовView Answer on Stackoverflow