Posts

Writing about building and shipping small, focused software products.

Original Xcode privacy manifest configuration

Fix ITMS-91053: Missing API Declaration in PrivacyInfo.xcprivacy

ITMS-91053: Missing API declaration identifies a required-reason API category used by an app or included SDK. Trace the reported category to the responsible code, choose an approved reason that fits that use, and inspect the manifest in the actual submitted bundle. Adding a plist that parses successfully is only one part of the fix. Identify the category and the code owner Save the full App Store Connect message, including the category, affected binary or bundle path if supplied, app version and build number. Inspect your code and dependencies for that API. For a UserDefaults warning, search for UserDefaults, NSUserDefaults and any wrappers or SDKs that access preferences. Text search does not prove a compiled dependency is free of the API. Decide whether the use belongs to the app, an extension or an SDK. Inspect that target or dependency’s manifest and version. Read the current approved reasons, and document how the actual behavior fits the selected reason. Do not add unrelated categories to silence a warning. The historical 2024 case involved NSPrivacyAccessedAPICategoryUserDefaults. Apple’s required-reason guidance separates app and SDK responsibilities. Permission prompts and tracking consent do not replace these declarations.
App review illustration

App Store Guideline 5: A 2024 China Availability Rejection

This is a January 2024 App Store review case, not a current interpretation of Chinese law. The reviewer associated the app’s ChatGPT/GPT references with mainland-China regulatory requirements and asked for changes to the China version or its distribution. What the historical feedback requested The recorded feedback offered two paths: suppress the relevant functionality and metadata in the China version, or deselect the mainland-China storefront in App Store Connect. It also invited the developer to provide compliance information if they believed the app already met the requirements.
App Store review feedback illustration

App Store Guideline 4.0: Reopen a Closed Mac App Window

This Guideline 4.0 Design case concerns a Mac app that stays running after its main window closes but offers no way to reopen it. Choose an explicit window policy: quit after the last window closes, or keep running and provide both a menu action and Dock reopening behavior. This fixes this particular lifecycle problem; it does not address every Design rejection. Reproduce before changing the lifecycle Launch the submitted version and open its main window. Close it with the red close button, without choosing Quit. Check whether the process and app menu remain active. Click the Dock icon and look for a Window or equivalent menu action. Record which action fails to restore the interface. The historical note described a missing menu item. The image above is an illustration, not an original reviewer screenshot. No original review transcript or new acceptance receipt was available for this revision.

macOS Read-Only Root: Create a Path with synthetic.conf

If sudo mkdir /photo returns Read-only file system on macOS, sudo cannot make the protected system volume writable. If an existing application really needs a root-level path, a synthetic link can map that name to a writable data directory. If you can change the application configuration, using the data directory directly is simpler. Choose the appropriate path first Situation Appropriate next step You control the application’s storage setting Use a directory owned by the intended account; no root alias is needed. A tool requires a fixed root path such as /photo Evaluate a two-column synthetic.conf entry pointing to an existing directory. An external disk, ordinary user folder or network mount is read-only Investigate that volume’s format, mount state and permissions; this guide does not repair those problems. You need a root mount point for another filesystem A one-column synthetic directory is a different configuration; it is not general writable storage. The original note targeted Monterey. Apple’s local synthetic.conf(5) manual describes synthetic entities created during early boot; Apple Developer Technical Support recommends synthetic symlinks for common root-path needs. This does not unlock the system volume or require disabling SIP.

GitHub SSH: Fix “REMOTE HOST IDENTIFICATION HAS CHANGED” Safely

When Git reports REMOTE HOST IDENTIFICATION HAS CHANGED, stop and compare the presented host key with GitHub’s official fingerprints. Only replace a stale known_hosts entry after confirming the server’s identity. Do not disable host-key checking to make the error disappear. Why CocoaPods can show a GitHub SSH warning The original case occurred while CocoaPods cloned a dependency through git@github.com. The failed operation was an SSH identity check underneath dependency installation, not a Podfile syntax error.
CocoaPods on macOS

Install CocoaPods Without Sudo on macOS

To install CocoaPods without administrator privileges, use a compatible Ruby, a user-owned gem directory, and a PATH that selects their executables. Changing GEM_HOME does not install or switch Ruby. Check all three before adding sudo to an error message. Choose an installation route Starting point Recommended next step A compatible Ruby is already configured outside system Ruby Keep that interpreter and install gems into a writable directory. Only macOS system Ruby is available Prepare a separate compatible Ruby first; a writable GEM_HOME cannot fix an unsupported interpreter. The project already has Gemfile and Gemfile.lock Follow that project’s tool versions and use bundle exec. Do not replace its Gemfile with this example. A working Homebrew-managed pod is already installed Check its wrapper and Ruby ownership before mixing it with a separate gem/Bundler environment. CocoaPods recommends a Ruby separate from macOS’s system Ruby. Homebrew or a Ruby version manager can supply it, but each has its own installation requirements. This walkthrough starts with an existing compatible Ruby; it does not claim that preparing Homebrew or Ruby always requires no administrator access.
CocoaPods illustration

CocoaPods 1.8.5 CDN Response 400: A Historical Specs Fallback

A CocoaPods CDN Response 400 needs diagnosis at the specification-source layer. Record the failing URL and CocoaPods version before changing dependencies. The original case used CocoaPods 1.8.5 and worked around a source download failure by using the Git Specs repository. Identify the failed source The historical error included: [!] CDN: trunk URL couldn't be downloaded: https://raw.githubusercontent.com/CocoaPods/Specs/master/Specs/ Response: 400 Capture the complete output from pod install --verbose in your own project. Check pod --version and the source declarations in the Podfile. DNS, proxies, repository availability and obsolete tooling can produce different failures; this message is not proof of a broken pod package.
Mac workstation illustration

Xcode Not Enough Disk Space on macOS: Check Storage Safely

When Xcode reports not enough disk space, check available storage and large developer artifacts before deleting files. An installation can require space beyond the final application size for downloading and unpacking its contents. Scope of the original case The original note concerned Xcode 11 on macOS Catalina in 2019. It suggested clearing developer directories but incorrectly described DeviceSupport as simulator models. This revision distinguishes the types of data rather than recommending blanket deletion.
TortoiseSVN Update to revision menu

SVN Checksum Mismatch: A TortoiseSVN Recovery Checklist

An SVN checksum mismatch while updating means content being checked does not match its expected checksum. Preserve the working copy before attempting recovery. The historical TortoiseSVN workaround below is a candidate to investigate, not a universal repair. A fresh checkout into a separate directory provides an independent check without destroying local work. First record the error and protect local changes Keep the complete error message, affected file path, repository URL, client version and working-copy revision. If SVN commands fail because metadata is damaged, make a full filesystem backup before trying any recovery, and record which commands failed.