pindo 5.13.1 → 5.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. checksums.yaml +4 -4
  2. data/lib/pindo/base/git_handler.rb +692 -0
  3. data/lib/pindo/command/android/autobuild.rb +2 -2
  4. data/lib/pindo/command/appstore/adhocbuild.rb +258 -311
  5. data/lib/pindo/command/appstore/autobuild.rb +203 -0
  6. data/lib/pindo/command/appstore/autoresign.rb +35 -17
  7. data/lib/pindo/command/appstore/bundleid.rb +120 -0
  8. data/lib/pindo/command/appstore/cert.rb +212 -0
  9. data/lib/pindo/command/appstore/configproj.rb +81 -0
  10. data/lib/pindo/command/{deploy → appstore}/getitcinfo.rb +76 -91
  11. data/lib/pindo/command/appstore/iap.rb +788 -24
  12. data/lib/pindo/command/appstore/initconfig.rb +105 -0
  13. data/lib/pindo/command/appstore/itcapp.rb +95 -13
  14. data/lib/pindo/command/{deploy → appstore}/itcinfo.rb +90 -118
  15. data/lib/pindo/command/appstore/pem.rb +136 -0
  16. data/lib/pindo/command/appstore/pullconfig.rb +99 -0
  17. data/lib/pindo/command/appstore/quswark.rb +87 -0
  18. data/lib/pindo/command/appstore/quswauth.rb +67 -0
  19. data/lib/pindo/command/appstore/tag.rb +77 -0
  20. data/lib/pindo/command/appstore.rb +13 -1
  21. data/lib/pindo/command/env/quarkenv.rb +11 -13
  22. data/lib/pindo/command/env/swarkenv.rb +11 -16
  23. data/lib/pindo/command/ios/autobuild.rb +64 -43
  24. data/lib/pindo/command/ios/autoresign.rb +34 -19
  25. data/lib/pindo/command/ios/build.rb +9 -6
  26. data/lib/pindo/command/ios/cert.rb +27 -20
  27. data/lib/pindo/command/jps/upload.rb +3 -3
  28. data/lib/pindo/command/unity/autobuild.rb +2 -2
  29. data/lib/pindo/command/utils/clearcert.rb +2 -17
  30. data/lib/pindo/command/{deploy → utils}/fabric.rb +13 -13
  31. data/lib/pindo/command/utils/renewcert.rb +62 -38
  32. data/lib/pindo/command/utils/renewproj.rb +0 -3
  33. data/lib/pindo/command/{deploy → utils}/updateconfig.rb +6 -7
  34. data/lib/pindo/command/utils.rb +2 -0
  35. data/lib/pindo/command/web/autobuild.rb +2 -2
  36. data/lib/pindo/command.rb +30 -3
  37. data/lib/pindo/config/build_info_manager.rb +176 -0
  38. data/lib/pindo/config/ios_config_parser.rb +404 -0
  39. data/lib/pindo/module/android/android_config_helper.rb +9 -5
  40. data/lib/pindo/module/appstore/bundleid_helper.rb +349 -0
  41. data/lib/pindo/module/appstore/itcapp_helper.rb +228 -0
  42. data/lib/pindo/module/build/build_helper.rb +12 -0
  43. data/lib/pindo/module/build/swark_helper.rb +116 -77
  44. data/lib/pindo/module/cert/cert_helper.rb +74 -0
  45. data/lib/pindo/module/cert/pem_helper.rb +72 -0
  46. data/lib/pindo/module/cert/{xcodecerthelper.rb → xcode_cert_helper.rb} +208 -6
  47. data/lib/pindo/module/task/model/appstore/appstore_task.rb +18 -0
  48. data/lib/pindo/module/task/model/appstore/appstore_upload_ipa_task.rb +151 -0
  49. data/lib/pindo/module/task/model/appstore/appstore_upload_metadata_task.rb +250 -0
  50. data/lib/pindo/module/task/model/appstore/appstore_upload_screenshot_task.rb +276 -0
  51. data/lib/pindo/module/task/model/build/android_build_adhoc_task.rb +210 -0
  52. data/lib/pindo/module/task/model/build/{android_dev_build_task.rb → android_build_dev_task.rb} +2 -2
  53. data/lib/pindo/module/task/model/build/android_build_gplay_task.rb +210 -0
  54. data/lib/pindo/module/task/model/build/android_build_task.rb +13 -0
  55. data/lib/pindo/module/task/model/build/ios_build_adhoc_task.rb +197 -0
  56. data/lib/pindo/module/task/model/build/ios_build_appstore_task.rb +367 -0
  57. data/lib/pindo/module/task/model/build/{ios_dev_build_task.rb → ios_build_dev_task.rb} +37 -27
  58. data/lib/pindo/module/task/model/build/ios_build_task.rb +13 -0
  59. data/lib/pindo/module/task/model/build/{web_dev_build_task.rb → web_build_dev_task.rb} +1 -1
  60. data/lib/pindo/module/task/model/build_task.rb +15 -12
  61. data/lib/pindo/module/task/model/jps_resign_task.rb +185 -0
  62. data/lib/pindo/module/task/model/{upload_task.rb → jps_upload_task.rb} +3 -3
  63. data/lib/pindo/module/task/model/unity_export_task.rb +3 -1
  64. data/lib/pindo/module/unity/unity_helper.rb +2 -1
  65. data/lib/pindo/module/xcode/ipa_resign_helper.rb +210 -0
  66. data/lib/pindo/module/xcode/{xcodeappconfig.rb → xcode_app_config.rb} +79 -0
  67. data/lib/pindo/module/xcode/xcode_build_config.rb +152 -17
  68. data/lib/pindo/module/xcode/xcode_build_helper.rb +151 -1
  69. data/lib/pindo/module/xcode/xcode_swark_helper.rb +341 -0
  70. data/lib/pindo/options/core/global_options_state.rb +268 -0
  71. data/lib/pindo/options/core/option_configuration.rb +206 -0
  72. data/lib/pindo/options/core/option_initializer.rb +51 -0
  73. data/lib/pindo/options/core/option_item.rb +144 -0
  74. data/lib/pindo/options/core/option_value_parser.rb +54 -0
  75. data/lib/pindo/options/groups/build_options.rb +60 -0
  76. data/lib/pindo/options/groups/jps_options.rb +70 -0
  77. data/lib/pindo/options/groups/option_group.rb +73 -0
  78. data/lib/pindo/options/helpers/bundleid_selector.rb +103 -0
  79. data/lib/pindo/options/options.rb +14 -0
  80. data/lib/pindo/version.rb +1 -1
  81. metadata +49 -40
  82. data/lib/pindo/command/appstore/import.rb +0 -259
  83. data/lib/pindo/command/deploy/build.rb +0 -250
  84. data/lib/pindo/command/deploy/bundleid.rb +0 -259
  85. data/lib/pindo/command/deploy/cert.rb +0 -202
  86. data/lib/pindo/command/deploy/check.rb +0 -93
  87. data/lib/pindo/command/deploy/configproj.rb +0 -120
  88. data/lib/pindo/command/deploy/confusecode.rb +0 -262
  89. data/lib/pindo/command/deploy/confuseproj.rb +0 -122
  90. data/lib/pindo/command/deploy/iap.rb +0 -826
  91. data/lib/pindo/command/deploy/initconfig.rb +0 -138
  92. data/lib/pindo/command/deploy/itcapp.rb +0 -146
  93. data/lib/pindo/command/deploy/pem.rb +0 -55
  94. data/lib/pindo/command/deploy/pullconfig.rb +0 -56
  95. data/lib/pindo/command/deploy/pushconfig.rb +0 -93
  96. data/lib/pindo/command/deploy/quswark.rb +0 -156
  97. data/lib/pindo/command/deploy/quswauth.rb +0 -76
  98. data/lib/pindo/command/deploy/reportbug.rb +0 -145
  99. data/lib/pindo/command/deploy/resign.rb +0 -300
  100. data/lib/pindo/command/deploy/tag.rb +0 -108
  101. data/lib/pindo/command/deploy/uploadipa.rb +0 -73
  102. data/lib/pindo/command/deploy.rb +0 -42
  103. data/lib/pindo/command/dev/autobuild.rb +0 -117
  104. data/lib/pindo/command/dev/build.rb +0 -94
  105. data/lib/pindo/command/dev/debug.rb +0 -112
  106. data/lib/pindo/module/task/model/build/android_release_build_task.rb +0 -29
  107. data/lib/pindo/module/task/model/build/ios_adhoc_build_task.rb +0 -53
  108. data/lib/pindo/module/task/model/build/ios_release_build_task.rb +0 -53
  109. data/lib/pindo/options/appconfigoptions.rb +0 -24
  110. data/lib/pindo/options/deployoptions.rb +0 -372
