Capacitor IOS

開發流程

推播設置

TestFlight設置

只能將版本 X.X.X 的其中一個建置版本提交 Beta 版 App 審查。待提交的建置版本通過核准後,即可提交其他建置版本。

  • 在Test Flight可查看安裝本App的人員、裝置型號、OS版本(TestFlight>測試人員>全部)

Sign In with Apple

只要你的 App 中有包含任一第三方登入就必須支援 Sign in with Apple,要不然就無法通過審核上架。要啟用Sign In with Apple需要具備一個Apple開發人員帳號

IOS App簽名機制

自訂Capacitor Plugin

自訂Ios Capacitor套件只需要透過Xcode新增2隻檔案即可完成,往後不用再新增,可把相關功能都直接集中在此套件暴露給JS端即可

原生程式相關說明

使用者裝置網路狀態偵測

import Network // Create a Network Monitor. let monitor = NWPathMonitor() // Define a Handler for Network Changes. monitor.pathUpdateHandler = { path in if path.status == .satisfied { print("Internet connection is available.") // Perform actions when internet is available } else { print("Internet connection is not available.") // Perform actions when internet is not available } } //Start the Network Monitor. let queue = DispatchQueue(label: "NetworkMonitor") monitor.start(queue: queue)

啟用可Inspect模式

let webConfiguration = WKWebViewConfiguration() let webView = WKWebView(frame: .zero, configuration: webConfiguration) webView.isInspectable = true

離線顯示頁面設定

// AppDelegate.swift import UIKit import ReachabilitySwift @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var reachability: Reachability! func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Initialize Reachability self.reachability = Reachability() // Register for network reachability changes NotificationCenter.default.addObserver(self, selector: #selector(networkChanged(_:)), name: .reachabilityChanged, object: nil) // Start monitoring network reachability do { try self.reachability.startNotifier() } catch { print("Unable to start notifier") } // Check initial network status if reachability.connection == .none { // If there's no network, load the offline HTML file showOfflineHTML() } return true } @objc func networkChanged(_ notification: Notification) { guard let reachability = notification.object as? Reachability else { return } if reachability.connection == .none { // If network becomes unavailable, show the offline HTML file showOfflineHTML() } else { // If network becomes available, dismiss the offline HTML file if it's presented dismissOfflineHTML() } } func showOfflineHTML() { guard let offlineURL = Bundle.main.url(forResource: "offline", withExtension: "html") else { return } let offlineViewController = UIViewController() let webView = UIWebView(frame: UIScreen.main.bounds) webView.loadRequest(URLRequest(url: offlineURL)) offlineViewController.view = webView // Present the offline HTML file on the window's root view controller self.window?.rootViewController?.present(offlineViewController, animated: true, completion: nil) } func dismissOfflineHTML() { if let presentedViewController = self.window?.rootViewController?.presentedViewController { presentedViewController.dismiss(animated: true, completion: nil) } } }

啟用JavaScript Interface的設定

Xcode開發設定

常見問題

  • App名稱若要加上空白可將Yaml檔中的app名稱中的空白替換成\u2007。

