TrustInsights: authorizationStatus returns .unavailable, but requestEvaluation returns .denied — feature missing from Settings (China mainland)

Hi,

I'm integrating the TrustInsights framework (Impersonation Risk Detection, IsLikelyBeingCoachedInsight) announced at WWDC26. I'd like to confirm whether the behavior below is expected regional gating or a misconfiguration on my side.

Environment

  • Real device: iPhone 15 , iOS 27.2
  • Xcode 27.2 , SDK iOS 27.2
  • App has the Trust Insights capability added in Xcode; the embedded provisioning profile includes com.apple.developer.trustinsights.base (verified via security cms -D)
  • Deployment target and device OS both satisfy the framework requirements

Code (standard usage)


**Observed behavior**
1. `authorizationStatus(for:)` always returns `.unavailable`.
2. `requestAuthorization(for:)` also returns `.unavailable` — no system permission alert is shown.
3. `requestEvaluation(context:)` throws with the framework log:
4. The Settings entry described in the user-facing docs (Settings → Privacy & Security → Impersonation Risk Detection → "Share with App Developers") **does not exist on this device**, including after search and after a failed evaluation attempt.
5. The documented testing launch argument does reach the process — `UserDefaults.standard.string(forKey: "TrustInsights.IsLikelyBeingCoachedValue")` returns `medium` when launched with `-TrustInsights.IsLikelyBeingCoachedValue medium` — but evaluation still fails with the same `denied`.

**Questions**
1. Is TrustInsights / Impersonation Risk Detection currently unavailable in China mainland (or gated by region/Apple Account storefront)? Is that why `authorizationStatus` returns `.unavailable`?
2. Why do `authorizationStatus` and `requestAuthorization` return `.unavailable` while `requestEvaluation` gets far enough to return `.denied`? Which one reflects the actual gate?
3. If the per-app permission row in Settings is only created after the first `requestAuthorization` flow, how is that supposed to happen when the API returns `.unavailable` without presenting any UI?
4. Is there a supported way to exercise the evaluation pipeline (including the launch-argument overrides) on a device where the Settings entry is absent, so UI/UX work can proceed before regional rollout?
5. Is developer-side enablement required (entitlement request / Feedback) for regions where the feature is not yet live?

Thanks! 

I can answer part of this. I can't test in China or on an iPhone 15 sold there, so whether this is regional gating or device limitation stays open, and only Apple can answer that.

Is this region gating?

I don't know. The docs for AuthorizationStatus.unavailable give three causes: an unsupported device, an app without the entitlement, or "the framework isn't available in a specific region". So, it implies that region matters. Apple has not published a list of regions or supported models, and the iOS 27 feature availability page doesn't list this feature. The support page gives no regional limit in English or Simplified Chinese. None of that tells you whether it runs on your phone.

One could assume that because the Chinese support pages show how to enable this feature to the users, the feature might be available in the region. Perhaps the limitation is with the device. The fact that the Settings entry is missing indicates either/or, that something is causing the device to not have this enabled.

In my tests, the entry was present even before I had any apps (including mine) that exercised the feature. Once the app was installed and ran, it appeared under the entry.

Don't rule out the entitlement yet.

security cms -D shows what the profile allows. What counts is what the app was signed with, so check the built app:

codesign -d --entitlements - /path/to/YourApp.app

will show if the app was signed correctly and includes the entitlement in the bundle.

What to test

If you confirm that the binary indeed includes the entitlement, you can test, by changing one thing at a time. After each change, look for the Settings entry and log authorizationStatus(for:). I don't know whether any of these matter, which is why they're worth testing.

  1. Test with the latest 27.3 beta, in case this is indeed region gating that will be enabled later.

  2. If you can, run the same build on an iPhone bought outside China. If it gets .notDetermined or .authorized, your build and entitlement are fine. Alternatively, prepare a small project that only demonstrates your implementation of TrustInsights and attach it to your reply here. Perhaps someone outside China can test it for you.

  3. On your phone, change Settings > General > Language & Region > Region, then run it again. Change it back afterwards.

  4. Check that you're signed in to the App Store [sic]. The support page says turning the feature on might need that. I don't know if that's a typo and they mean logged in to your Apple ID on the device.

If you have a test Apple Account with a different country or region, try that too. Don't move your main account for this.

For comparison, on my iPhone, outside China, I added the capability in Xcode and requested nothing else. With the setting on, the permission alert appears and evaluations come back. When I turn the setting off, for the app or for the feature, authorizationStatus(for:) returns .denied. So a switched-off setting doesn't explain your .unavailable.

I have a TrustInsightsSample that does work on a US phone. You can also test that to see if the lights are on.

Which one is the actual gate?

Act on authorizationStatus(for:). Apple's example in the framework overview checks it first and stops on .unavailable, so don't call requestEvaluation after that. It is possible that if the authorization is unavailable, the further statuses are undefined.

I can't explain why you get denied there. The docs tie denied to the person's options and notAvailable to the device, and your case sounds like the second. File that in Feedback Assistant with a sysdiagnose, whatever the tests show, and post the number here in case someone from Apple wants to follow up.

The Settings row

The support page describes the top-level entry and its switch first, with per-app access underneath. So I wouldn't expect the top-level entry to be waiting for your app's first request. Like I said, for me on a phone where no app has ever asked, the Settings entry was present.

Working without the Settings entry

The WWDC session says values and errors can be overridden with launch arguments, and points to the documentation for the list. I can't find that list. If you found that key in Apple's documentation, post the link for everyone. Reading it back from UserDefaults only shows the argument reached your process. Any -key value launch argument does that, whether a framework reads it or not.

You don't need Trust Insights for the UI work. Put the decision behind your own enum (no evaluation, unknown, medium, high) and drive the screens from a debug switch. That won't exercise the evaluation or reportConsumption, which still need a device where the framework is available. Ship the no-evaluation path as a normal path: your existing checks decide and the action goes ahead.

Developer-side enablement

The only requirement I can find documented is the com.apple.developer.trustinsights.base entitlement. I can't find anything about enabling it per region. Whether a region needs anything more is for Apple to answer, so ask that in the same Feedback report.

-------------------------
| S.Beck - 7strikes.dev |
-------------------------