@@ -364,12 +364,18 @@ module Pindo
364
364
  # 更新entitlements配置
365
365
  # 根据entitlements文件内容,同步更新config.json中的配置
366
366
  # 如果entitlements中没有icloud或app group,则从config.json中移除对应配置
367
+ # 使用 IosConfigParser 单例类获取和更新配置
367
368
  # @param project_dir [String] 项目目录路径
368
- # @param config_file [String] config.json文件路径
369
369
  # @return [Boolean] 是否成功更新
370
- def self.update_entitlements_config(project_dir: nil, config_file: nil)
370
+ def self.update_entitlements_config(project_dir: nil)
371
371
  raise ArgumentError, "项目目录不能为空" if project_dir.nil?
372
- raise ArgumentError, "配置文件路径不能为空" if config_file.nil?
372
+
373
+ # 使用 IosConfigParser 单例获取配置
374
+ config_parser = Pindo::IosConfigParser.instance
375
+ config_json = config_parser.config_json
376
+ config_file_path = config_parser.config_file_path
377
+
378
+ return false if config_json.nil? || config_file_path.nil?
373
379
 
374
380
  project_fullname = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
375
381
  return false if project_fullname.nil?
@@ -389,13 +395,6 @@ module Pindo
389
395
 
390
396
  # 处理entitlements配置