上架流程

  • App名稱有空白的處理
    • App名稱若要加上空白可將Yaml檔中的app名稱中的空白替換成\u2007
  • 檢查app所需要的原生套件都有在set-config.yaml裡的設定引入
  • 設定隱私權政策
  • 設定支援連結(線上工具產生內容點我)
  • 準備對應圖檔素材/App文案(iphone模擬器截圖方式教學)
    • iOS 預覽和截圖
      • 可只上傳6.7吋(6.5吋裝置將共用此設定)、5.5吋顯示器的截圖
      • 6.5吋:iPhone 15 Pro Max、5.5吋:iPhone 8 Plus
    • 銷宣傳文字(Promotional Text):讓你不需提交更新要求,即可通知 App Store 訪客目前最新的 App 功能
      • iOS 11(或以上版本)及 macOS 10.13(或以上版本)的客戶,此文字將會顯示在 App Store 中「描述」的上方。
    • 描述(Description):詳細介紹 App 的特色和功能
      • 不支援 HTML 格式
    • 關鍵字:讓 App Store 搜尋結果更加準確。可使用英文逗號、中文逗號或兩者混用來分隔不同的關鍵字
  • 打包、驗證app(validate app)、上傳app(distribute app)
  • TestFlight 測試(須審核,時間約1~2天)
    • 內部測試:需要經由開發者帳號的負責人發送邀請,只有取得邀請函的人可測試App,並且須擁有AppleID才能進入TestFlight做操作測試
    • 外部測試:簡單透過外部群組取得分享link,那被發連結邀請的人就能從TestFlight下載App來測試並查看
  • 一般資訊>App審查資訊填寫
    • 手機: 格式須為+886開頭(ex: +886900180111)
  • 上架前隱私權政策確認
  • 使用Xcode上傳(distribute)的App如果最後在TestFlight中消失,代表App有問題,請去信箱收信,並依照要求調整
  • App在Distribute時建置版本會由apple線上系統自行遞增,所以即便在set-config.yaml裡將buildNumber設定成相同建制版本號是會在distribute後被apple忽略的

常見問題

上架審核問題

上架提醒

年齡分級

回覆App審核團隊英文範本:

Dear App Review Team,

Thank you for bringing the concern related to Guideline 2.1 and Guideline 4.1 to our attention. We appreciate your diligence in ensuring the integrity of the App Store.

Guideline 2.1 1.What is the function of the jackpot seen in your app? The function of the jackpot is decorative, intended to enhance the visual richness of the app interface.

2.Can users win any prize money in the app? No, users cannot win any prize money in the app.

Guideline 4.1 Our app primarily serves as a convenient channel for Japanese users to access sport information.

Thank you once again for your feedback. We are willing to provide any additional information required for your review to facilitate a smooth approval process.

Sincerely, SHAO YU LAN

審查流程

  • 準備提交
  • 準備審查
  • 正在等待審查
  • 審查中
  • 已拒絕、等待開發者發佈、被開發者拒絕
  • 正在為 App Store 處理
    • 開發者手動發佈後須等待App Store處理的時間(時間很快)
  • 已可發布
    • App Store處理中,此時更新尚未反映到App Store(時間很快)
  • 銷售準備就緒
    • 已上架App Store
    • 已上架後仍可修改且不用送審的項目如下:
      • 行銷宣傳文字
      • 版權顯示文字
      • 路線規劃 App 地區範圍檔案
      • App 審查資訊區塊(登入資訊、聯絡人資訊、備註、附件)
      • App 資訊>內容版權選項
      • App 資訊>許可協議選項
      • 定價與供應狀況頁面

App商店網址格式為:https://apps.apple.com/{地區代號}/app/{app名稱}/id{AppleID}

  • app名稱:App Store Connect > App資訊 > 名稱
  • 地區代號:台灣為tw、日本為jp
  • AppleID:App Store Connect > 一般資訊 > Apple ID

Store 商店

App Store多語系設定:如果你在 App Store Connect 中選取英文作為 App 的主要語言,且英文是你唯一提供的語言版本,那麼在所有 App Store 國家或地區,App 後設資料都會以英文呈現。如果你提供了法文版的 App 後設資料,將語言設定為法文的使用者,就會看到法文的本地化內容

  • 行銷宣傳文字:
    • 行銷宣傳文字對應顯示位置
    • 如果商店沒有設定使用者對應語系的行銷宣傳文字,則本內容不會顯示給使用者
    • 會顯示在 App Store 中「描述」的上方
    • 非必填項目
  • 描述:詳細介紹 App 的特色和功能。
    • 會固定顯示,無論使用者當前的語系
    • 會顯示在App Store 詳細介紹頁面(行銷宣傳文字下方)
    • 必填項目
  • 在App Store Connect>定價與供應狀況>採用 Apple 晶片 Mac 上的 iPhone 與 iPad App中是否勾選「供應此 App」的差異
    • 有勾選
      • 商店將顯示顯示「請開啟 Mac App Store 以購買和下載 App。」
      • 且將額外顯示「專為 iPad 設計」或「專為 iPhone 設計」
        202402071
    • 無勾選
      • 商店將顯示顯示「此 App 只能透過 iPhone 及 iPad 的 App Store 取得。」
        202402072
  • 版本紀錄
    • App版本紀錄>1時才會在app store顯示版本紀錄連結

