ping-orchestration-ios-sdk について
Ping Orchestration iOS SDKによる認証統合コードやXcodeサンプルアプリを生成するスキルです。Journey、DaVinci、OIDC Webに対応し、コールバックとコレクターの範囲を選べます。
主な機能
- 01Xcodeサンプルプロジェクトの生成
- 02SDK統合ファイルの生成
- 03Journey、DaVinci、OIDC Webの設定
- 04コールバックとコレクター層の選択
- 05JourneyエクスポートJSONの分析
活用シーン
- 01iOS認証サンプルの作成
- 02既存アプリへのPing SDK認証の追加
- 03Journeyエクスポートに合わせたコールバック画面の作成
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pingidentity/ ping-sdk-agent-skills --skill ping-orchestration-ios-sdkインストール後、Claude Code で/ping-orchestration-ios-sdkを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/App.swift.davinci.templateApp.swift.journey.templateApp.swift.oidc.templateAppDaVinci.swift.templateAppJourney.swift.templateAppOidc.swift.templateAuthenticatedView.swift.davinci.templateAuthenticatedView.swift.journey.templateAuthenticatedView.swift.oidc.templateassets/callbacks/BooleanAttributeInputCallbackView.swift.templateChoiceCallbackView.swift.templateConfirmationCallbackView.swift.templateConsentMappingCallbackView.swift.templateDeviceBindingCallbackView.swift.templateDeviceProfileCallbackView.swift.templateDeviceSigningVerifierCallbackView.swift.templateFidoAuthenticationCallbackView.swift.templateFidoRegistrationCallbackView.swift.templateIdpCallbackView.swift.templateKbaCreateCallbackView.swift.templateNameCallbackView.swift.templateNumberAttributeInputCallbackView.swift.templatePasswordCallbackView.swift.templatePingOneProtectEvaluationCallbackView.swift.templatePingOneProtectInitializeCallbackView.swift.templatePollingWaitCallbackView.swift.templateReCaptchaEnterpriseCallbackView.swift.templateSelectIdpCallbackView.swift.templateStringAttributeInputCallbackView.swift.templateTermsAndConditionsCallbackView.swift.template詳細
スキルのパラメーター
このスキルは、/ping-orchestration-ios-sdk <args> として呼び出すときに、オプションの引数文字列を受け付けます。
引数なしでの呼び出し — ウィザードモード
引数なし(/ping-orchestration-ios-sdk)で呼び出した場合は、ウィザードを実行します。
ステップ W1 — 意図を確認:AskUserQuestion を使用します。
"What would you like to do?"
Options:
A) Build a new sample app — scaffold a complete Xcode project with full Ping branding
B) Integrate into existing app — generate only the SDK files to drop into your project
C) Browse the reference guide — show the full SDK reference
D) Something else — let me describe what I need
- A / B → ステップ W1b の後、ステップ W2 に進みます
- A:自動プロジェクト作成に進みます(
assets/project-scaffolding.mdを読み込みます) - B:SDK 統合ファイルのみを生成します(Xcode プロジェクトのスキャフォールディングは行いません)
- A:自動プロジェクト作成に進みます(
- C → 「Ping SDK for iOS — Integration Guide」以降のリファレンスガイドを表示して終了します。
- D → 自由記述の追加質問を行い、回答に応じて処理を進めます。
ステップ W1b — Journey エクスポートの確認(オプション A と B のみ)。
次のように質問します。
「Journey のエクスポート JSON ファイルはありますか?ある場合は、貼り付けるか添付してください。分析して、Journey が使用するコールバックを正確に処理するサンプルを生成します。」
- 提供された場合:ステップ W2 の前にセクション 13(Journey エクスポートの分析)を実行します。分析結果から
journeyName、callbackTier、serverUrlをあらかじめ設定します。 - 提供されない場合:通常どおりステップ W2 に進みます。
ステップ W2 — 構成を収集(A と B で必須)。
まず、まだ判明していない場合は flowType を確認します。その後、該当するフローに必要なパラメーターのみを、1 回の AskUserQuestion 呼び出しで質問します。デフォルト値がある場合は提示します。必須フィールドがすべて設定されるまで先に進まないでください。
共通パラメーター(すべてのフロー):
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
appName | はい | — | Swift の型、PingHeaderView のタイトル、バンドル ID に使用するアプリ名。例:PingDemo |
outputPath | はい(オプション A のみ) | — | Xcode プロジェクトを書き込むディレクトリ(絶対パス) |
flowType | はい | — | oidc-web・journey・davinci |
clientId | はい | — | OAuth 2.0 クライアント ID |
redirectUri | はい | — | OAuth 2.0 リダイレクト URI(カスタムスキーム。例:myapp://callback) |
discoveryEndpoint | はい | — | /.well-known/openid-configuration で終わる完全な OIDC ディスカバリー URL |
scopes | いいえ | openid profile email | OAuth 2.0 スコープ(スペース区切り) |
Journey 専用の追加パラメーター:
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
serverUrl | はい | — | PingAM/AIC サーバーのベース URL(末尾に / を付けません) |
realm | いいえ | alpha | 認証レルム |
cookieName | いいえ | iPlanetDirectoryPro | セッション Cookie 名 |
journeyName | いいえ | Login | Journey ツリー名 |
callbackTier | はい | — | basic、standard、full のいずれか(セクション 12 を参照) |
DaVinci 専用の追加パラメーター:
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
callbackTier | はい | — | basic、standard、full のいずれか(セクション 12 を参照) |
acrValues | いいえ | (なし) | オプションの ACR 値文字列。指定されていない場合は完全に省略します |
OIDC Web 専用の追加パラメーター:
| パラメーター | 必須 | デフォルト | 説明 |
|---|---|---|---|
acrValues | いいえ | (なし) | オプションの ACR 値文字列。指定されていない場合は完全に省略します |
callbackTier の選択肢(Journey と DaVinci のみ)を提示します。
- Basic —
NameCallback、PasswordCallback、TextOutputCallback、ChoiceCallback(Journey)/TextCollector、PasswordCollector、SubmitCollector、LabelCollector、FlowCollector(DaVinci)。依存関係は最小限です。 - Standard — Basic のすべてに加えて、属性コールバック、FIDO、Protect、Device Binding/Profile、SelectIdp、T&C、KBA、PollingWait、ConsentMapping が含まれます。サードパーティのソーシャル SDK は含まれません。
- Full fat — Standard のすべてに加えて、
IdpCallback/IdpCollector/SocialCollectorView(ソーシャルログイン)とReCaptchaEnterpriseCallbackが含まれます。Facebook、Google、ReCaptcha Enterprise の SPM 依存関係が必要です。 検証ルール: redirectUriにはカスタムスキームを使用する必要があります(http://またはhttps://は使用できません)。discoveryEndpointはhttps://で始まり、/.well-known/openid-configurationで終わる必要があります。ユーザーがベースの AM URL を指定した場合は、<serverUrl>/oauth2/<realm>/.well-known/openid-configurationを組み立てて確認してください。scopesにはopenidを含める必要があります。含まれていない場合は、先頭に追加して警告してください。serverUrl(Journey のみ)はhttps://で始まり、末尾に/が付いていてはいけません。
ステップ W3 — 確認して生成します。 収集した値を短い表にまとめ、「生成を開始してよろしいですか? この内容で問題ありませんか?」と尋ね、確認を得てから続行します。
パラメーター(with-args 呼び出し)
| パラメーター | 構文 | 用途 |
|---|---|---|
create-sample | create-sample "<description>" | 実行可能なサンプルアプリを一式生成します |
app-name | app-name "<name>" | アプリ名を設定します。省略した場合は "MyApp" がデフォルトです。 |
output-path | output-path "<path>" | ファイルをディスクに書き込みます。省略した場合はインラインで出力します。 |
create-sample "<description>"
-
説明を分析し、フローの種類、モジュール、想定される画面を特定します。
-
Journey エクスポートの提案 — フローの種類が
journeyの場合(またはその可能性がある場合)は、次のように尋ねます。"Journey のエクスポート JSON はありますか?分析して、Journey で使用するコールバックに合わせてサンプルを調整できます。" 提供された場合は、続行する前にセクション 13 を実行します。その出力を使って
callbackTierと画面を決定します。 -
フローの種類が本当に曖昧な場合に限り、確認の質問を1つだけ行います。検出されたフローの種類に必要なパラメーター(W2 の表を参照)を、「プレースホルダーを使用できます」という明示的な選択肢を含めた単一の
AskUserQuestionで収集します。 -
app-nameからアプリ名を解決するか、"MyApp"を使用します。 -
assets/内のテンプレートファイルを使って生成します。すべてのPLACEHOLDER_*トークン(下の表を参照)を置き換えます。@Observable @MainActorViewModel を使用し、ObservableObject/@Publishedは使用しないでください。Ping Identity のブランディングを適用します(セクション 11)。OIDC Web フロー — 次を読み込んで置き換えます。
App.swift.oidc.template、AppOidc.swift.template、OidcLoginViewModel.swift.template、ContentView.swift.oidc.template、LoginView.swift.oidc.template、AuthenticatedView.swift.oidc.template、Theme.swift.templateJourney フロー — 次を読み込んで置き換えます。
App.swift.journey.template、AppJourney.swift.template、JourneyLoginViewModel.swift.template、ContentView.swift.journey.template、LoginView.swift.journey.template、AuthenticatedView.swift.journey.template、ContinueNodeView.swift.journey.template、Theme.swift.template次に、
callbackTier内の各コールバックについて、assets/callbacks/から対応するファイルを読み込んで置き換えます。- Basic:
NameCallbackView、PasswordCallbackView、ChoiceCallbackView、TextOutputCallbackView - Standard: Basic のすべてに加えて、
TextInputCallbackView、ValidatedUsernameCallbackView、ValidatedPasswordCallbackView、StringAttributeInputCallbackView、NumberAttributeInputCallbackView、BooleanAttributeInputCallbackView、ConfirmationCallbackView、TermsAndConditionsCallbackView、KbaCreateCallbackView、ConsentMappingCallbackView、PollingWaitCallbackView、SelectIdpCallbackView、FidoRegistrationCallbackView、FidoAuthenticationCallbackView、DeviceProfileCallbackView、DeviceBindingCallbackView、DeviceSigningVerifierCallbackView、PingOneProtectInitializeCallbackView、PingOneProtectEvaluationCallbackView - Full fat: Standard のすべてに加えて、
IdpCallbackView、ReCaptchaEnterpriseCallbackView
ContinueNodeView.swift.journey.templateでは、// PLACEHOLDER_CALLBACK_CASESを該当するティアのswitchケースに、// PLACEHOLDER_TIER_IMPORTSを対応する import 文に置き換えます。// PLACEHOLDER_SELF_ADVANCING_TYPESは、そのティアの自動進行型に置き換えます。 DaVinci フロー — 次のファイルを読み込み、置換します。App.swift.davinci.template、AppDaVinci.swift.template、DaVinciLoginViewModel.swift.template、ContentView.swift.davinci.template、LoginView.swift.davinci.template、AuthenticatedView.swift.davinci.template、CollectorNodeView.swift.davinci.template、Theme.swift.template次に、
callbackTier内の各コレクターについて、assets/collectors/から対応するファイルを読み込み、置換します。- Basic:
TextCollectorView、PasswordCollectorView、SubmitCollectorView、LabelCollectorView、FlowCollectorView - Standard: Basic のすべてに加えて、
MultiSelectCheckBoxView、MultiSelectComboBoxView、SingleSelectDropdownView、SingleSelectRadioView、PhoneNumberCollectorView、ProtectCollectorView、FidoRegistrationCollectorView、FidoAuthenticationCollectorView、DeviceRegistrationCollectorView、DeviceAuthenticationCollectorView - Full fat: Standard のすべてに加えて、
SocialCollectorView
CollectorNodeView.swift.davinci.templateで、// PLACEHOLDER_COLLECTOR_CASESを対象のティアに応じた適切なswitchケースに置き換え、// PLACEHOLDER_TIER_IMPORTSと// PLACEHOLDER_SELF_ADVANCING_TYPESも適切な内容に置き換えます。 - Basic:
-
成果物:
output-pathがある場合:assets/project-scaffolding.mdを読み込み、Step 0~G に正確に従ってください。フロータイプごとの SPM プロダクトについては、そのドキュメントの Step C を参照してください。output-pathがない場合:すべてのファイルを、// --- <Filename>.swift ---というヘッダーを付けてインラインで出力してください。
テンプレートのプレースホルダー
| プレースホルダー | 置換する内容 |
|---|---|
PLACEHOLDER_APP_NAME | 解決済みのアプリ名(例:PingDemo) |
PLACEHOLDER_APP_NAME_UPPER | 大文字にしたアプリ名(例:PINGDEMO)。Keychain アカウントキーの構築に使用 |
PLACEHOLDER_CLIENT_ID | clientId の値 |
PLACEHOLDER_REDIRECT_URI | redirectUri の値 |
PLACEHOLDER_DISCOVERY_ENDPOINT | discoveryEndpoint の値 |
PLACEHOLDER_SCOPES | Set([...]) 用の、カンマ区切りの引用符付きスコープ(例:"openid", "profile", "email") |
PLACEHOLDER_SERVER_URL | serverUrl(Journey/DaVinci のみ) |
PLACEHOLDER_REALM | realm(Journey/DaVinci のみ) |
PLACEHOLDER_COOKIE_NAME | cookieName(Journey/DaVinci のみ) |
PLACEHOLDER_JOURNEY_NAME | journeyName(Journey のみ、デフォルトは "Login") |
PLACEHOLDER_ACR_VALUES_LINE | DaVinci/OIDC:oidcConfig.acrValues = "..." の行全体。指定されていない場合は行を完全に省略 |
PLACEHOLDER_KEYCHAIN_ACCOUNT | Keychain アカウントキー。"<APP_NAME_UPPER>_ACCESS_TOKEN" のパターンを使用(例:"PINGDEMO_ACCESS_TOKEN") |
ユーザーがプレースホルダーモードを選択した場合は、"yourClientId"、"yourapp://callback"、"https://your-tenant.forgeblocks.com/am/oauth2/alpha/.well-known/openid-configuration" を使用してください。
プロジェクトの自動作成(output-path が指定されている場合)
assets/project-scaffolding.md を読み込み、Step 0~G に正確に従ってください。主な注意事項:
- デプロイメントターゲットには
18.0を使用してください。 - レイアウトはフラットです。.xcodeproj、ソースディレクトリ、
Config/は<output-path>/直下に兄弟として配置してください。 PBXFileSystemSynchronizedRootGroupにより、ソースディレクトリに置いた Swift ファイルは自動的に含まれます。- Ruby スクリプトでプロジェクト内のすべてのオブジェクトを反復処理するには、
project.root_object.objectsではなくproject.objects.eachを使用してください。
例:
/ping-orchestration-ios-sdk create-sample "a simple username/password login using Journey"
/ping-orchestration-ios-sdk create-sample "OIDC centralized login with token display and sign-out" app-name "PingDemo" output-path "/Users/me/Dev"
/ping-orchestration-ios-sdk create-sample "Journey login with FIDO passkey registration and biometric auth" app-name "FidoSample"
iOS 向け Ping SDK — 統合ガイド
コード例の命名規則
変数名とパラメーター名は、常に省略せず、完全で説明的な名前を使用してください。略記は禁止です:vm → viewModel、cb → nameCallback、cfg → journeyConfig。これは switch 文内のローカルバインディングやクロージャー引数にも適用されます($0 は使用しないでください)。
フローの種類 — 連携方法を選ぶ
Journey(ネイティブ/埋め込み) — SwiftUI ビューを使って、認証 UI をすべてアプリ内に表示します。ブラウザーは起動しません。onOpenURL/OpenURLMonitor は不要です。
OIDC Web(OidcWebClient) — SFSafariViewController または ASWebAuthenticationSession を使用します。onOpenURL → OpenURLMonitor.shared.handleOpenURL(url) を接続し、フォアグラウンド復帰を処理する必要があります。
DaVinci — Journey(ネイティブ)と同様ですが、コールバックの代わりにコレクターを使用します。ソーシャル IdP コレクター(IdpCollector)はブラウザーを起動するため、DaVinci フローで使用する場合は onOpenURL を接続してください。
モジュール一覧
必要なものだけを選んでください。SDK はモジュール式です。
| モジュール | インポート | 追加するタイミング |
|---|---|---|
PingOrchestrate | コアエンジン — Node、ContinueNode、SuccessNode、FailureNode、ErrorNode | 常に(ノード型を使用するファイルでは明示的にインポートします) |
PingJourneyPlugin | Callback プロトコル | any Callback パラメーターを宣言するファイル |
PingJourney | import PingJourney | PingOne AIC/AM Journey フロー、すべての具象コールバック型 |
PingDavinci | import PingDavinci | PingOne DaVinci フロー |
PingDavinciPlugin | import PingDavinciPlugin | Collector プロトコル — any Collector を使用するファイル、またはコレクター型を切り替えるファイル |
PingOidc | import PingOidc | OIDC/OAuth トークン処理、User/userinfo、OidcWebClient |
PingBrowser | import PingBrowser | ログインの一元管理 — BrowserType、BrowserMode、BrowserLauncher、OpenURLMonitor |
PingLogger | import PingLogger | 統合ログ |
PingStorage | import PingStorage | Keychain トークン/セッションストレージ |
PingExternalIdP | import PingExternalIdP | ソーシャルログイン(Apple/Google/Facebook) |
PingFido | import PingFido | FIDO2/WebAuthn |
PingProtect | import PingProtect | PingOne Protect のリスクシグナル |
PingBinding | import PingBinding | デバイスのバインドと署名 |
PingOath | import PingOath | TOTP/HOTP MFA |
PingPush | import PingPush | プッシュ通知 MFA |
1 — SDK パッケージの参照
.package(url: "https://github.com/ForgeRock/ping-ios-sdk", from: "2.0.0")
// Add only the products your target needs:
.product(name: "PingJourney", package: "ping-ios-sdk"),
.product(name: "PingOidc", package: "ping-ios-sdk"),
.product(name: "PingBrowser", package: "ping-ios-sdk"), // OidcWebClient flows
CocoaPods:
pod 'PingJourney'
pod 'PingStorage'
pod 'PingLogger'
2 — ノード型の参照
// PingOrchestrate — import in any file pattern-matching on nodes
struct FailureNode: Node {
let cause: Error // NON-OPTIONAL — use cause.localizedDescription
}
struct ErrorNode: Node {
let message: String // NON-OPTIONAL
let status: Int?
}
struct SuccessNode: Node {
let session: Session // NON-OPTIONAL
}
// ContinueNode — more input needed (callbacks for Journey, collectors for DaVinci)
Node は Equatable ではありません — 状態の変化は個別の Bool フラグで追跡します。
var isRegistered = false // set in next() based on returned node type
3 — コールバックプロパティの型
Journey のコールバックプロパティはオプショナルではない String です。?? fallback は使用しないでください。Basic ティアのプロパティ:NameCallback.name/prompt、PasswordCallback.password/prompt、TextInputCallback.text/prompt、ChoiceCallback.selectedIndex/choices、TextOutputCallback.message/messageType。
Standard ティアで注意が必要な点(推測を誤るとコンパイルエラーになります):ValidatedUsernameCallback → .username(.value ではありません)、ValidatedPasswordCallback → .password、ConfirmationCallback → .options/.selectedIndex: Int?、TermsAndConditionsCallback → .accepted: Bool、KbaCreateCallback → .selectedQuestion/.selectedAnswer、SelectIdpCallback → .value = provider.provider(.setProvider() はありません)。
Standard ティアのコールバックビューを書く前に、references/journey-callbacks.md を読み、完全版の「Critical API Facts」セクションを確認してください。
4 — AppJourney シングルトン
import PingJourney
import PingOrchestrate
import PingLogger
@MainActor
class AppJourney {
static let shared = AppJourney()
let journey: Journey
private init() {
journey = Journey.createJourney { journeyConfig in
journeyConfig.serverUrl = "https://your-server.example.com/am"
journeyConfig.realm = "alpha"
journeyConfig.cookie = "your-cookie-name"
journeyConfig.logger = LogManager.standard
journeyConfig.module(PingJourney.OidcModule.config) { oidcConfig in
oidcConfig.clientId = "yourClientId"
oidcConfig.scopes = ["openid", "profile", "email"]
oidcConfig.redirectUri = "yourapp://callback"
oidcConfig.discoveryEndpoint = "https://your-server.example.com/am/oauth2/alpha/.well-known/openid-configuration"
oidcConfig.logger = LogManager.standard
}
}
}
}
ウィザードで収集した journeyName は、呼び出し時に journey.start() に渡します。
node = await AppJourney.shared.journey.start(journeyName)
複数フローを扱うアプリ(Journey + DaVinci + OIDC Web)およびトークンストレージのカスタマイズについては、references/advanced-patterns.md を参照してください。
5 — Journey 認証フロー
ViewModel パターン
import Foundation
import Observation
import PingJourney
import PingOrchestrate
@Observable
@MainActor
final class LoginViewModel {
var node: Node?
var isLoading = false
let journeyName: String
init(journeyName: String = "Login") {
self.journeyName = journeyName
}
func start() async {
isLoading = true
defer { isLoading = false }
node = await AppJourney.shared.journey.start(journeyName)
}
func next(continueNode: ContinueNode) async {
isLoading = true
defer { isLoading = false }
node = await continueNode.next()
}
func reset() { node = nil }
}
モデルは @State で保持し、@StateObject は使用しないでください。
@State private var loginViewModel = LoginViewModel()
トップレベルのノード切り替え
import PingOrchestrate
import PingJourney
switch loginViewModel.node {
case let successNode as SuccessNode:
AuthenticatedView(successNode: successNode, onSignOut: loginViewModel.reset)
case let failureNode as FailureNode:
ErrorView(message: failureNode.cause.localizedDescription, onRetry: retry)
case let errorNode as ErrorNode:
ErrorView(
message: errorNode.message.isEmpty ? "An error occurred." : errorNode.message,
onRetry: retry
)
case let continueNode as ContinueNode:
LoginView(continueNode: continueNode, isLoading: loginViewModel.isLoading,
onNext: { Task { await loginViewModel.next(continueNode: continueNode) } })
default:
LoginView(continueNode: nil, isLoading: loginViewModel.isLoading,
onNext: { Task { await loginViewModel.start() } })
}
コールバックレンダラー(ContinueNodeView)
Callback は PingJourneyPlugin にあるため、PingOrchestrate と一緒にインポートします。関数のシグネチャでは any Callback を使います(Swift 6 の existential 構文)。hasSelfAdvancingCallback が true の場合は、次へ進むボタンを非表示にします(FIDO、Confirmation、Protect、SelectIdp、DeviceBinding の各コールバックは自動で次へ進みます)。
実装全体の参考として assets/ContinueNodeView.swift.journey.template を使います。コールバックのビューコードを書く前に、必ず references/journey-callbacks.md を読んでください。
6 — セッションのライフサイクル
let user: User? = await AppJourney.shared.journey.journeyUser()
if let user = user {
let result = await user.userinfo(cache: false)
switch result {
case .success(let info):
info.forEach { key, value in print("\(key): \(String(describing: value))") }
case .failure(let error):
print(error.localizedDescription)
}
}
_ = await AppJourney.shared.journey.signOff()
7 — アプリのエントリーポイントへの統合
Journey/DaVinci のネイティブフロー — onOpenURL は不要です:
@main
struct MyApp: App {
var body: some Scene {
WindowGroup { ContentView() }
}
}
OIDC Web およびソーシャル IdP のコールバック — 必須の配線箇所が 3 つあります:
import PingBrowser
@main
struct MyApp: App {
@Environment(\.scenePhase) private var scenePhase
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
OpenURLMonitor.shared.handleOpenURL(url)
}
.onChange(of: scenePhase) { _, phase in
if phase == .active,
BrowserLauncher.currentBrowser.isInProgress {
BrowserLauncher.currentBrowser.handleAppActivation()
}
}
}
}
}
URL スキームの登録 — GENERATE_INFOPLIST_FILE = YES を使用するスキャフォールドプロジェクトでは、Ruby スニペット(assets/project-scaffolding.md の手順 D)を使用します。Info.plist を手書きしないでください(Multiple commands produce Info.plist が発生します)。また、xcconfig の角括弧付き構文も使用しないでください(error: expected to find '=' in macro condition が発生します)。
8 — OIDC Web フロー(OidcWebClient)
IdP がログインページをホストしている場合は OIDC Web を選択します。アプリの SwiftUI ビューに認証情報のフィールドが必要な場合は、Journey ネイティブ(セクション 5)を選択します。
authorize() は async throws で、Result<User, OidcError> を返します。エラーチャネルは 2 つあります。ネットワーク/OIDC ディスカバリーの失敗は throws、認証エラーは Result.failure です。switch result をラップする do/catch で、必ず両方を処理してください。
AppOidc シングルトン、OidcWebClientConfig API、OidcError のケース、BrowserType のトレードオフ、OidcLoginViewModel、ブランドに合わせた OidcLoginView については、references/oidc-web-reference.md を読んでください。
9 — DaVinci フロー
DaVinci ではコールバックの代わりにコレクターを使用します。@Observable ViewModel のパターンは Journey と同じです。PingJourney.OidcModule を PingDavinci.OidcModule に置き換えます。DaVinci では serverUrl、realm、cookieName は使用しません。
hasSelfAdvancingCollector の対象となる型:SubmitCollector、FlowCollector、FidoRegistrationCollector、FidoAuthenticationCollector、DeviceRegistrationCollector、DeviceAuthenticationCollector。
重要: next() を呼び出す前に、必ず submitCollector.value = submitCollector.id と flowCollector.value = flowCollector.id を設定します。これらは POST ボディの actionKey と eventType を決定します。
AppDaVinci シングルトン、完全な CollectorNodeView、個々のコレクタービュー、DaVinciAuthenticatedView、セッションのライフサイクルについては、references/davinci-collectors.md を読んでください。
10 — Swift 6 に関する注意事項
@Observableプロパティに適した分離を行うため、ViewModel に@MainActorを付けます。@MainActorのコード内ではTask { }を使い、asyncSDK 呼び出しに橋渡しします。- 関数のシグネチャでは
any Callback/any Collectorと記述します。これは Swift 6 の existential 構文で必須です。 NodeはEquatableではありません。.onChange(of: node)ではなく、Bool フラグで状態の遷移を追跡します。UserDefaultsを使用する@Observableクラスには、必ずimport Foundationを追加します。
11 — Ping Identity のビジュアルブランディング
assets/Theme.swift.template をそのまま <AppName>/Theme.swift に書き込みます(PLACEHOLDER_APP_NAME を置き換えます)。次の要素が含まれています:PingPrimaryButtonStyle、PingHeaderView、PingTextField、PingSecureField、FidoIconView、ErrorMessageView、LoadingOverlay、ErrorView。主要なトークン:Color.pingRed = #A31300、角丸はボタンが 15pt/フィールドが 8pt、ヘッダーのパディングは 32pt、コンテンツのパディングは 24pt です。
assets/Logo.imageset/ を Assets.xcassets/Logo.imageset/ にコピーし、Image("Logo") で参照します。すべての Form に .tint(.pingRed) を適用します。
12 — コールバック/コレクターのティア
ティアの詳細と選択ガイドについては、references/callback-tiers.md を参照してください。
概要: Basic(ユーザー名/パスワード/選択肢。追加の SPM なし)→ Standard(FIDO、Protect、デバイスバインディング、利用規約、KBA、ソーシャル IdP のブラウザベース認証を追加)→ Full fat(ネイティブの Apple/Google/Facebook ソーシャル認証と ReCaptcha Enterprise を追加)。ウィザードの callbackTier パラメーターは、これらのティアに直接対応します。
よくある落とし穴
references/common-pitfalls.md を参照してください。Swift 6 のエラー、OIDC リダイレクトの問題、DaVinci コレクターの注意点、SPM のビルドエラー、シミュレーターの問題について説明しています。
13 — Journey エクスポートの分析
ユーザーから Journey のエクスポート JSON を受け取った場合、コードを記述する前に references/journey-export-analysis.md の全分析を実行してください(ステップ A1~A8:ツリーの列挙、ノード→コールバックの対応付け、スクリプトの確認、ティアの判定、設定の抽出)。