mcpField
P
ping-orchestration-ios-sdk

ping-orchestration-ios-sdk

github.com/pingidentityセキュリティ146 回インストール13 週間前に更新
リポジトリ

ping-orchestration-ios-sdk について

Ping Orchestration iOS SDKによる認証統合コードやXcodeサンプルアプリを生成するスキルです。Journey、DaVinci、OIDC Webに対応し、コールバックとコレクターの範囲を選べます。

主な機能

  1. 01Xcodeサンプルプロジェクトの生成
  2. 02SDK統合ファイルの生成
  3. 03Journey、DaVinci、OIDC Webの設定
  4. 04コールバックとコレクター層の選択
  5. 05JourneyエクスポートJSONの分析

活用シーン

  1. 01iOS認証サンプルの作成
  2. 02既存アプリへのPing SDK認証の追加
  3. 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.template
App.swift.journey.template
App.swift.oidc.template
AppDaVinci.swift.template
AppJourney.swift.template
AppOidc.swift.template
AuthenticatedView.swift.davinci.template
AuthenticatedView.swift.journey.template
AuthenticatedView.swift.oidc.template
assets/callbacks/
BooleanAttributeInputCallbackView.swift.template
ChoiceCallbackView.swift.template
ConfirmationCallbackView.swift.template
ConsentMappingCallbackView.swift.template
DeviceBindingCallbackView.swift.template
DeviceProfileCallbackView.swift.template
DeviceSigningVerifierCallbackView.swift.template
FidoAuthenticationCallbackView.swift.template
FidoRegistrationCallbackView.swift.template
IdpCallbackView.swift.template
KbaCreateCallbackView.swift.template
NameCallbackView.swift.template
NumberAttributeInputCallbackView.swift.template
PasswordCallbackView.swift.template
PingOneProtectEvaluationCallbackView.swift.template
PingOneProtectInitializeCallbackView.swift.template
PollingWaitCallbackView.swift.template
ReCaptchaEnterpriseCallbackView.swift.template
SelectIdpCallbackView.swift.template
StringAttributeInputCallbackView.swift.template
TermsAndConditionsCallbackView.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 プロジェクトのスキャフォールディングは行いません)
  • 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 emailOAuth 2.0 スコープ(スペース区切り)

Journey 専用の追加パラメーター:

パラメーター必須デフォルト説明
serverUrlはい—PingAM/AIC サーバーのベース URL(末尾に / を付けません)
realmいいえalpha認証レルム
cookieNameいいえiPlanetDirectoryProセッション Cookie 名
journeyNameいいえLoginJourney ツリー名
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-samplecreate-sample "<description>"実行可能なサンプルアプリを一式生成します
app-nameapp-name "<name>"アプリ名を設定します。省略した場合は "MyApp" がデフォルトです。
output-pathoutput-path "<path>"ファイルをディスクに書き込みます。省略した場合はインラインで出力します。
create-sample "<description>"
  1. 説明を分析し、フローの種類、モジュール、想定される画面を特定します。

  2. Journey エクスポートの提案 — フローの種類が journey の場合(またはその可能性がある場合)は、次のように尋ねます。

    "Journey のエクスポート JSON はありますか?分析して、Journey で使用するコールバックに合わせてサンプルを調整できます。" 提供された場合は、続行する前にセクション 13 を実行します。その出力を使って callbackTier と画面を決定します。

  3. フローの種類が本当に曖昧な場合に限り、確認の質問を1つだけ行います。検出されたフローの種類に必要なパラメーター(W2 の表を参照)を、「プレースホルダーを使用できます」という明示的な選択肢を含めた単一の AskUserQuestion で収集します。

  4. app-name からアプリ名を解決するか、"MyApp" を使用します。

  5. assets/ 内のテンプレートファイルを使って生成します。すべての PLACEHOLDER_* トークン(下の表を参照)を置き換えます。@Observable @MainActor ViewModel を使用し、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.template

    Journey フロー — 次を読み込んで置き換えます。 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 も適切な内容に置き換えます。

  6. 成果物:

    • 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_IDclientId の値
PLACEHOLDER_REDIRECT_URIredirectUri の値
PLACEHOLDER_DISCOVERY_ENDPOINTdiscoveryEndpoint の値
PLACEHOLDER_SCOPESSet([...]) 用の、カンマ区切りの引用符付きスコープ(例:"openid", "profile", "email")
PLACEHOLDER_SERVER_URLserverUrl(Journey/DaVinci のみ)
PLACEHOLDER_REALMrealm(Journey/DaVinci のみ)
PLACEHOLDER_COOKIE_NAMEcookieName(Journey/DaVinci のみ)
PLACEHOLDER_JOURNEY_NAMEjourneyName(Journey のみ、デフォルトは "Login")
PLACEHOLDER_ACR_VALUES_LINEDaVinci/OIDC:oidcConfig.acrValues = "..." の行全体。指定されていない場合は行を完全に省略
PLACEHOLDER_KEYCHAIN_ACCOUNTKeychain アカウントキー。"<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常に(ノード型を使用するファイルでは明示的にインポートします)
PingJourneyPluginCallback プロトコルany Callback パラメーターを宣言するファイル
PingJourneyimport PingJourneyPingOne AIC/AM Journey フロー、すべての具象コールバック型
PingDavinciimport PingDavinciPingOne DaVinci フロー
PingDavinciPluginimport PingDavinciPluginCollector プロトコル — any Collector を使用するファイル、またはコレクター型を切り替えるファイル
PingOidcimport PingOidcOIDC/OAuth トークン処理、User/userinfo、OidcWebClient
PingBrowserimport PingBrowserログインの一元管理 — BrowserType、BrowserMode、BrowserLauncher、OpenURLMonitor
PingLoggerimport PingLogger統合ログ
PingStorageimport PingStorageKeychain トークン/セッションストレージ
PingExternalIdPimport PingExternalIdPソーシャルログイン(Apple/Google/Facebook)
PingFidoimport PingFidoFIDO2/WebAuthn
PingProtectimport PingProtectPingOne Protect のリスクシグナル
PingBindingimport PingBindingデバイスのバインドと署名
PingOathimport PingOathTOTP/HOTP MFA
PingPushimport 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 { } を使い、async SDK 呼び出しに橋渡しします。
  • 関数のシグネチャでは 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:ツリーの列挙、ノード→コールバックの対応付け、スクリプトの確認、ティアの判定、設定の抽出)。

コメント