【问题标题】:How to distribute IOS App without App store (OTA)?如何在没有 App Store (OTA) 的情况下分发 IOS App?
【发布时间】:2021-09-17 04:36:53
【问题描述】:

我们希望在一些第三方商店或一些OTA(无线)平台上发布我们的IOS APP。

主要原因是该应用程序仅适用于特定人群。我已经阅读了官方 Apple Enterprise 帐户的执行方式,但我认为我们公司没有资格获得该帐户。

我在下面遇到了这些选项,它们允许我们上传我们的 APK(适用于 android)和 IPA(适用于 IO)文件并生成一个链接供用户下载应用程序:

  1. https://www.installonair.com/
  2. https://www.diawi.com/

是否有人一直在使用这些平台中的任何一个来发布他们的应用程序?如果是,这在最新的 IOS 14 中仍然有效吗?

提前致谢

【问题讨论】:

  • 如果该应用程序仅适用于您公司的用户,那么您可以将其作为自定义应用程序分发;您在 App Store 连接中的“分发”下选择此选项。您的公司需要注册 Apple 商务管理(免费)。然后,您可以将该应用程序提供给您公司的 Apple 商务管理 ID 并“购买”兑换代码以提供给您的用户或通过您的 MDM 分发。这种方法的优点是应用仍在审核中,由 Apple 签名,您无需知道 uuid,并且永不过期。
  • @Paulw11 这似乎是比使用某些 OTA 平台更好的官方方法。在他看来,我们没有 DUNS 号码,这是注册“Apple 业务经理”帐户所必需的。我想我们会先得到它。这种方法只有一个问题,我们是否必须手动添加每个设备的 UDID?
  • 是的,您需要一个 DUNS 号码。不,您不需要设备 UDID;您的应用将像任何其他 App Store 构建一样由 Apple 签名,只是在 App Store 中不可见

标签: ios app-store ipa ad-hoc-distribution


【解决方案1】:

diawi 和 installonair 都使用开发、临时和内部构建。 Developmentad-hoc 意味着您必须预先添加将要安装应用程序的设备的 UUID(同时允许的注册设备总数也有一个小限制)。这些用于将您的应用分发给测试人员。 内部是来自企业帐户的应用程序。这是为了当您打算将您的应用程序分发给公司内部的用户时。如果这是您的意图,那么您的公司就有资格。

Apple 不会为您提供绕过官方应用商店进行应用分发的方法。

【讨论】:

  • 感谢您的回复!我的印象是使用 diawi/installonair 我们不必手动添加 UDID?
  • 不幸的是,diawi/installonair 都只分发 3 种类型的构建,如果配置文件包含设备的 UUID,其中 2 个构建(临时、开发)将仅在设备中运行。第三种选择是,如果您有企业帐户,那么您可以拥有 Apple 允许您在公司员工的设备上运行的内部构建,并且因为它可以在使用 diawi/installonair 的设备分发上运行,所以可以工作。
【解决方案2】:

请注意,如果您想使用 OTA 分发,则不必使用您提到的 diawi 或 installonair 等服务。这些服务可以工作,但是它们有一些限制。例如,如果您在 diawi 上使用免费帐户,那么您的应用只能下载 3 天,并且大小不能超过 75MB。因此,如果您计划在没有大小限制和其他限制的情况下长时间下载您的应用程序,那么最好将其托管在任何 https 服务器上。您甚至可以在没有这些限制的情况下将它托管在免费的 gitlab.com 帐户(带有 gitlab 页面)上。您只需要创建一个适当的 html 文件和 manifest.plist 并将它们与 ipa 文件一起放在您的服务器上。如果您打算采用这种方式,我建议您遵循简单而美观的 html,它允许您根据用户在打开 html 页面时需要输入的密钥下载不同的应用程序版本:

<!DOCTYPE html>
<html>
<head>
  <meta content="width=device-width" name="viewport" />
  <title>DOWNLOAD</title>
  <style>
    body {
      text-align:center;
      font-family: Arial, Helvetica, sans-serif;
      background-color: slategrey;
      font-size: 18px;
      font-weight: bold;
      color: white;
    }
    a {
      border: 10px solid;
      color: white;
      text-align: center;
      text-decoration: none;
      display: inline-block;
      border-radius: 28px;
      width: 180px;
      height: 180px;
    }
    .container {
      position: fixed;
      top: 40%;
      left: 50%;
      margin-top: -90px;
      margin-left: -90px;
    }
    .box {
      color: white;
      text-align: center;
      text-decoration: none;
      display: inline-block;
      width: 180px;
      height: 180px;
    }
    .download-icon {
      box-sizing: border-box;
      position: relative;
      display: inline-block;
      width: 80px;
      height: 30px;
      border: 10px solid;
      border-top: 0;
      border-bottom-left-radius: 10px;
      border-bottom-right-radius: 10px;
      margin-top: 78px;
      margin-bottom: 18px;
      color: white;
    }
    .download-icon::after {
      content: "";
      display: inline-block;
      box-sizing: border-box;
      position: absolute;
      width: 40px;
      height: 40px;
      border-left: 10px solid;
      border-bottom: 10px solid;
      transform: rotate(-45deg);
      left: 10px;
      bottom: 20px;
    }
    .download-icon::before {
      content: "";
      display: inline-block;
      box-sizing: border-box;
      position: absolute;
      border-radius: 15px;
      width: 10px;
      height: 50px;
      background: white;
      left: 25px;
      bottom: 25px;
    }
    .block-icon {
      box-sizing: border-box;
      position: relative;
      display: inline-block;
      width: 80px;
      height: 80px;
      border: 10px solid;
      border-radius: 100%;
      margin-top: 58px;
      margin-bottom: 18px;
    }
    .block-icon::before {
      content: "";
      display: inline-block;
      box-sizing: border-box;
      position: absolute;
      width: 50px;
      height: 10px;
      background: white;
      border-radius: 25px;
      transform: rotate(45deg);
      top: 25px;
      left: 5px
    }
  </style>
</head>
<body>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/rollups/sha1.js"></script>
  <script>
    function existsFile(url) {
      var http = new XMLHttpRequest();
      http.open('GET', url, false);
      http.send();
      return http.status == 200;
    }
    var key = prompt("Key:", "");
    var hash = String(CryptoJS.SHA1(key));
    var url = "https://yourserveraddress.com/apps/" + hash + "/manifest.plist";
    if (existsFile(url))
      document.write("<div class='container'><a href=itms-services://?action=download-manifest&url=", url, "><div class='download-icon'></div></br>DOWNLOAD</a></div>");
    else
      document.write("<div class='container'><div class='box'><div class='block-icon'></div></br>ERROR</div></div>");
  </script>
</body>
</html>

要使其正常工作,您只需将 ipa 文件和清单文件放在服务器上的适当文件夹(命名为密钥的 sha1 哈希)中,并根据需要编辑上述 html 和清单中的 url。

【讨论】:

  • 嗨,这有效吗??
猜你喜欢
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
相关资源
最近更新 更多