Ios 如何使用fastlane为模拟器创建应用程序文件

Ios 如何使用fastlane为模拟器创建应用程序文件,ios,xcode,fastlane,Ios,Xcode,Fastlane,我需要用fastlane.app文件(或.ipa文件,如果可以的话)创建,然后将其拖放到另一台计算机上的模拟器上。我试着用gym或xcodebuild参数来做,但我不知道怎么做 现在我是这样做的: 在XCode中,我为模拟器构建应用程序 接下来,我在DerivedData(~/Library/Developer/XCode/DerivedData/Build/Products/Debug iphonesimulator/)中搜索应用程序文件 我把这个文件复制到别的地方 但是我需要用fastl

我需要用fastlane.app文件(或.ipa文件,如果可以的话)创建,然后将其拖放到另一台计算机上的模拟器上。我试着用gym或xcodebuild参数来做,但我不知道怎么做

现在我是这样做的:

  • 在XCode中,我为模拟器构建应用程序

  • 接下来,我在DerivedData(~/Library/Developer/XCode/DerivedData/Build/Products/Debug iphonesimulator/)中搜索应用程序文件

  • 我把这个文件复制到别的地方

但是我需要用fastlane来做。

正如您在中所发现的,您可以用gym来做,但是如果您使用
xcodebuild
(示例):

然后搜索
~/Library/Developer/Xcode/Archives/
(或者使用
-archivePath
指定的位置),其中将是xccarchive

  • 在finder中导航到.xArchive文件
  • 右键单击.xarchive文件并选择“显示软件包” 弹出菜单中的“目录”
  • 查找器将切换到显示.xc存档的内容 文件
  • 导航到产品/应用程序
  • 您的.app将位于产品/应用程序中

  • ,那会对你有帮助的


    更新: 如果需要从命令行获取应用程序文件,可以执行以下操作:

    mv /YourXCArchiveLocation/archive.xcarchive/Products/Applications/AppName.app /YourDesiredLocation/AppName.app
    

    这是我使用的车道:

    lane :generate_test_app do
        xcbuild(
            workspace: "MyApp.xcworkspace",
            scheme: "MyApp",
            configuration: "Debug",
            xcargs: "-sdk iphonesimulator SYMROOT='/var/tmp/'"
        )
    end
    
    Dir.mktmpdir do |dir|
      xcbuild(
        workspace: "#{project_name}.xcworkspace",
        scheme: "#{project_name}",
        configuration: "Debug",
        xcargs: "-sdk iphonesimulator SYMROOT=#{dir}"
      )
      app_path = sh("find #{dir} -name *.app -type d").strip()
      sh("mv #{app_path} #{options[:output_directory]}/#{app_identifier}.app")
    end
    
    它会将应用程序保留在
    /var/tmp/Debug iphonesimulator/MyApp.app


    另请参见:

    我已通过build\u应用程序实现了这一点:

    build_app(
            scheme: scheme,
            workspace: workspace,
            configuration: build_configuration,
            derived_data_path: output_path,
            skip_package_ipa: true,
            skip_archive: true,
            destination: "generic/platform=iOS Simulator"
        )
    

    如果你想使用gym,我想你可以基于此。棘手的部分是找到.app目录。以下是我使用的:

    lane :generate_test_app do
        xcbuild(
            workspace: "MyApp.xcworkspace",
            scheme: "MyApp",
            configuration: "Debug",
            xcargs: "-sdk iphonesimulator SYMROOT='/var/tmp/'"
        )
    end
    
    Dir.mktmpdir do |dir|
      xcbuild(
        workspace: "#{project_name}.xcworkspace",
        scheme: "#{project_name}",
        configuration: "Debug",
        xcargs: "-sdk iphonesimulator SYMROOT=#{dir}"
      )
      app_path = sh("find #{dir} -name *.app -type d").strip()
      sh("mv #{app_path} #{options[:output_directory]}/#{app_identifier}.app")
    end
    

    我们通过以下
    gym
    调用实现了这一点:

    archive\u path=gym(
    跳过包\u ipa:正确,
    目的地:“平台=iOS模拟器,名称=iPhone 6”,
    配置:“调试”,
    构建路径:“模拟器构建”
    )
    
    这将在目录“simulator_build/”中生成一个.xcshive,其中包含一个与模拟器兼容的.app文件

    archive\u path
    将是创建的.xarchive捆绑包的绝对路径

    name=
    需要匹配
    xcrun simctl list
    输出中显示的现有模拟器设备的名称。默认情况下,
    iphone6
    one是存在的,因此它应该是一个安全的选项

    在将此文件拖动到模拟器以安装它之前,您需要将其与Gatekeeper一起列入白名单:

    spctl --add ~/project/simulator_build/Products/Applications/YourApp.app
    
    如果您忘记了,在模拟器中单击应用程序时会出现“…无法打开,因为它来自身份不明的开发人员”错误

    如果您得到“…已损坏且无法打开。您应该将其移到垃圾箱中。”,则自.app进行代码签名以来,该应用程序发生了一些变化。使用

    codesign -vvv ~/project/simulator_build/Products/Applications/YourApp.app
    

    查看自代码签名以来添加、删除或更改了哪些文件。

    为什么需要它?你不能在另一台计算机上简单地构建应用程序吗?不。客户住在其他国家,我也不能给他源代码。我为他共享模拟器的应用程序文件,他在模拟器上测试,然后我将应用程序发送到应用程序商店。它工作得很好,但我需要自动化这个过程。为什么他要在模拟器上测试?对他来说,在真正的设备上测试不是更好吗?然后你可以使用TestFlight/Fabric/Bitrise/其他服务来实现这一点,因为他想要在模拟器上进行测试。是我的客户,所以是我的老板。也许他没有iPhone,也许这只是他的幻想。事实上这不关我的事有人回答这个问题,这样我就可以奖励赏金了!它类似于使用XCode构建应用程序。我想将建筑应用程序文件添加到fastlane脚本。我也试着去健身房,但我遇到了问题:。我不知道如何使用gym。@PiotrWasilewicz fastline使用Ruby,所以尝试实现
    exec
    system
    来运行xcodebuild。这并不容易(我不知道Ruby),但也许你是对的。。。使用-archivePath,我可以指定任何路径(在~/Library之外)?我添加了-archivePath,其中包含应该创建应用程序文件的路径,但它仍然在~/Library文件夹中生成。@PiotrWasilewicz您确定这样做是对的吗?明亮的我只想添加@tomasz wronka answer中的一部分,该通用设备可以指定为
    destination:“generic/platform=iOS Simulator”
    这对我来说是可行的,但它正在调用Metro服务器。有没有办法让它与离线捆绑一起使用?使用react native bundle命令无法解决此问题。非常感谢!帮助我解决了装载丢失资产的问题!