I am developing a Bluetooth pointer device to control an iPad using HID. Most functionality works well, including mouse movement and button presses. However, I am encountering a strange issue with button releases. For the HID descriptor for the iPad I defined the following:
0501
0902
A101
8503
0509 // Mouse Buttons
1901
2902 // 2 buttons
1500
2501
9502 // Report count for two buttons
7501
8102
9501
7506 // Padding
8103
0501
0901
A100
1500 // Min value
26FF7F // Max value (0...32767)
0930
0931
7510
9502
8102 // Absolute coordinate pointer
C0
Do you see an issue with the descriptor?
Example packages sent over bluetooth:
0xA103 01 4F3A FB50 // 01 is a left button click, works well, an icon is clicked on iPad.
0xA103 00 4F3A FB50 // 00 should be a left button release, package is sent and received, but button is NOT released, but held on the iPad! The mouse coordinates are updated well, however, I expect the button to be released when sending 0xA103 00 4F3A FB50, but it is held down instead.
Perhaps there is a special requirement for iOS to make this work? It is close to be fully functioning.
Accessories
RSS for tagDiscuss designing and creating accessories that complement Apple devices.
Posts under Accessories tag
21 Posts
Sort by:
Post
Replies
Boosts
Views
Activity
Hi there,
we're developing a Bluetooth LE device and are using the AccessorySetupKit to connect the device to our iOS application. We are a registered member of the Bluetooth SIG and are advertising our company id over BLE. Setting up the device works on most iPhones we've tested with, but not all. Here's an example of some of the devices we've tested:
iPhone 12 mini: Not working, tried both iOS 18.1.1 and 18.1.1
iPhone 13 mini: Working, iOS 18.1.1
iPhone 15: Not working, iOS 18.1.1
iPhone 15: Works now, didn't work a few weeks ago
iPhone 15 Pro: Works
iPhone 16 Pro: Works
Looking through the logs of the iPhone 12 mini while scanning I see some things that might be related in the logs (I've removed potentially identifying data). It seems to me that it's detecting the device, but not showing it in the UI:
error 11:43:54.792877+0100 bluetoothd canSessionScanForMFGRData <our company ID> <private> there:1
default 11:43:54.795685+0100 deviceaccessd ### appBundleHasASKEnabled <our app bundle> supports Bluetooth
default 11:43:54.795730+0100 deviceaccessd ### _reportDiscoveredBTDevice DADevice: ID <removed ID>, name '<ASPickerDisplayItem.name>', btID <removed ID>, flags AccessorySetup, type Hi-Fi Speaker <CBPeripheral: 0x4b8164540, identifier = <removed ID>, name = (null), mtu = 23, state = disconnected> has no bluetooth name
We get no callbacks while the picker UI is displayed. Opening the picker on another device at the same time immediately shows our accessory.
This seems like a bug in the AccessorySetupKit too me, but I'm not sure. Could we be doing something wrong?
My test was conducted by changing the pink dice to have a 16 bit UUID using the ASKSampleAccessory app. Afterwards, I ran AccessorySetupKit Picker in the ASKSample app, but Pink dice was not found.
We confirmed that Pink dice was searched well in other apps.
Does AccessorySetupKit not support 16 bit UUID?
AccessorySetupKit Sample code : https://developer.apple.com/documentation/AccessorySetupKit/authorizing-a-bluetooth-accessory-to-share-a-dice-roll
Hello, I've been working to implement PTT in the way recommended by the documentation. The main issue is that the bluetooth methods are opaque, so I cannot solve for what I need. The result will be that I will have to resort to hacky approaches that the PTT framework seems to be intended to solve (playing silent clips, playing custom notification sounds, having long running background audio sessions).
I am testing with Anker soundcore mini as well as airpod pro.
Here's the issue: there are 2 very different behaviours depending on whether I'm using a call/fullDuplex session and a halfDuplex session.
halfDuplex
Anchor mini
Current behaviour
long press activates siri
pressing again after siri is active, starts transmission
long press activates siri again
pressing again after siri is active, stops transmission
pause/play routes to the ongoing media session and plays music
Expected behaviour
play/pause should map to transmit/stopTransmit
IF I have to use long press, it should at least not trigger siri
AirPod pro
Current behaviour
long press changes noise cancellation
pause/play routes to the ongoing media session and plays music
Expected behaviour
play/pause should map to transmit/stopTransmit
fullDuplex/call
Anchor mini:
Current behaviour
long press activates siri
pressing again after siri is active, starts transmission
long press activates siri again
pressing again after siri is active, stops transmission
pause/play routes to the ongoing media session and plays music
Expected behaviour
play/pause should map to transmit/stopTransmit
IF I have to use long press, it should at least not trigger siri
AirPod pro
Current behaviour
long press changes noise cancellation
pause/play maps to mute/unmute (even if media is playing)
Expected behaviour
This makes sense for call behaviour, I wish it worked this well for PTT
The intention here is to be able to fully interact with a channel hands-free. The current API seems to make that impossible. Is that by design? Reading all the docs seems to suggest its intended for transmit/stopTransmit to be doable just with the play/pause buttons, but even apple hardware seems to not support that.
PLATFORM AND VERSION
iOS
Development environment: Xcode 15.4, macOS 14.6.1
Run-time configuration: iOS 15.8.2
DESCRIPTION OF PROBLEM
The only test phone that I have available is an iPhone 7 running iOS 15.8.2 (the latest iOS available for that device). When I connect the phone to XCode, it displays "Preparing Richard Cunningham's iPhone" indeterminately. I have tried many things including downloading new device support files, adding provisioning profiles, downgrading XCode, restarting both devices, wiping the phone, and setting the target SDK to match that of the test device. Despite all of this, XCode continues to display "Preparing ..." indeterminately. The issue can be found here on the developer forums:
https://forums.developer.apple.com/forums/thread/692230
STEPS TO REPRODUCE
Create a blank XCode iOS project (Multiplatform App, iOS App, it doesn't seem to make a difference) and connect the iPhone 7 (15.8.2) to the laptop. Select "Trust" on the phone to initialize the connection, and observe XCode display "Preparing iPhone" in the top bar. Cmd + Shift + 2 to open the Devices Window, and see "iPhone is busy: Preparing iPhone". Allow this to continue for some time (I have left it for over a day) and observe that there are no changes.
I am having difficulty figuring out two indicators for a custom piece of battery hardware.
Firstly, on the home screen, scrolling all the way to the left in the widget screen, you can see the battery for connected wireless devices, electronic pencils, etc.
Additionally, when you use Apple battery packs, you can see the battery for it on the top right of your phone
I am wondering where I should look to see how I could integrate both of these. I have searched the documentation for a while, and I am having a hard time knowing where to start. If anyone can point me to something, it would be very appreciated. Thank you!
Previously working! Now Broken. I developed a test application to establish a connection with a BLE peripheral. The application successfully connected to the peripheral, but it did not establish SMP Pairing procedure.
Previously, I was able to successfully pair with the devices during the Beta phase. However, currently, I am not receiving the OS prompt to grant Bluetooth permissions. I understand that this may be a newly introduced feature in the recent releases.
Could you please provide guidance on whether there is a specific flag that needs to be enabled or added elsewhere, or if this is a bug with the ASK?
PLEASE HELP!!!
I'm attempting to use AVExternalStorageDevice.requestAccess on iOS 18 using Xcode 16.
When calling requestAccess, a dialog does appear, but the completionHandler closure is never called to indicate whether access was granted. If using the async version, the function just never returns.
Calling requestAccess also results in a mediaServicesWereReset (-11819) error without fail.
Supposedly, "the system only presents the dialog to a person the first time your app calls the method." That also doesn't appear to be the case. The dialog appears every time requestAccess is called, regardless of previous invocations and whether "Allow" or "Don't Allow" was selected.
The dialog itself says "You can change this in Privacy settings." I cannot find this permission anywhere in the Settings app, neither under Privacy & Security nor under the app-specific settings page.
Has anyone else experienced these issues? Am I missing something here? I did suspect permissions issues and tried adding a NSRemovableVolumesUsageDescription entry to the app. This did not appear to change anything.
What is the maximum power-per-hour can an iPhone provide for an accessory connected to the iPhone to its Lightning port?
It would be a great innovation to incorporate a Card Reader into both iPhones and Apple Watches. The user could open the card reader app on his watch or phone, enter the amount to be paid into his nominated bank account (eg £15) ready for the purchaser/customer to tap his card to make the contactless payment. It would simplify my everyday life enormously because I hardly ever carry cash these days.
Apple developer support could not answer my question which is the following:
How are Matter developers supposed to test accessory pairing, accessory communication and accessory discovery if the Console logs provided by Apple (iOS, MacOS, iPadOS) are encrypted, incomplete or straight up non-existent.
Current issue is mDNS-SD discovery, pairing and PAKE requests initialisation. Impossible to figure out why X or Y stopped on the Apple Device.
Chip-tool (provided by PROJECT-CHIP) acts 100% differently than iOS (Home) or iPadOS(Home).
Thank you
I have created a sample iOS project where I am attempting to discover BLE peripherals using AccessorySetupKit in iOS 18.
I am able to discover the BLE accessory and retrieve the CBPeripheral. However, when I attempt to connect to the CBPeripheral, the connection neither succeeds nor fails. I have noticed that the BLE peripheral I am trying to connect to uses a Resolvable Private Address (RPA). When I repeat the same process for a BLE peripheral with a Static Device Address (SDA), I am able to connect successfully.
Could someone please suggest why I am unable to connect to the BLE peripheral with an RPA when it is discovered using AccessorySetupKit?
Hi!
I develop my own NFC reader as a sole proprietor.
I would like to get the Apple VAS and Apple Access Pass certificates for my reader. How can I do that? Should I apply for Apple’s MFi program or it’s just for bigger organizations/companies?
Are there any way?
Thank you!
Daniel
Currently (as of iOS 18 dev beta 4), if a BLE device supports RRA and the MAC address changes while the ASAccessorySession's picker is displayed a second entry is added to the picker (usually without a friendly name). Once in this state one picker item will work, the other will display a "Cannot Add Accessory" error. Are there any plans to improve this user experience in AccessorySetupKit or do you have any recommendations on how to better handle this use case?
We currently have a work around for this in our existing pairing flow but it does not translate to ASDiscoveryDescriptor as it requires comparing previous BLE advertisements.
I am trying to setup AccessorySetupKit.
I have several questions:
Is it possible to setup classic Bluetooth accessory?
In documentation you say:
"Each display item’s ASDiscoveryDescriptor needs to have a bluetoothCompanyIdentifier or bluetoothNameSubstring, and at least one of the following accessory identifiers:
bluetoothServiceUUID
Either ssid or ssidPrefix, which needs to have a non-zero length. It’s an error to supply both SSID and SSIDPrefix, and your app crashes if you do.
A bluetoothManufacturerDataBlob and bluetoothManufacturerDataMask that are the same length.
A bluetoothServiceDataBlob and bluetoothServiceDataMask that are the same length."
Is it possible to have only bluetoothCompanyIdentifier and UUID ?
Hi,
we are developing a carpooling app. In our app, once, the car driver enters his car, the app connects automatically in the background to the car. The connection to the car is done either via CarPlay or Bluetooth. Currently, when setting up the app, the user has to define how the connection to the car is established. He can choose between three options: either 1)CarPlay, or 2)Bluetooth or 3)both.
Is it correct, that starting with the AccessoyKit of IOS18, the user will only have to choose the device, he wants the app to be connected with? However, he no longer has to define the kind of connection, i. e. CarPlay or Bluetooth by which to connect to the device?
So in future, users will be able to connect to their Car, but they do not even know, whether the connection is via Bluetooth or CarPlay?
If that is the case, it would make our lives much easier;)
Many thanks for your help!
Greets, Simon
When I connect a speed and cadence sensor to my Apple Watch in Bluetooth settings I expect to see the following HKQuantity types in
workoutBuilder:(HKLiveWorkoutBuilder *)workoutBuilder
didCollectDataOfTypes
HKQuantityTypeIdentifierCyclingSpeed, HKQuantityTypeIdentifierDistanceCycling, and HKQuantityTypeIdentifierCyclingCadence.
However, after starting an HKWorkoutSession I only get updates for HKQuantityTypeIdentifierDistanceCycling.
I know that these metrics are being updated because the Apple Workout app displays them.
I have authorized my app to read and write these quantity types, so what could I be missing here? Are these quantities only available to the workout app, as I haven't found a third-party app that sees these metrics when the sensors are connected this way?
Hello everyone, I'm trying to configure my WAC device trough an App. This App finds the device without problems using startSearchingForUnconfiguredAccessoriesMatchingPredicate but when I try to use configureAccessory method I get only 3 messages in Xcode and nothing happens.
These messages are:
2024-03-14 12:55:56.261969+0000 App[1394:380785] ### WAC: -[EAWiFiUnconfiguredAccessoryBrowserManager configureAccessory:withConfigurationUIOnViewController:]_block_invoke_3:368 Other Region SKU
2024-03-14 12:55:56.266191+0000 App[1394:374248]
### WAC: _notificationCleanup:42 responseFlags: 3
### WAC: _notificationCleanup:43 responseFlags: 3
For me they don't look like an Error but would be nice if someone could give me some advice on this, I didn't find nothing about it.
Thanks in advance!
Hello,
I’m trying to use the Frontline Teledyne Lecroy BPA100 Bluetooth Protocol Analyzer with Apples ATS v7.15.0 to capture Bluetooth connections between our device and another companies radio (or troubleshoot the lack thereof more accurately).
While the probe physically doesn’t display any signs of life, it does seem to get detected by ATS when I plug it in as the field in ATS Capture “BPA 100/600” autofill’s with “FBA41199”.
But it tells me this
When I do try to reconnect the probe ATS crashes.
Is the device broken?
In my code,i use GCMouse to detect mouse event and it works fine in iOS 16, but while i upgrade my iPhone to iOS 17.3.1, GCMouse doesn't works. But it works fine in IPad 17.3.1. How can i detect mouse event i iOS 17.3.1?