アプリを再起動してマネージャに接続状態を問い合わせると、システムメニューが明らかにトンネルの稼働を示しているのに切断と報告されます。あるいは保存呼び出しが何も説明しないエラーを返したり、共有シークレットが割り当てられた数秒後に見つからないと宣言されたりします。三つの症状、一つの仕組み: マネージャはシステムストアを映すビューであり、ビューは誰かが読み込むまで空として読まれます。

これをデバッグする前に、どの API を使うべきかを決めてください。システムの IPsec または IKEv2 トンネルなら組み込みのマネージャが適します。システムが実装していないプロトコルには、自前のパケット処理を伴うトンネルプロバイダが必要で、フィールドの組み合わせでは変わりません。

マネージャはストアを映すビュー

マネージャを作成または取得し、設定の読み込みを要求して、完了ハンドラが終わるまで状態の読み取りやプロトコル設定の変更を待ちます。保存済み構成を列挙するのが目的なら、一つのインスタンスを二用途に使い回さず、全バリアントの呼び出しを使ってください。読み込みが届く前の状態は通常は無効で、無効をオフと見なすことが、再起動後にだけアプリが誤って見える原因そのものです。

書き込みも同じ順序に従います。何も読み込んでいないマネージャへの保存は、変更を適用すべき保存済みの識別情報がないため、役に立つメッセージなしに失敗することがあります。読み込み、変更、保存、そして状態を読み直す。システムが接続するのは保存済みプロファイルであり、メモリ上で編集していたものではありません。

状態の変化は見ている間だけ届く

設定が読み込まれると、状態は切断、接続中、接続済み、再確認、切断中と移ります。一度の読み取りでインターフェースを初期化し、その後はタイマーでポーリングする代わりに変更通知を購読します。ポーリングは前面では機能し背面では嘘をつき、そのせいでアプリはいつまでも終わらないスピナーを抱えることになります。

通知が届くのはアプリが前面にある間だけです。背面で状態を保つものは再起動後に古く見えるので、起動時とアプリが前面に戻ったときに更新してください。プロバイダがトンネルを所有している場合は、対応するセッションオブジェクト経由で操作します。単純な接続プロパティはプロバイダのライフサイクルをモデル化していません。

シークレットは文字列ではなく参照

共有シークレットが見つからないという報告は、誰も割り当てていないという意味であることはまれです。プロトコルオブジェクトが求めるのは参照で、ユーザーパスワード用と IPsec 事前共有鍵用の二つです。nil を渡す場合も、誤ったキーチェーン項目から派生した参照を渡す場合も、空のスロットと同じ苦情になります。エラーは症状を名指しして原因を隠すので、人々は同じシークレットを何度も再入力します。

まずシークレットを汎用パスワード項目として書き込み、そのうえで永続参照を読み戻します。永続参照はメモリ上のポインタと違い再起動を越えて残り、プロファイルがシリアライズするのはこの表現です。デバイスのロック解除後もアクセスを許すアクセシビリティクラスを選んでください。そうしないと、ロック画面で再接続が必要なトンネルは完全に有効なシークレットでも認証に失敗します。

拡張は独自のキーチェーンビューを持つ

ネットワーク拡張は別プロセスなので、アプリの既定のキーチェーンアクセスはそこに届きません。両方のターゲットに同じキーチェーンアクセスグループを entitlement で与え、項目をそのグループ内に一度だけ保存し、各プロセスにそれを読ませます。グループがなければ拡張は何も見つけられず、アプリでは再現できない資格情報エラーを報告します。

プロバイダが自身のプロバイダ構成オブジェクトで設定される場合、シークレットをアプリ内にも埋め込まないでください。二つのコピーは乖離し、その乖離は重複ではなく不正な資格情報として現れます。別の状態を報告するウィジェットや二つ目のプロセスも同じ説明です。どちらもグループを必要とし、どちらも読む前に設定を読み込む必要があります。

API をプロトコルに合わせる

組み込みのマネージャが扱うのは IPsec と IKEv2 のプロトコルオブジェクトです。追加のフィールドで汎用の SSL VPN クライアントになるわけではなく、不整合なプロファイルは正常に保存できても接続できないことがあります。状態を調べる前に自分がどのカテゴリかを決めてください。状態のバグと未対応プロトコルは外から見ると同じだからです。

次の再起動に向けたチェックリストは短いものです。設定を読み込み、状態を読み、変更購読を前面に保ち、共有グループから参照を再構築し、プロトコルオブジェクトが実装した API と一致することを確認する。このリストを実行するのに一分、当てずっぽうにやれば半日かかります。

関連記事