You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集成OneSignal后Flutter iOS应用CD流水线构建失败求助

Flutter集成OneSignal后iOS CD流水线构建失败(Xcode断言错误)

问题描述

我按照OneSignal的Flutter SDK教程配置推送通知后,iOS应用在CD流水线中无法构建,报错如下:

[17:24:47]: ▸ ProcessException: Process exited abnormally with exit code -6:
[17:24:47]: ▸ Command line invocation:
[17:24:47]: ▸ /Applications/Xcode_15.4.app/Contents/Developer/usr/bin/xcodebuild -list
[17:24:47]: ▸ User defaults from command line:
[17:24:47]: ▸ IDEPackageSupportUseBuiltinSCM = YES
[17:24:47]: ▸ 2025-03-10 17:24:46.855 xcodebuild[13337:34491] [MT] DVTAssertions: ASSERTION FAILURE in DevToolsCore/Xcode3Core/LegacyProjects/Frameworks/DevToolsCore/DevToolsCore/ProjectModel/DataModel/References/SynchronizedGroups/PBXFileSystemSynchronizedAbstractGroup.m:28
[17:24:47]: ▸ Details: Assertion failed: IDEFileSystemSynchronizedGroupsAreEnabled()
[17:24:47]: ▸ Object:
[17:24:47]: ▸ Method: +allocWithZone:
[17:24:47]: ▸ Thread: <_NSMainThread: 0x60000026c200>{number = 1, name = main}
[17:24:47]: ▸ Hints:
[17:24:47]: ▸ Backtrace:
[17:24:47]: ▸ 0 -[DVTAssertionHandler handleFailureInMethod:object:fileName:lineNumber:assertionSignature:messageFormat:arguments:] (in DVTFoundation)
[17:24:47]: ▸ 1 _DVTAssertionHandler (in DVTFoundation)
[17:24:47]: ▸ 2 _DVTAssertionFailureHandler (in DVTFoundation)
[17:24:47]: ▸ 3 _DVTAssertionWarningHandler (in DVTFoundation)

我的GitHub Actions流水线配置如下:

name: iOS Build and Deploy to App Store with Custom Version

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Version number'
        required: true
        default: '1.0.0'

env:
  FLUTTER_CHANNEL: "stable"
  RUBY_VERSION: "3.2.2"

jobs:
  build_ios:
    name: Build iOS
    runs-on: macos-latest
    timeout-minutes: 20
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: ${{ env.RUBY_VERSION }}
          bundler-cache: true
          working-directory: 'daytistics/ios'

      - name: Clean up vendor
        working-directory: 'daytistics/ios'
        run: rm -rf vendor

      - name: Install Bundler Gems
        working-directory: 'daytistics/ios'
        run: bundle install

      - name: Run Flutter tasks and get pub packages
        uses: subosito/flutter-action@v2.16.0
        with:
          flutter-version-file: 'daytistics/pubspec.yaml'
          channel: ${{ env.FLUTTER_CHANNEL }}
          cache: true

      - name: Get Flutter Packages
        working-directory: ./daytistics
        run: flutter pub get

      - name: Install Bundler Gems
        working-directory: 'daytistics/ios'
        run: |
          bundle install
          bundle exec pod repo update  # Add this line
      # Remove the "Reinstall CocoaPods" step entirely

      - name: Pod Install
        working-directory: 'daytistics/ios'
        run: bundle exec pod install 

      - name: Clean Flutter build
        working-directory: ./daytistics
        run: flutter clean

      - name: Create .env file
        working-directory: ./daytistics
        run: touch .env

      - uses: maierj/fastlane-action@v3.1.0
        with:
          lane: 'release_app_store'
          subdirectory: daytistics/ios
          options: '{
            "version_number": "${{ github.event.inputs.version }}", 
            "env_vars": ["SUPABASE_URL", "SUPABASE_ANON_KEY", "POSTHOG_API_KEY", "SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID", "SENTRY_DSN"]
            }'
        env:
          ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }}
          ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }}
          ASC_KEY_P8_BASE64: ${{ secrets.ASC_KEY_P8_BASE64 }}
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
          MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }}
          APP_BUNDLE_ID: ${{ secrets.APP_BUNDLE_ID }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          SUPABASE_URL: ${{ secrets.SUPABASE_URL }}
          SUPABASE_ANON_KEY: ${{ secrets.SUPABASE_ANON_KEY }}
          POSTHOG_API_KEY: ${{ secrets.POSTHOG_API_KEY }}
          SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID: ${{ secrets.SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_ID }}
          SENTRY_DSN: ${{ secrets.SENTRY_DSN }}

应用在本地模拟器运行正常,我怀疑问题出在Xcode的签名功能(Signing Capabilities)配置上,而非流水线本身。

可能的解决方案

1. 修复Xcode文件同步组配置

这个断言错误大概率和Xcode的FileSystem Synchronized Groups功能冲突,集成OneSignal时可能误改了项目结构:

  • 打开本地iOS项目(daytistics/ios/Runner.xcworkspace)
  • 在项目导航栏右键根目录,选择Add Files to "Runner"
  • 弹出窗口中取消勾选Copy items if needed,确保Added folders选择Create groups而非Create folder references
  • 保存项目后重新提交代码到仓库

2. 校验推送通知签名权限

针对你怀疑的签名能力问题,重点检查以下配置:

  • 在Xcode中选择Runner target,进入Signing & Capabilities标签页
  • 确认Push Notifications能力已添加,且对应的Provisioning Profile包含推送权限
  • 检查Provisioning Profile是App Store发布类型(而非开发环境),并确保流水线中Match配置能正确拉取该Profile

3. 给Xcode命令添加同步组参数

在fastlane或xcodebuild命令中强制开启同步组功能,避免触发断言:

  • 在fastlane的release_app_store lane中,修改build_app方法:
    build_app(
      # 其他原有参数...
      xcargs: "IDEFileSystemSynchronizedGroupsAreEnabled=YES"
    )
    
  • 如果是直接调用xcodebuild,加上参数:-IDEFileSystemSynchronizedGroupsAreEnabled=YES

4. 降级Xcode版本(临时方案)

Xcode 15.4的这个断言错误可能是版本bug,可在流水线中指定使用Xcode 15.3:

  • 在build_ios job中添加步骤:
    - name: Set Xcode 15.3
      run: sudo xcode-select -s /Applications/Xcode_15.3.app/Contents/Developer
    

5. 重新生成iOS项目文件

如果以上方法都无效,尝试重置iOS项目文件:

  • 本地执行命令:
    cd daytistics
    flutter clean
    rm -rf ios
    flutter create --platforms ios .
    
  • 重新配置OneSignal和签名设置后,提交代码到仓库重试构建

内容的提问来源于stack exchange,提问作者Leo Gall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:14:53