AVAudioSession.RouteChangeReason not detecting connected bluetooth headset/earphones - ios

I'm working on a voice calling app for iOS in Swift and I need to enable auto detection and auto connection of wireless(bluetooth) headsets/earpeaces.
I'm using AVAudioSession RouteChangeReason but it's not detecting when airpods or some other wireless headset is connected via bluetooth. After connecting the device I can even see it in Bluetooth settings that it's connected, but the device is not listed in MPVolumeView as you can see in the screenshoot.
I've been looking for an answer on how to work this out all over the internet and even though there are a lot of similar questions here on StackOverFlow none of them is specifically related to my case so please give me a light on how to solve this.

I just read the code and finally found what was wrong with it. The problem was that I was setting the category more than once so for some reason this was causing wireless headset/earpeace to not connect directly to the app.

.allowBluetoothA2DP is not valid for playAndRecord. You can't record over A2DP. Remove that one. Note that when you do this, if the user is listening to music, the quality is going to drop dramatically (it's possible that AirPods have a proprietary work around for that; I haven't played with them in this mode). In order to record over Bluetooth you have to use HFP, which provides basically "telephone" quality audio.

Related

iOS Is it possible to play audio through speakers and headphones at the same time as of iOS 11?

Is it possible to play audio through speakers and headphones at the same time as of iOS 11? As of right now I am trying to find an app on the store that can do this, so far I have had no luck. I have found a few other threads, but they don't seem to be working for me or they say you can't. Here are a few of the links,
https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html
https://stackoverflow.com/a/35009801
https://apple.stackexchange.com/questions/48534/is-it-possible-to-play-sound-through-both-the-headphone-jack-and-my-internal-spe
iOS: Is it possible to send audio out both headphones and speakers at the same time?
Has anyone tried to play sounds through the speakers and headphones at the same time? Android + iOS
What is really strange is that I cannot find any official documentation saying whether this is possible only that 'The built-in speaker may be used only if no other eligible output ports (USB, HDMI, LineOut) are connected.'
If you need code let me know, but really I am just wondering if it is possible and what is the best route for doing this? The key thing is that I want to do it simultaneously. Thanks.
So after some further review, I would like to save everyone the headaches that I had to go through. Is it possible? Probably, however Apple as of right now does not supply any way to do this. There seems to be no official documentation as to if it can be done (please update this answer if you find some).
The best evidence I have to support my answer would that Apple states 'Important: The built-in speaker may be used only if no other eligible output ports (USB, HDMI, LineOut) are connected.' Also in the solutions posted here, neither method works. I have tested both with iPhone 7 on iOS 11.
NOTE* in the second method I think that the writer was confusing 'channels' with 'routes'. He is changing and selecting the channels (this would be like left, right, or middle speaker for devices that support it), whereas I was looking to change the route (play in the speaker, play in the headphones, HDMI, USB, and ect...). So, in my opinion, NO YOU CANNOT play on the headphones and the speaker at simultaneously (different sounds or the same), unless you are Apple or I am wrong.

How do I detect the presence of an Airplay AUDIO-ONLY device on the network?

