PWA からネイティブへの変換
PWA ラッピングのワークフローと API ドキュメント
ワークフローの概要
ラッピングプロセスは非同期であり、以下のステップに従います。
- POST
/wrap– ラッピングプロセスを開始します(ドラフト ID とともに即座に返されます) - GET
/draft/{draft_id}– 完了または失敗まで、ステータスの更新をポーリングします - ビルドをダウンロードする – 完了したら、
download_urlから.zipファイルをダウンロードします
エンドポイント
1. ラッピングプロセスの開始
POST /wrapper/wrap
PWA ラッピングプロセスを開始します。 進捗を追跡するためのドラフト ID とともに即座に返されます。
リクエストボディ
{
"url": "https://example.com",
"bundle_id": "com.example.app",
"team_id": "A1B2C3D4E5",
"auth_redirects": {
"accounts.google.com": "https://example.com/auth/google/callback"
}
}
リクエストパラメータ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
| url | string (URL) | ✅ はい | ラップする PWA URL |
| bundle_id | string | ✅ はい | iOS バンドル識別子(com.company.app) |
| team_id | string | ❌ いいえ | Apple Developer チーム ID — ネイティブ認証の場合のみ |
| auth_redirects | object | ❌ いいえ | 認証リダイレクトパス — ネイティブ認証の場合のみ |
ネイティブ認証と WebView 認証
✅ 次の場合に team_id と auth_redirects を指定します。
- Universal Links を使用して認証をネイティブに処理したい場合
- デバイスに保存されたログイン(Google、Facebook など)を有効にします
- より信頼性が高い — 認証に Safari/ネイティブブラウザを使用します
⚠️ 次の場合に team_id と auth_redirects を省略します。
- WebView 内で認証したい場合
- 信頼性が低い(一部のプロバイダは WebView 認証をブロックします)
- UX が悪い(ソーシャルプロバイダの保存されたログインがありません)
レスポンスの例(201 Created)
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"pwa_url": "https://example.com",
"status": "created",
"manifest_url": null,
"project_zip_filename": null,
"build_zip_filename": null,
"download_url": null,
"error_message": null,
"created_at": "2025-11-10T12:00:00Z",
"updated_at": "2025-11-10T12:00:00Z"
}
2. ドラフトステータスの取得
GET /wrapper/draft/{draft_id}
ラッピングの進捗を追跡するには、このエンドポイントをポーリングします。
パスパラメータ
| パラメータ | 型 | 説明 |
|---|---|---|
| draft_id | string (UUID) | POST /wrap からのドラフト ID |
レスポンスの例(200 OK)
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"pwa_url": "https://example.com",
"status": "completed",
"manifest_url": "https://example.com/manifest.json",
"project_zip_filename": "550e8400-e29b-41d4-a716-446655440000.zip",
"build_zip_filename": "550e8400-e29b-41d4-a716-446655440000.zip",
"download_url": "https://pwa-ios.aptoide.com/pwa-ios/8.20251013/storage/file/550e8400-e29b-41d4-a716-446655440000.zip",
"error_message": null,
"created_at": "2025-11-10T12:00:00Z",
"updated_at": "2025-11-10T12:05:00Z"
}
ステータスフロー
| ステータス | 説明 |
|---|---|
created | ドラフトが作成され、ラッピングプロセスが開始しています |
fetching_manifest | PWA マニフェストを取得して検証しています |
generating_project | Xcode プロジェクトファイルを生成しています |
building | iOS アプリケーションをビルドしています |
completed | ✅ ビルドが完了しました — download_url が利用可能です |
failed | ❌ プロセスが失敗しました — error_message を参照してください |
レスポンスフィールド
| フィールド | 型 | 説明 |
|---|---|---|
| id | string | 一意のドラフト識別子 |
| pwa_url | string | 元の PWA URL |
| status | string | 現在のステータス |
| manifest_url | string? | 取得したマニフェストの URL |
| project_zip_filename | string? | 生成された Xcode プロジェクトのファイル名 |
| build_zip_filename | string? | 最終ビルドのファイル名 |
| download_url | string? | ダウンロード URL(完了時のみ) |
| error_message | string? | エラーの詳細(失敗した場合のみ) |
| created_at | datetime | ドラフト作成のタイムスタンプ |
| updated_at | datetime | 最終更新のタイムスタンプ |
ダウンロード内容
ステータスが completed の場合、.zip には以下が含まれます。
常に含まれるもの
-
署名なしの
.app(シミュレータ) テスト用に iOS シミュレータで直接実行します。 -
署名なしの
.ipa配信前に手動での署名が必要です。 -
Xcode プロジェクトフォルダー これを使用してアプリケーションを手動で署名し、公開します。
ネイティブ認証(team_id を指定)の場合のみ含まれるもの
-
OAUTH_SETUP.mdネイティブ認証と Universal Links を設定するための手順。 -
apple-app-site-association次の場所に配置するための事前構成済みファイル:{base_url}/.well-known/apple-app-site-association
⚠️ ネイティブ認証が構成されて いない 場合は含まれません。
ポーリングの推奨事項
| パラメータ | 推奨値 |
|---|---|
| ポーリング間隔 | 5~10 秒 |
| タイムアウト | 20~25 分 |
| 一般的なビルド時間 | 3~8 分 |
ダウンロード後の次のステップ
✅ ネイティブ認証あり(team_id + auth_redirects)
.zipを展開します- シミュレータでテストします
OAUTH_SETUP.mdを読みますapple-app-site-associationをウェブサイトに配置します- Xcode プロジェクトを開いてコード署名を構成します
- Xcode でビルドおよびアーカイブします
- App Store に提出します
⚠️ ネイティブ認証なし(WebView 認証)
.zipを展開します- シミュレータでテストします
- Xcode プロジェクトを開いてコード署名を構成します
- Xcode でビルドおよびアーカイブします
- App Store に提出します
重要な注意事項
✅ 重要なポイント
- ラッピングはバックグラウンドで非同期に実行されます
- ビルド時間:3~8 分
download_urlは status = completed の場合にのみ利用可能です- ドラフトは履歴追跡のために保持されます
⚠️ 重要な警告
-
署名なしの
.ipaは、配信前に必ず署名する必要があります -
ネイティブ認証には次のものが必要です。
team_idauth_redirectsapple-app-site-associationの適切なホスティング
-
WebView 認証は機能しますが、以下の問題があります。
- UX が悪い
- ソーシャルログインのサポートが信頼できない