Getting continuous disconnects with iOS 16

Our product has been in production for over two years now and works fine. However I am seeing continuous disconnects with iOS 16 and customers are reporting the same thing. Advertising and connection appear normal, then the nRF appears to drop the connection after 2-3 seconds. 

Before I start debugging this I wanted to ask if anyone was aware of the problem. My guess it Apple changed something in the connection parameters and the nRF device does not like it.

Parents
  • In our firmware we configure the connection interval (min and max) to 15ms. This was accepted by iOS15 however iOS 16 is sending 24ms (sometimes but not always) which is rejected by Softdevice after 3 retries. This triggers the event BLE_CONN_PARAMS_EVT_FAILED which triggers a disconnect in our app. 

  • Hi. 

    Have you made sure that all the connection parameters match the requirements from the Apple accessory design guidelines?

    https://developer.apple.com/accessories/Accessory-Design-Guidelines.pdf 

    Br, 
    Joakim

  • They don't. We are requesting connection interval with min=15ms and max=15ms which was always accepted by iOS until iOS 16. However, in section 41.6 of Apple's accessory design guidelines there is a note that says some devices may "scale up to 30ms" and this is what we are seeing now in iOS 16 for the first time. To be compliant we changed max=30ms and now all is well. 

    But this is only half of the reason why our system went into a loop connecting/disconnecting. Our project was based on one of the blePeripheral example projects. When the BLE central sends us connection parameters this triggers a call to on_conn_params_evt() with the event BLE_CONN_PARAMS_EVT_FAILED. The example project handles this by forcing a disconnect. 

    It is the responsibility of the application designer (myself) to know how the application will behave in cases like this one. However I did not know what this event means or what would trigger it. After using this example project for 3+ years now I'm still not sure where I would learn about critical events such as this one. 

  • Hi mchartier,

    When you said "all is well" with max=30 ms (and I assume min=15), does that mean you are granted a 15 ms interval, or that you don't get disconnects, or both?

    Also, when you replied "they don't" to the question of if you are following the Apple developer guidelines, which requirements don't you follow?  To me, the guidelines allow min/max=15 to be requested.

    By the way, you might want to observe what happens if you restart the phone and request 15/15,

Reply
  • Hi mchartier,

    When you said "all is well" with max=30 ms (and I assume min=15), does that mean you are granted a 15 ms interval, or that you don't get disconnects, or both?

    Also, when you replied "they don't" to the question of if you are following the Apple developer guidelines, which requirements don't you follow?  To me, the guidelines allow min/max=15 to be requested.

    By the way, you might want to observe what happens if you restart the phone and request 15/15,

Children
  • See this note in section 41.6:  

    • If an accessory requests both an Interval Min and Interval Max of 15 ms, some devices will scale the interval to 30 ms to balance power and performance constraints.

    In my testing with iOS 16 when I request min=15 and max=30 I always get 24ms connection interval. Same results when I restart the phone. Your results may vary and Apple is not going to disclose their algorithm for "scaling" the connection interval.

Related