iOS 26: Unable to Transition from CallKit Screen to App when remoteHandle is nil or empty string

Hello,

I am developing an internal phone application using CallKit. I am experiencing an issue with the behavior of remoteHandle settings in iOS 26 and would appreciate any insights you can provide towards a solution.

1. Problem Description

When an iPhone running iOS 26 is in a sleep state and receives a VoIP incoming call where remoteHandle is set to nil or an empty string (@""), we are unable to transition to our application (the UIExtension provided by the provider) from the CallKit UI's "More" (…) button after answering the call.

2. Conditions and Symptoms

  • OS Version: iOS 26
  • Initial State: iPhone is in a sleep state
  • Call Type: An unsolicited(unknown number) VoIP incoming call where the CXCallUpdate's remoteHandle is set to either nil or [[CXHandle alloc] initWithType:CXHandleTypePhoneNumber value:@""]
  • Symptoms: After answering the VoIP call by sliding the button, selecting the "More" (…) button displayed on the CallKit screen does not launch our application's UIExtension (custom UI), and the iPhone instead stay to the CallKit screen.

3. Previous Behavior (Up to iOS 18)

Up to iOS 18, even when remoteHandle was set to an empty string using the following code, the application would transition normally from "More" after answering an incoming call from a sleep state.

CXCallUpdate *update = [[CXCallUpdate alloc] init];
update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypePhoneNumber value:@""];

[provider reportNewIncomingCallWithUUID:uuid update:update completion:completion];

4. Unsuccessful Attempts to Resolve

The issue remained unresolved after changing the handling for unsolicited(unknown number) incoming calls as follows:

CXCallUpdate *update = [[CXCallUpdate alloc] init];
update.remoteHandle = nil; // Set remoteHandle to nil
[provider reportNewIncomingCallWithUUID:uuid update:update completion:completion];

5. Workaround (Temporary)

The problem can be resolved, and the application can transition successfully, by setting a dummy numerical value (e.g., "0") for the value in remoteHandle using the following code:

CXCallUpdate *update = [[CXCallUpdate alloc] init];
update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypePhoneNumber value:@"0"]; // Set a dummy numerical value

[provider reportNewIncomingCallWithUUID:uuid update:update completion:completion];

6. Additional Information

If remoteHandle is correctly set with the caller's number (i.e., not an unsolicited(unknown number) call; e.g., value:@"1234567890"), the application transitions normally from the "More" button after answering an incoming call from a sleep state, even in iOS 26.

The above issue does not occur when answering incoming calls while the iPhone is in an active state (not sleeping).

7. Questions

  1. Have there been any other reports of similar behavior?
  2. Should this be considered a bug in CallKit for iOS 26? Should I make file a new Feedback report?
  3. Is there a suitable method to resolve this issue when the caller ID is unsolicited (nil or an empty string)?

This problem significantly impacts user operations as end-users are unable to perform essential in-app actions such as hold or transfer after answering an unsolicited(unknown number) call from a sleep state. We are eager to find an urgent solution and would appreciate any information or advice you can provide.

Thank you for your assistance.

Answered by DTS Engineer in 870060022
  1. Have there been any other reports of similar behavior?

Nope, not that I'm aware of. To be honest, this is the first time I've ever thought of passing an empty remoteHandle. It's entirely possible you're the first person who's ever tried this, and you're certainly the first person who's asked me about it.

Should this be considered a bug in CallKit for iOS 26?

Yes and no. That is, it certainly shouldn't be behaving the way you're seeing, but I'm also not sure it should allow remoteHandle to be empty at all.

Should I make a new Feedback report?

Yes, please file a bug on this and post the bug number back here.

Having said that...

Is there a suitable method to resolve this issue when the caller ID is unsolicited (nil or an empty string)?

...the actual answer here is that "remoteHandle" should never be empty. What your app "should" put there depends on the reason the value is empty/unknown, but "remoteHandle" is the primary mechanism your app uses to tell the user about the call you're reporting. In that context, virtually any value is better than nothing.

Is there some reason you're not just using "Unknown Caller" for this case?