I'm unable to find code online (yes, googled aplenty) that details how to discover devices that support the audio only version of Airplay. There doesn't seem to be anything on Apple's developer site either - I spent an hour scouring Google and searching through Apple's documentation. I'm clearly missing something here.
I did find this: "Using External Display", but that only describes how to discover and connect to devices that support Airplay mirroring. They essentially are recognized as another display and you just begin drawing to it.
I also found this: "Providing an AirPlay Picker", but it only describes how to create an AirPlay picker when a device is available, not how to know when a device is available in general (I'd like to do other logic in my app based on audio device availability).
My end goal here is to prevent the user from trying to use an audio-only Airplay device for my app, which requires video support. I planned to show a warning message when 1+ audio-only devices and 0 video-capable devices were detected.
I'm specifically interested in the code for audio-only devices, like the Apple TV 1st gen, AirPorts, and Airplay-enabled speakers. This is particularly important considering that Apple TVs don't look visibly different across generations, and a user might think they can use the app over Airplay when in fact they cannot.
Can someone point me towards the right resource?

Bluetooth Low Energy Emulate Keypress

I am playing around with a TI CC2541 chip, and was wondering if it is possible to send a "keypress" over BLE. This would be similar to the new Muku Shutter for iOS and Android, because I am trying to figure out a way to interface with a mobile device without installing a 3rd party application. Essentially, I would press the button on the CC2541 chip, and then it would emulate a keypress of volume up?
I have been researching for a while now, and all solutions to handle this have included writing a 3rd party application to map the commands in the BLE packet to a system command.
Any help would greatly be appreciated. Thank you!
On iOS the answer is no
Edit:
Exception: You might be able to set up your BT chip as a Bluetooth keyboard.
You could certainly write an app that talks with a remote BLE device and uses an agreed-upon protocol to pass key presses to your app, and then you could interpret those messages using code in your app.
However, Apple enforces a "sandbox" on its apps, and apps are not allowed to interact directly with the system except through very tightly controlled set of APIs. If there is not an official interfere to do something, it is not allowed.
If you were to run on a jailbroken device then the answer would likely be different. I can't help you there however.
Edit:
#OliverMason says in a comment that iOS shutter buttons are apparently single-key BlueTooth keyboards that emulate the volume up button, which the camera app recognizes as a way to trigger a photo. Thus my answer above isn't quite accurate.

iOS app with bluetooth as a trigger

I'm trying to help produce a location-specific iOS app that needs an external trigger to start audio playback when it approaches a given location within the building. (no GPS access)
Has anyone had experience doing something similar? One thought I had was to lay out some bluetooth "transmitters" (like an xbee+arduino) around the building, and if the iPhone's bluetooth was close enough to identify it, it would trigger the audio.
I've never worked with bluetooth or an application of this sort before, so any advice would be much appreciated.
Bluetooth would certainly work, although other methods might, too. The only downside to Bluetooth is that you would either need to work within the APple MFi program for standard Bluetooth or restrict the devices used to the iPhone 4s or later or the iPad 3rd Generation or later so you could use Bluetooth LE (Bluetooth 4.0).
Assuming you can use Bluetooth LE, it's not only possible, Apple demoed one such technology. Once you're signed up as a developer, check out Session 705, Advanced Core Bluetooth, from WWDC 2012. The ending demo is exactly what you're looking for, and the session describes how to do it and provides source code.

iOS WiFi network switching

My company is developing an iPhone accessory that requires a relatively high connectivity rate to the phone. Due to MFi limitations (USB 2 communications in HOST mode fair only around 100KBps), we're looking at hosting a WiFi ad-hoc network on our accessory, and connecting to that network with the iPhone's WiFi.
This could really work out great in many regards, except we can't seem to find an (Apple-approved) way to programmatically switch the iPhone's WiFi connectivity. Ideally the app would automatically connect to the accessory's network when visible, and then re-connect to the user's preferred network when not visible/needed.
We are aware of the MobileWiFi framework, which fits the technical bill, but won't pass Apple's approval process.
Can anybody suggest a way to achieve our goal? Perhaps there is a system model view that can be called up to allow the user to switch WiFi networks without directly using private APIs?
Creative solutions welcome!
Hate to say it, there's really no way to do it. I can think of two easy workarounds.
1. Make it available on Cydia for jailbroken devices. AirServer just did this.
2. Less elegant, have UIAlertView with a switch over to the wifi pane of the Settings app that is shown when the peripheral is connected and disconnected. A lot like the location settings prompt.
3. Make an Android app!
Apple, you're a pain in the ass.
Sorry to be the bearer of bad news, but the definite answer is no. The main problem with your approach wouldn't even be Apple's approval process, but the inability to access the Internet while connected to your device. iPhone doesn't even try using cellular data when connected to wifi, being that wifi connected to the Internet or not.
You could file a bug report requesting these features and pray Apple hears you which will probably never happen in this case.
I would suggest going bluetooth, but if usb is not fast enough for you, guess that's not an option either.
That pretty much puts you back to square one and going usb. Or distributing your app via Cydia.

Resources