391
397
  if entitlements_plist_path && File.exist?(entitlements_plist_path)
392
- config_json = nil
393
- if File.exist?(config_file)
394
- config_json = JSON.parse(File.read(config_file))
395
- end
396
-
397
- return false if config_json.nil?
398
-
399
398
  entitlements_plist_dict = Xcodeproj::Plist.read_from_path(entitlements_plist_path)
400
399
 
401
400
  # 如果entitlements中没有icloud配置,从config.json中移除
@@ -413,7 +412,7 @@ module Pindo
413
412
  end
414
413
 
415
414
  # 保存更新后的config.json
416
- File.open(config_file, "w") do |f|
415
+ File.open(config_file_path, "w") do |f|
417
416
  f.write(JSON.pretty_generate(config_json))
418
417
  end
419
418
 
@@ -442,13 +441,15 @@ module Pindo
442
441
  puts "\n检测到项目 Icon URL: #{icon_url}"
443
442
 
444
443
  # 创建临时目录(所有 icon 处理都在此目录内完成)
445
- temp_icon_dir = File.join(project_dir, ".pindo_temp_icon")
444
+ temp_icon_dir = File.join(project_dir, ".pindo_temp_ios_icon")
446
445
  icon_download_path = nil
447
446
  replace_success = false
448
447
 
449
448
  begin