__
Kevin Elliott
DTS Engineer, CoreOS/Hardware

  1. Have there been any other reports of similar behavior?

Nope, not that I'm aware of. To be honest, this is the first time I've ever thought of passing an empty remoteHandle. It's entirely possible you're the first person who's ever tried this, and you're certainly the first person who's asked me about it.

Should this be considered a bug in CallKit for iOS 26?

Yes and no. That is, it certainly shouldn't be behaving the way you're seeing, but I'm also not sure it should allow remoteHandle to be empty at all.

Should I make a new Feedback report?

Yes, please file a bug on this and post the bug number back here.

Having said that...

Is there a suitable method to resolve this issue when the caller ID is unsolicited (nil or an empty string)?

...the actual answer here is that "remoteHandle" should never be empty. What your app "should" put there depends on the reason the value is empty/unknown, but "remoteHandle" is the primary mechanism your app uses to tell the user about the call you're reporting. In that context, virtually any value is better than nothing.

Is there some reason you're not just using "Unknown Caller" for this case?

__
Kevin Elliott
DTS Engineer, CoreOS/Hardware

Hi

Thank you for your response.

Yes, please file a bug on this and post the bug number back here.

Understood. I have posted a bug report. The bug number is FB21409407.

Is there some reason you're not just using "Unknown Caller" for this case?

Are you asking if there's a reason we're not setting "Unknown Caller" in update.localizedCallerName? If so, the answer is as follows:

Answer: To keep the explanation concise, I did not mention this point in the previous descriptions. However, in all the tests I've described so far, update.localizedCallerName has consistently been set to "非通知 (Unknown Caller)" in Japanese.

Best Regards,

Toshiyuki

Are you asking if there's a reason we're not setting "Unknown Caller" in update.localizedCallerName?

No. I was actually asking why you weren't using a CXHandle with a type set to "generic" and a string value to set to "Unknown Caller" (or whatever you wanted).

So, let me actually step back for a moment and clarify the general "roles" these two different properties have:

CXHandle -> This is intended to be the unique identifier for a particular call "source". Phone calls use phone numbers, while other systems might use email addresses or string values (like user names).

CXCallUpdate.localizedCallerName -> The "name" you actually want to show the user.

Note that the mapping between these two values is definitely not one-to-one. For example:

  • The same person can have multiple handles associated with it (for example, because a user has multiple account/phone numbers).

  • Totally unrelated CXHandles may have the same localizedCallerName, either because of simple name overlap (there's more than one Kevin Elliott in the world) or because the name is actually a “catch-all" like "Unknown Caller".

The critical point here is that each CXHandle is used to uniquely identify a particular call "source", which makes passing in this:

update.remoteHandle = nil; 

...somewhat nonsensical, as it's basically equivalent to saying "my app is reporting a call that it doesn't know ANYTHING about". Don't do this.

Similarly, with that context, this:

update.remoteHandle = [[CXHandle alloc] initWithType:CXHandleTypePhoneNumber value:@"0"]; // Set a dummy numerical value

...is also incorrect. Many phone systems use "0" to connect to the phone operator, so using this identifier is the same as lumping those calls in with operator calls. Here is what you should be doing:

  1. If your system is able to differentiate call sources from each other, then you should use a CXHandle that maintains that differentiation.

  2. If your system doesn't/can't differentiate these calls, then you should create your own generic call handle and use that for all of these calls. This ensures that your apps "Unknown Calls" are distinct from other "Unknown Calls".

  3. CXHandleTypePhoneNumber and CXHandleTypeEmailAddress should ONLY be used when you have "real" values of those types. That is, you should not use phone numbers or email addresses as handles unless you have actual values that you could in fact call or email.

Understood. I have posted a bug report. The bug number is FB21409407.

There is a bug here in that you're seeing different behavior vs. iOS 18; however, I would also consider failing to set a valid CXHandle to be a programmatic error. Please provide a valid CXHandle, using the guidance I listed above.

__
Kevin Elliott
DTS Engineer, CoreOS/Hardware

iOS 26: Unable to Transition from CallKit Screen to App when remoteHandle is nil or empty string
 
 
Q