Ios 如何更新UWP appxupload软件包,而无需重建以适应多个环境

Ios 如何更新UWP appxupload软件包,而无需重建以适应多个环境,ios,xamarin.forms,uwp,devops,Ios,Xamarin.forms,Uwp,Devops,我们正在构建一个针对iOS和UWP的Xamarin.Forms应用程序。我们有一个要求,即该应用程序应作为单独的安装程序提供,以用于暂存和生产。基本上,每个环境都有自己的设置(服务器URL、应用程序配置等),这些设置存储在外部Configuration.json文件中。要点是,为了为每个环境动态选择正确的Configuration.json文件,不应重新构建应用程序。我们应该只构建一次应用程序,并且只更改配置。我们能够为iOS解决这个问题 为了支持iOS的动态配置,我们做了以下工作 在项目中存储

我们正在构建一个针对iOS和UWP的Xamarin.Forms应用程序。我们有一个要求,即该应用程序应作为单独的安装程序提供,以用于暂存和生产。基本上,每个环境都有自己的设置(服务器URL、应用程序配置等),这些设置存储在外部
Configuration.json
文件中。要点是,为了为每个环境动态选择正确的
Configuration.json
文件,不应重新构建应用程序。我们应该只构建一次应用程序,并且只更改配置。我们能够为iOS解决这个问题

为了支持iOS的动态配置,我们做了以下工作

  • 在项目中存储所有环境配置文件,如
    StagingConfiguration.json
    ProductionConfiguration.json
  • 在iTunes connect中为每个环境注册单独的应用程序,并使用其自己的捆绑包ID-例如,对于过渡,
    com.mycompany.app.staging
    ,对于生产,
    com.mycompany.app
  • 构建应用程序并生成
    ipa
    文件后,我们使用
    fastlane
    使用新的bundle id和配置文件退出应用程序,如下所示(我们使用Azure DevOps CI/CD管道进行构建和发布,此步骤是在发布管道中执行命令行,并引用环境变量来完成其工作)
  • 然后简单地将提交的管道上传到AppStore
  • 在应用程序中,我们检测应用程序的bundle ID,并根据该ID选择正确的配置文件
  • 因此,我们也在尝试为UWP找到类似的解决方案。UWP应用程序的输出包是这样的包
    QQPad.Mobile.UWP_0.39.0.0_x86_x64_arm_bundle.appxupload
    。我们可能需要执行以下操作之一来支持我们的场景

    • 执行与在iOS中相同的操作-在应用商店中创建单独的UWP应用程序,在项目中存储多个配置文件,在
      appxupload
      项目准备就绪后更改应用程序的包名,并在代码端检测包ID并选择正确的配置文件
    • 或者,如果可能的话,更好的解决方案是
    • 不要创建单独的应用程序,因为管理起来很麻烦,而是在同一个应用程序宿主中创建单独的包航班
    • 不要更改包名,而是能够在
      appxupload
      中找到配置文件,并将其替换为我们选择的配置文件
    • 重新打包应用程序并放弃它
    • 将其上载到正确的包裹航班

    同样,主要的一点是能够在不重建应用程序的情况下动态选择或更改配置。是否有任何UWP实用程序等同于iOS的fastlane,也允许对应用程序包进行操作?或者我必须手动执行此操作?如果是,具体操作方法是什么?

    我已经设法解决了此问题经历了很多考验和失败

    我已经发布了进行必要转换的脚本

    以下是总结基本策略的步骤

  • 脚本接受环境、
    appxupload
    path、签名证书和密码
  • 我们要做的第一件事是提取
    appxupload
    archive。为此,我们需要使用
    *.zip
    扩展名复制
    appxupload
    文件,以便它成为
    扩展存档
    powershell实用程序的有效输入
  • 在提取的归档文件中,我们有
    appxbundle
    。对于这一个和
    appx
    包,还有一个很好的打包/解包实用程序。首先,我们使用这个工具解包
    appxbundle
  • 在解包文件夹中,我们将找到不同体系结构和规模的
    appx
    包文件。我们必须解包其中的每一个文件,并对
    AppxManifest.xml
    文件进行必要的更改
  • AppxManifest.xml
    文件作为
    xml
    对象打开,我们找到
    PackageName
    属性,并将其替换为类似于登台环境的
    CURRENT\u PACKAGE\u NAME-STAGING
  • 之后,我们必须通过更换旧包重新包装并签署每个
    appx
  • 然后,在所有
    appx
    包重新打包后,我们可以使用
    MakeAppx
    实用程序打包
    appxbundle
    。我们还必须对这一个进行签名
  • 然后,我们需要使用powershell实用程序
    Compress archive
    重新创建
    appxupload
    存档。这种类型的捆绑包不需要签名
  • 是啊,我们准备将
    appxupload
    推送到UWP商店
  • 上面的步骤很复杂,为了读取包名并提取UWP运行时内的环境名,我必须编写几行代码

    var name = Windows.ApplicationModel.Package.Current.DisplayName;
    string[] parts = name.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries);
    if (parts.Length == 1) return "Production";
    
    string environmentName = parts.Last().Trim().ToLower();
    
    我假设如果环境说明符不在“-”后面,那么它就是产品

    其余的配置已经由您决定。我个人使用了
    Microsoft.Extensions.configuration
    appsettings.json
    文件作为
    EmbeddedResources

    var configs = new ConfigurationBuilder();
    var fileProvider = new EmbeddedFileProvider(typeof(Bootstrapper).Assembly, typeof(Startup).Namespace);
    configs.AddJsonFile(fileProvider, "appsettings.json", false, false)
            .AddJsonFile(fileProvider, $"appsettings.{environmentName.ToLower()}.json", true, false);
    
    更新

    不幸的是,我不得不放弃这个想法……为什么我认为它在第一时间起作用,是因为我只执行了脚本并将其上传到临时飞行。之后,我们的CI管道,在QA完成测试后,尝试将原始未修改的
    appxupload
    文件上传到生产Alpha测试飞行,这就是原因出现了问题,我收到了像这样的错误

    InvalidParameterValue: Appxbundles (including previously published and currently uploaded) must be uniquely identified by their full names. You have provided two packages with the full name ****_0.55.3.0_X86_ which have different contents. Please remove one of these packages, or increment current package versions to continue.
    
    门户似乎不能接受相同的包,具有相同的标识名和版本号

    我想我还可以更新appx文件名并将STAGING附加到
    InvalidParameterValue: Appxbundles (including previously published and currently uploaded) must be uniquely identified by their full names. You have provided two packages with the full name ****_0.55.3.0_X86_ which have different contents. Please remove one of these packages, or increment current package versions to continue.