450
- FileUtils.mkdir_p(temp_icon_dir) unless File.exist?(temp_icon_dir)
451
- icon_download_path = File.join(temp_icon_dir, "downloaded_icon.png")
449
+ # 先清理旧的临时目录,确保干净的环境
450
+ FileUtils.rm_rf(temp_icon_dir) if File.exist?(temp_icon_dir)
451
+ FileUtils.mkdir_p(temp_icon_dir)
452
+ icon_download_path = File.join(temp_icon_dir, "ios_downloaded_icon.png")
452
453
 
453
454
  # 使用带重试机制的下载
454
455
  unless IconDownloader.download_icon_with_retry(icon_url: icon_url, save_path: icon_download_path, max_retries: 3)
@@ -456,8 +457,10 @@ module Pindo
456
457
  return false
457
458
  end
458
459
 
459
- # 生成新的 icon 目录(放在临时目录内部)
460
- new_icon_dir = File.join(temp_icon_dir, "generated_icons")
460
+ # 生成新的 icon 目录(放在临时目录内部),先清理确保干净环境
461
+ new_icon_dir = File.join(temp_icon_dir, "ios_generated_icons")
462
+ FileUtils.rm_rf(new_icon_dir) if File.exist?(new_icon_dir)
463
+ FileUtils.mkdir_p(new_icon_dir)
461
464
 
462
465
  # 创建各种尺寸的 icon
463
466
  Funlog.instance.fancyinfo_start("正在创建 icon...")
@@ -482,12 +485,144 @@ module Pindo
482
485
  replace_success = false
483
486
  ensure
484
487
  # 清理临时文件(无论成功失败都清理)
485
- # FileUtils.rm_rf(temp_icon_dir) if temp_icon_dir && File.exist?(temp_icon_dir)
488
+ FileUtils.rm_rf(temp_icon_dir) if temp_icon_dir && File.exist?(temp_icon_dir)
486
489
  end
487
490
 
488
491
  return replace_success
489
492
  end
490
493
 
