Preface

一款 app 从开发者手里到最终交付到用户桌面的整个过程中,编写代码只是其中小小的一环,我们需要搭建相应的开发环境、分发完整产物进行测试、并最终将其配以合适的宣传文案以供用户享用。本文将叙述作为一名一线 iOS 开发者与 App Store「打交道」的纪实经历。

Date Notes
2019.08.30 首次提交

分发渠道

App Icon

app 图标是用户触及 app 的第一扇门,而由于目前苹果设备分辨率众多,每个设备所需的尺寸都不大一致。另外 iOS/watchOS 会自动对 icon 进行圆角矩形化裁切,并根据某些动画进行拉伸,因此提供的 icon 不要进行手动裁切。

目前最新 Xcode(11.0)中一个项目所需 app icon 的全部尺寸如下表;单位为 pt,可根据 Image Size 相乘换算为所需的 px;划掉的尺寸意味着与其它已有所需尺寸重复,可无需再次提供。

  • iOS:

Position Image Size iPhone iPad iPad Pro (12.9)
Notification 1x - 20 * 20 -
Notification 2x 20 * 20 20 * 20 -
Notification 3x 20 * 20 - -
Settings 1x - 29 * 29 -
Settings 2x 29 * 29 29 * 29 -
Settings 3x 29 * 29 - -
Spotlight 1x - 40 * 40 -
Spotlight 2x 40 * 40 40 * 40 -
Spotlight 3x 40 * 40 - -
App 1x - 76 * 76 -
App 2x 60 * 60 76 * 76 83.5 * 83.5
App 3x 60 * 60 - -
App Store 1x 1024 * 1024 - -
  • watchOS:

Position Image Size Apple Watch
38mm
Apple Watch
40mm/42mm
Apple Watch
44mm
Notification Center 1x - - -
Notification Center 2x 24 * 24 27.5 * 27.5 29 * 29
Notification Center 3x - - 29 * 29
Home Screen 1x - - -
Home Screen 2x 40 * 40 44 * 44 50 * 50
Home Screen 3x - - -
Short Look 1x - - -
Short Look 2x 86 * 86 98 * 98 108 * 108
Short Look 3x - - -
App Store 1x 1024 * 1024 - -

开发

企业

TestFlight

App Store

分析

function active_count_lower_than(target_version) {
  // Format target version
  target_version = target_version
    .split(".")
    .map(e => {
      if (e.length < 2) {
        return "0" + e;
      } else {
        return e;
      }
    })
    .join(".");
  console.log("Formatted Target Version is ", target_version);

  tr_elements = [].filter.call(
    document.getElementsByTagName("tr"),
    el => el.className == "ng-scope"
  );
  versions = [].map.call(tr_elements, el =>
    el
      .getElementsByClassName("title ng-binding")[0]
      .innerHTML.replace(" (iOS)", "")
  );
  counts = [].map.call(tr_elements, el =>
    Number(
      el
        .getElementsByClassName("ng-scope ng-binding")[0]
        .innerHTML.replace(",", "")
    )
  );

  var sum = 0;

  versions.forEach(function(value, index, array) {
    version = value
      .split(".")
      .map(e => {
        if (e.length < 2) {
          return "0" + e;
        } else {
          return e;
        }
      })
      .join(".");

    if (version < target_version) {
      sum += counts[index];
      console.log("Calculating version: ", version);
    } else {
      console.log("Skipping version: ", version);
    }
  });

  return sum;
}

证书

开发证书

分发证书

推送证书

提审

元数据被拒绝

二进制被拒绝

下架

限制销售地区

转让

Reference