Files
crowd-funder-for-time-pwa/doc/xcode-26-cocoapods-workaround.md
Jose Olarte III ae49c0e907 feat(ios): implement native share target for images
Implement iOS Share Extension to enable native image sharing from Photos
and other apps directly into TimeSafari. Users can now share images from
the iOS share sheet, which will open in SharedPhotoView for use as gifts
or profile pictures.

iOS Native Implementation:
- Add TimeSafariShareExtension target with ShareViewController
- Configure App Groups for data sharing between extension and main app
- Implement ShareViewController to process shared images and convert to base64
- Store shared image data in App Group UserDefaults
- Add ShareImageBridge utility to read shared data from App Group
- Update AppDelegate to handle shared-photo deep link and bridge data to JS

JavaScript Integration:
- Add checkAndStoreNativeSharedImage() in main.capacitor.ts to read shared
  images from native layer via temporary file bridge
- Convert base64 data to data URL format for compatibility with base64ToBlob
- Integrate with existing SharedPhotoView component
- Add "shared-photo" to deep link validation schema

Build System:
- Integrate Xcode 26 / CocoaPods compatibility workaround into build-ios.sh
- Add run_pod_install_with_workaround() for explicit pod install
- Add run_cap_sync_with_workaround() for Capacitor sync (which runs pod
  install internally)
- Automatically detect project format version 70 and apply workaround
- Remove standalone pod-install-workaround.sh script

Code Cleanup:
- Remove verbose debug logs from ShareViewController, AppDelegate, and
  main.capacitor.ts
- Retain essential logger calls for production debugging

Documentation:
- Add ios-share-extension-setup.md with manual Xcode setup instructions
- Add ios-share-extension-git-commit-guide.md for version control best practices
- Add ios-share-implementation-status.md tracking implementation progress
- Add native-share-target-implementation.md with overall architecture
- Add xcode-26-cocoapods-workaround.md documenting the compatibility issue

The implementation uses a temporary file bridge (AppDelegate writes to Documents
directory, JS reads via Capacitor Filesystem plugin) as a workaround for
Capacitor plugin auto-discovery issues. This can be improved in the future by
properly registering ShareImagePlugin in Capacitor's plugin registry.
2025-11-24 20:46:58 +08:00

2.6 KiB

Xcode 26 / CocoaPods Compatibility Workaround

Date: 2025-01-27
Issue: CocoaPods xcodeproj gem (1.27.0) doesn't support Xcode 26's project format version 70

The Problem

Xcode 26.1.1 uses project format version 70, but the xcodeproj gem (1.27.0) only supports up to version 56. This causes CocoaPods to fail with:

ArgumentError - [Xcodeproj] Unable to find compatibility version string for object version `70`.

Solutions

Before running pod install or npm run build:ios:

  1. Edit ios/App/App.xcodeproj/project.pbxproj
  2. Change line 6 from: objectVersion = 70; to: objectVersion = 56;
  3. Run your build/sync command
  4. Change it back to: objectVersion = 70; (Xcode will likely change it back automatically)

Warning: Xcode may automatically upgrade the format back to 70 when you open the project. This is okay - just repeat the process when needed.

Option 2: Wait for xcodeproj Update

The xcodeproj gem maintainers will eventually release a version that supports format 70. You can:

Option 3: Use Xcode Directly (Bypass CocoaPods for Now)

Since the Share Extension is already set up:

  1. Open the project in Xcode
  2. Build directly from Xcode (Product → Build)
  3. Skip npm run build:ios for now
  4. Test the Share Extension functionality

Option 4: Automated Workaround (Integrated into Build Script)

The workaround is now automatically integrated into scripts/build-ios.sh. When you run:

npm run build:ios

The build script will:

  1. Automatically detect if the project format is version 70
  2. Temporarily downgrade to version 56
  3. Run pod install
  4. Restore to version 70
  5. Continue with the build

No manual steps required! The workaround is transparent and only applies when needed.

To remove the workaround in the future:

  1. Check if xcodeproj gem supports format 70: bundle exec gem list xcodeproj
  2. Test if pod install works without the workaround
  3. If it works, remove the run_pod_install_with_workaround() function from scripts/build-ios.sh
  4. Replace it with a simple pod install call

Current Status

  • Share Extension target exists
  • Share Extension files are in place
  • Workaround integrated into build script
  • npm run build:ios works automatically

Recommendation

Use npm run build:ios - the workaround is handled automatically. No manual intervention needed.

Once xcodeproj is updated to support format 70, the workaround can be removed from the build script.