494
+ # 配置 Xcode 项目(封装 configproj 的核心逻辑)
495
+ # 注意:调用此方法前必须先通过 IosConfigParser.instance.load_config 加载配置
496
+ # @param project_dir [String] 项目目录
497
+ # @return [Boolean] 是否成功
498
+ def self.configure_xcode_project(project_dir:)
499
+ require 'pindo/config/ios_config_parser'
500
+ require 'pindo/module/xcode/xcode_build_helper'
501
+ require 'pindo/module/xcode/xcode_res_helper'
502
+ require 'pindo/module/xcode/xcode_app_config'
503
+ require 'pindo/module/build/swark_helper'
504
+ require 'pindo/base/git_handler'
505
+
506
+ # 使用已加载的 IosConfigParser 单例
507
+ config_parser = Pindo::IosConfigParser.instance
508
+ config_json = config_parser.config_json
509
+ bundle_id = config_parser.bundle_id
510
+
511
+ # 验证配置已加载
512
+ if config_json.nil? || config_json.empty?
513
+ raise Informative, "配置未加载,请先调用 IosConfigParser.instance.load_config"
514
+ end
515
+
516
+ if bundle_id.nil? || bundle_id.empty?
517
+ raise Informative, "无法从配置中获取 Bundle ID"
518
+ end
519
+
520
+ # 获取项目名称
521
+ project_fullname = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by {|f| File.mtime(f)}
522
+ if project_fullname.nil? || !File.exist?(project_fullname)
523
+ raise Informative, "找不到 .xcodeproj 文件,请检查项目目录"
524
+ end
525
+ proj_name = File.basename(project_fullname, ".xcodeproj")
526
+
527
+ # 1. 安装 Google Plist
528
+ Funlog.instance.fancyinfo_start("正在替换 google-info.plist...")
529
+ google_info_config_dir = Pindo::GitHandler.clong_buildconfig_repo(repo_name: bundle_id)
530
+ Pindo::XcodeBuildHelper.install_google_plist(
531
+ project_dir: project_dir,
532
+ app_config_dir: google_info_config_dir
533
+ )
534
+ Funlog.instance.fancyinfo_success("替换 google-info.plist 完成!")
535
+
536
+ # 2. 创建和替换 Icon
537
+ app_config_dir = google_info_config_dir
538
+ icon_name = File.join(app_config_dir, "fastlane", "icon.png")
539
+ if File.exist?(icon_name)
540
+ time = Time.now.strftime('%m%d-%H%M%S')
541
+ new_icon_dir = File.join(project_dir, "icon_#{time}")
542
+
543
+ Funlog.instance.fancyinfo_start("正在创建 icon...")
544
+ Pindo::XcodeResHelper.create_icons(icon_name: icon_name, new_icon_dir: new_icon_dir)
545
+ Funlog.instance.fancyinfo_success("创建 icon 完成!")
546
+
547
+ Funlog.instance.fancyinfo_start("正在替换 icon...")
548
+ Pindo::XcodeResHelper.install_icon(proj_dir: project_dir, new_icon_dir: new_icon_dir)
549
+ Funlog.instance.fancyinfo_success("替换 icon 完成!")
550
+
551
+ begin
552
+ FileUtils.rm_rf(new_icon_dir)
553
+ rescue StandardError => err
554
+ # 忽略清理错误
555
+ end
556
+ else
557
+ Funlog.instance.fancyinfo_warning("未找到 icon 文件: #{icon_name}")
558
+ end
559
+
560
+ # 3. 替换启动页
561
+ Funlog.instance.fancyinfo_start("正在替换启动页...")
562
+ launchimg_pub_path = File.join(app_config_dir, "launch")
563
+ if Dir.exist?(launchimg_pub_path)
564
+ Pindo::XcodeResHelper.install_launchimg(
565
+ proj_dir: project_dir,
566
+ launchimg_pub_path: launchimg_pub_path
567
+ )
568
+ Funlog.instance.fancyinfo_success("启动页处理完成!")
569
+ else
570
+ Funlog.instance.fancyinfo_warning("未找到启动页目录: #{launchimg_pub_path}")
571
+ end
572
+
573
+ # 4. 添加项目模块
574
+ # 需要 include XcodeAppConfig 模块的方法,这里创建一个临时对象
575
+ config_helper = Object.new
576
+ config_helper.extend(Pindo::XcodeAppConfig)
577
+ config_helper.add_project_modue(
578
+ project_dir: project_dir,
579
+ proj_name: proj_name,
580
+ config_json: config_json
581
+ )
582
+
583
+ # 5. 修改 Info.plist
584
+ Funlog.instance.fancyinfo_start("正在修改工程配置...")
585
+ Pindo::XcodeBuildHelper.modify_info_plist(
586
+ project_dir: project_dir,
587
+ proj_name: proj_name,
588
+ config_json: config_json
589
+ )
590
+
591
+ # 6. 修改项目配置
592
+ Pindo::XcodeBuildHelper.modify_project_config(
593
+ project_dir: project_dir,
594
+ proj_name: proj_name,
595
+ config_json: config_json
596
+ )
597
+
598
+ # 7. 修改 AppPrefix.plist
599
+ appprefix_file = "AppPrefix.plist"
600
+ if config_json['project_info'] && config_json['project_info']['appprefix_plist']
601
+ appprefix_file = config_json['project_info']['appprefix_plist']
602
+ end
603
+ config_helper.modify_appprefix_plist(
604
+ project_dir: project_dir,
605
+ appprefix_file: appprefix_file,
606
+ config_json: config_json
607
+ )
608
+
609
+ Funlog.instance.fancyinfo_success("工程配置修改完成!")
610
+
611
+ # 8. 检查 Swark 授权
612
+ deploy_identifier = config_json['app_info']['app_identifier'] || bundle_id
613
+ Pindo::SwarkHelper.check_swark_authorize(
614
+ config_json: config_json,
615
+ buid_type: 'dev',
616
+ deploy_identifier: deploy_identifier
617
+ )
618
+
619
+ return true
620
+ rescue StandardError => e
621
+ Funlog.instance.fancyinfo_error("配置 Xcode 项目失败: #{e.message}")
622
+ puts e.backtrace
623
+ return false
624
+ end
625
+
491
626
  end