其他備註

資源

名詞

  • App Developer Program
  • APNs(Apple Push Notification service)
    • APN 驗證金鑰、 APN 憑證差異
  • App store connect: Apple提供給開發者用來管理app資訊、提交app審核、查看app資料等統一的平台
  • .cer凭证档: 告诉Apple 说这台电脑是开发者在使用的。(需手動新增)
  • SKU(Stock Keeping Unit)
  • Provisioning Profile: 告诉Apple 说,即将要被上传的App 资讯,包含凭证档(.cer) 和App ID 等 (如果是使用Xcode自動簽署,則本profile會自動產生)
  • CSR檔(certSigningRequest): 用以到Apple Developer後台產生.cert檔
  • 個人開發者帳號、公司開發者帳號、企業開發者帳號差異
    • 個人開發者帳號是無法將開發權分配出去的,因此只能使用自己的帳號開發。(app store connect中加入的團隊成員只具有app管理權限,無法參與開發)
    • 公司開發者帳號可以讓加入的團隊成員具有開發app的能力。(申請約需1周,且須先申請好邓白氏码)
  • 輕巧APP
  • iMessage App
  • validate app:上傳前驗證app
  • 嵌入式瀏覽器
  • App 專用共享密鑰
    • App 專用共享密鑰為一組獨有的代碼,用於接收此 App 自動續訂型訂閱的收據。若要將 App 轉讓給其他開發者,或者不想公開主共享密鑰,建議使用 App 專用共享密鑰。
  • 軟體版本管理慣例
  • automatic signing
    • If you use automatic signing (recommended), Xcode creates signing certificates and provisioning profiles for you
    • since signing certificate private keys are stored in your keychain, you should back up the developer account
    • Downloading your provisioning profiles in Xcode won’t repair a missing private key. Instead, import your developer accounts from a backu
  • Apple Push Notifications service Key (APNs):Establish connectivity between your notification server and the Apple Push Notification service. One key is used for all of your apps
  • 沙箱測試帳號
  • 帳單寬限期
  • 自訂產品頁面
  • App 內活動
  • 產品頁面最佳化
  • 重置 iOS 平均評分
  • 促銷代碼
  • MapKit JS
  • WeatherKit
  • Device reset date
  • Code-level support
    • Included with your membership are two Technical Support Incidents (TSIs), which can be used during your membership year to request code-level support for Apple frameworks, APIs, and tools from an Apple Developer Technical Support Engineer. You’ll receive two new TSIs when you renew your membership. Additional TSIs are available for purchase at any time.
  • Apple Push Notifications Console
  • Ad Hoc
  • 鄧白氏環球編碼
    • 申請時間約需1-2個星期
  • Sign with Apple
    • 苹果登录按钮必须按照开发者官网上的两种设计方式做,既不能改变外观,也不能改变大小。
  • IOS第三方應用程式(側載)
  • 階段性發佈 App Store 自動更新
  • CloudKit Database
  • Xcode Cloud
  • Bundle Name vs Bundle Display Name
    • Bundle Name:會出現在像詢問權限的提示視窗
    • Bundle Display Name:顯示在桌面上App的名稱
  • Apple 中介 Email
  • Sign In with Apple的Client Id
  • Entitlement:是由Xcode生成的檔案(例如開啟App的某個Capability時,Xcode會自動新增一個.entitlements檔案)。用來授權App能夠執行特定功能或是安全方面的權限
  • SPM(Swift Package Manager):新推出官方的IOS開發套件管理工具,用來取代cocoapods

待處理

參考