Problem:
CTCellularPlanStatus.getTokenWithCompletion Returns Nil Token and Nil Error When Multiple SIM Profiles Are Configured but Only One Subscription Is Active
Environment:
- Device: iPhone 15 Pro
- iOS: 27.0
- Capability: com.apple.developer.upi-device-validation
- Frameworks: CoreTelephony, MessageUI
- Reproduced in both production app and standalone Objective-C sample app
Issue: After successful UPI verification SMS submission, setUPIVerificationCodeSendCompletion returns YES, but CTCellularPlanStatus.getTokenWithCompletion returns:
Token = nil
Error = nil
Code:
[messageController setUPIVerificationCodeSendCompletion:^(BOOL result) {
if (result) {
[CTCellularPlanStatus getTokenWithCompletion:^(NSString *token, NSError *error) {
NSLog(@"Token = %@", token);
NSLog(@"Error = %@", error);
}];
}
}];
Observed Behavior:
The behavior appears to depend on the SIM profile configuration:
Scenario 1
Device has only a single SIM profile configured:
- Physical SIM only, or
- eSIM only
Result: Token is returned successfully.
Scenario 2
Device has both Physical SIM and eSIM profiles configured and both are active.
Result: Token is returned successfully.
Scenario 3
The device is configured with both a Physical SIM profile and an eSIM profile; however, only one subscription is active:
- Physical SIM active, eSIM disabled, or
- eSIM active while the Physical SIM is removed or unavailable (displayed as "No SIM" in Settings)
Observed Result:
Token = nil
Error = nil
Summary of Observed Behavior
Token retrieval succeeds in the following configurations:
- Device provisioned with a single SIM profile (Physical SIM only or eSIM only).
- Device provisioned with both Physical SIM and eSIM profiles, with both subscriptions active.
Token retrieval consistently fails in the following configuration:
- Device provisioned with both Physical SIM and eSIM profiles, but only one subscription is active.
This behavior appears reproducible and suggests a potential issue related to subscriber resolution when a dual-SIM device contains multiple SIM profiles but only a single active subscription. The API does not provide an error indicating why token generation or retrieval failed.