492
627
 
493
628
  end
@@ -1,7 +1,6 @@
1
1
  require 'fileutils'
2
2
  require 'xcodeproj'
3
3
  require 'json'
4
- require 'pindo/module/cert/xcodecerthelper'
5
4
 
6
5
  module Pindo
7
6
 
@@ -114,6 +113,25 @@ module Pindo
114
113
  end
115
114
  end
116
115
 
116
+ # 获取 Target 名称映射
117
+ def get_target_name_map
118
+ return {
119
+ "MainTarget" => "bundle_id",
120
+ "Content" => "bundle_id_pushcontent",
121
+ "Service" => "bundle_id_pushservice",
122
+ "Keyboard" => "bundle_id_keyboard",
123
+ "iMessage" => "bundle_id_imessage",
124
+ "Siri" => "bundle_id_siri",
125
+ "SiriUI" => "bundle_id_siriui",
126
+ "Widget" => "bundle_id_widget",
127
+ "Extension" => "bundle_id_extension",
128
+ "ExtensionAd" => "bundle_id_extensionad",
129
+ "ExtensionPorn" => "bundle_id_extensionporn",
130
+ "WatchApp" => "bundle_id_watchapp",
131
+ "WatchAppComplication" => "bundle_id_watchapp_extension"
132
+ }
133
+ end
134
+
117
135
  def modify_project_config(project_dir:nil, proj_name:nil, config_json:nil)
118
136
 
119
137
  proj_fullname = File.join(project_dir, proj_name) + ".xcodeproj"
@@ -419,6 +437,138 @@ module Pindo
419
437
  end
420
438
  end
421
439
 
