プロダクトマネージャーが、社内VPNをオンにするボタンを求めてきます。頼みは些細に聞こえます。iOSではこれは小さな機能ではありません。公開契約の外にあり、どの回避策も審査で落ちるか次のリリースで壊れます。プラットフォームが実際に許すものを通して依頼をたどれば、設計はおおむね自ずと書けます。アプリはVPN構成を所有して開始できます。アプリはシステムのスイッチには届かず、自分が作っていないプロファイルの状態を読むことも、ユーザーを意思に反して接続したままにすることもできません。

ユーザーが意味する三つのことから始める

APIを分ける前に意味を分けます。ユーザーが望むのは、自分のアプリのトンネルが接続されていることのことも、他の誰かがインストールしたプロファイルのために設定のスイッチを入れたいことのことも、トンネルなしでは電話で閲覧できなくしたいことのこともあります。これらは三つの異なる仕組みに対応し、普通のアプリに開かれているのは一つ目だけです。

二つ目の意味こそがStack Overflowの質問を生むもので、サポートされた答えはありません。設定のスイッチはユーザーのもので、管理されたデバイスではプロファイルのものです。公開APIはVPN構成を列挙せず、システムのトンネルが上がっているかも報告せず、切り替えもしません。

アプリが実際に作れるもの

NetworkExtensionはNEVPNManagerを通じてアプリに独自の構成を与えます。Personal VPNの権利とユーザーの同意があれば、アプリは設定に自分の名前で表示される構成を保存し、その一つの接続を開始または停止できます。これは現実的で審査可能な能力であり、同時に範囲のすべてです。マネージャーは自分が作ったものだけを読み書きします。

権利は自動ではありません。Appleに申請し、アプリにそもそもトンネルが必要な理由を説明します。他人のプロファイルをオンにすることだけが目的のクライアントには、良い答えがありません。パケットトンネルプロバイダは別のクラスで同じ規則に従います。NETunnelProviderManagerはアプリ自身がインストールしたプロバイダベースの構成を所有します。どちらの道もMDMが配信したプロファイルには届きません。

同意は保存の時点でも適用されます。構成の書き込みはユーザーに確認を求め、その確認を便宜のために抑え込むことはアプリには許されません。

状態を読むのも同じ壁に当たる

状態は制御より親しみやすく見えますが、同じくらい閉じています。NEVPNStatusはアプリ自身の構成について、無効、切断済み、接続中、接続済み、再確認中、切断中を報告し、変更のたびに通知が発火します。管理プロファイルがインストールしたトンネルについては何も語らず、それこそがヘルプデスクが見たい状態です。

ネットワークパスの監視やインターフェースの変化は、設計レビューで代替として提案されます。これらはアプリの通信が通る経路を表し、その経路はVPNの状態と無関係な理由で変わり、VPNの読み取りとして使うと両方向に嘘をつくUIになります。

On DemandとAlways Onが本当のレバー

サポートされたレバーはアプリではなくプロファイルにあります。On Demandルールはシステムにいつ接続するかを伝えます。アクション付きの条件の順序付きリストで、評価するのはあなたのコードではなくオペレーティングシステムです。どのインターフェースでも接続するルールは、アプリに何の制御も与えずに常時接続の感覚を作ります。

Always On VPNは強制の仕組みで、監視と結びついています。監視対象のデバイスでは、MDMがトンネルを維持するプロファイルをインストールします。監視されていない個人の電話では、同じキーでも同じ動作にはなりません。この非対称性は意図的で、ペイロードキーのどの組み合わせでも解消できません。要件が本当にVPNをオンにしておくことなら、要件は実はデバイスを管理下に置くことです。

両者の間には弱い従兄弟がいます。ユーザーが切断した後に再接続するルールです。ルールが次に評価されるときに再接続し、それは即時と同じではなく、意図して切断したユーザーは違いに気づきます。鍵を約束するのではなく、その隙間を中心にインターフェースを設計してください。

サポートされた道を出荷する

コードが存在する前に四つの問いが仕組みを決めます。デバイスの所有者は誰か、監視下にあるか、どのクライアントがトンネルを終端するか、プロファイルはどこから来るか。どれかが不明なら、機能要望は見積もりの準備ができていません。

システムVPNをいじる非公開APIはデモを通り、審査で落ちます。別の方法で出荷すれば次のiOSリリースで壊れます。スイッチ一つのためにこの取引に値する版はありません。

管理テレメトリは別のチャネルです。プロファイルがインストールされていることと、デバイスが準拠しているかを報告します。これは報告であり、アプリごとの制御面ではありません。更新のたびに実機で流れを試してください。サポートされた動作はOSにあり、OSは動きます。

関連記事