440
+ # 构建 Xcode 工程的主入口方法
441
+ # @param project_dir [String] 工程目录
442
+ # @param icloud_id [String, nil] iCloud ID(可选)
443
+ # @return [String, nil] 生成的 IPA 文件路径,失败返回 nil
444
+ def build_project(project_dir:, icloud_id: nil)
445
+ project_fullname = Dir.glob(File.join(project_dir, "/*.xcodeproj")).max_by { |f| File.mtime(f) }
446
+
447
+ if project_fullname.nil?
448
+ puts "未找到 Xcode 工程文件"
449
+ return nil
450
+ end
451
+
452
+ # 修复 Xcode 16 链接器兼容性问题
453
+ fix_xcode16_linker_flags(project_dir: project_dir)
454
+
455
+ # 清理旧的 build 目录
456
+ build_dir = File.join(project_dir, "build")
457
+ FileUtils.rm_rf(build_dir) if File.exist?(build_dir)
458
+
459
+ # 获取构建参数
460
+ gym_options = get_gym_build_options(
461
+ project_fullname: project_fullname,
462
+ icloud_id: icloud_id
463
+ )
464
+
465
+ # 执行构建
466
+ require 'gym'
467
+ config = FastlaneCore::Configuration.create(Gym::Options.available_options, gym_options)
468
+ Gym::Manager.new.work(config)
469
+
470
+ # 查找生成的 IPA 文件
471
+ build_path = File.join(project_dir, "build", "*.ipa")
472
+ ipa_file = Dir.glob(build_path).max_by { |f| File.mtime(f) }
473
+
474
+ ipa_file
475
+ end
476
+
477
+ # 获取 Gym 构建参数
478
+ # @param project_fullname [String] 工程文件完整路径
479
+ # @param icloud_id [String, nil] iCloud ID(可选)
480
+ # @return [Hash] Gym 构建参数
481
+ def get_gym_build_options(project_fullname:, icloud_id: nil)
482
+ if project_fullname.nil?
483
+ raise "请指定要编译的工程"
484
+ end
485
+
486
+ project_path = File.dirname(project_fullname)
487
+ proj_name = File.basename(project_fullname, ".xcodeproj")
488
+ project_obj = Xcodeproj::Project.open(project_fullname)
489
+
490
+ project_build_platform = project_obj.root_object.build_configuration_list.get_setting("SDKROOT")["Release"]
491
+ main_target = project_obj.targets.select { |target| target.product_type.include?(Xcodeproj::Constants::PRODUCT_TYPE_UTI[:application]) }.first
492
+ provisioning_profile_name = main_target.build_configurations.first.build_settings['PROVISIONING_PROFILE_SPECIFIER'].downcase.split(" ")
493
+
494
+ # 确定构建类型和 iCloud 环境
495
+ build_type = "app-store"
496
+ icloud_env = "Production"
497
+
498
+ if !project_build_platform.nil? && project_build_platform.eql?("macosx")
499
+ # macOS 平台
500
+ if provisioning_profile_name.include?("development")
501
+ build_type = "development"
502
+ icloud_env = "Development"
503
+ elsif provisioning_profile_name.include?("appstore")
504
+ build_type = "mac-application"
505
+ icloud_env = "Production"
506
+ else
507
+ build_type = "developer-id"
508
+ icloud_env = "Production"
509
+ end
510
+ else
511
+ # iOS 平台
512
+ if provisioning_profile_name.include?("adhoc")
513
+ build_type = "ad-hoc"
514
+ icloud_env = "Development"
515
+ elsif provisioning_profile_name.include?("development")
516
+ build_type = "development"
517
+ icloud_env = "Development"
518
+ else
519
+ build_type = "app-store"
520
+ icloud_env = "Production"
521
+ end
522
+ end
523
+
524
+ # 检查 Unity 测试模板
525
+ if build_type.eql?("app-store") || build_type.eql?("ad-hoc")
526
+ if File.exist?(File.join(project_path, "Unity/Data/Raw/SettingsPluginFlag.txt"))
527
+ raise Informative, "Unity代码包含测试模板,请重新导出Unity代码"
528
+ end
529
+ end
530
+
531
+ # 获取应用名称
532
+ app_ipaname_temp = main_target.build_configurations.first.build_settings['INFOPLIST_KEY_CFBundleDisplayName'] || main_target.display_name
533
+ app_ipaname_temp = app_ipaname_temp.gsub(/ /, '')
534
+ app_ipaname_temp = app_ipaname_temp.gsub(/\'/, '')
535
+
536
+ # 构建基本参数
537
+ values = {
538
+ project: "#{proj_name}.xcodeproj",
539
+ scheme: "#{proj_name}",
540
+ configuration: "Release",
541
+ clean: true,
542
+ export_method: build_type,
543
+ output_directory: "./build/",
544
+ output_name: "#{app_ipaname_temp}.ipa"
545
+ }
546
+
547
+ # macOS 平台特殊处理
548
+ if !project_build_platform.nil? && project_build_platform.eql?("macosx")
549
+ values[:output_name] = nil
550
+ values[:destination] = "generic/platform=macosx"
551
+ end
552
+
553
+ # 如果使用 CocoaPods
554
+ if File.exist?(File.join(project_path, "Podfile"))
555
+ values[:workspace] = "#{proj_name}.xcworkspace"
556
+ values[:project] = nil
557
+ end
558
+
559
+ # 导出选项
560
+ values[:export_options] ||= {}
561
+ values[:export_options][:compileBitcode] = false
562
+ values[:export_options][:stripSwiftSymbols] = true
563
+ values[:export_options][:uploadSymbols] = false
564
+
565
+ if !icloud_id.nil?
566
+ values[:export_options][:iCloudContainerEnvironment] = icloud_env
567
+ end
568
+
569
+ values
570
+ end
571
+
422
572
  end
423
573
  end
424
574