내 앱에서 Microphone과 Bluetooth 연결을 하고 싶다면 어떻게 해야할까? BLE가 아닌 Bluetooth Classics으로 말이다! 결론부터 말한다면 어려울 수도 있다.....
일단 나는 위에 언급한 그대로 마이크와 블루투스 연결을 하고 싶었기 때문에 열심히 구글링을 해보았다. 그러다가 Stackoverflow 질문글인 iOS: pair a Bluetooth peripheral in my app, instead of using Settings 를 발견했다. 이 질문글에 들어가면 질문자가 아주 친절하게 Sony Application가 어떻게 블루투스 연결을 하는지 스크린샷을 찍어 올린 것을 볼 수 있다.
~예상 뷰~

간단하게 설명하자면, Sony App에서 디바이스를 연결하면 Picker view가 뜬다. Picker view에서 나의 디바이스를 선택하면, System Settings의 Bluetooth에서 연결된 것을 확인할 수 있다는 것이다. 이 방법에 대한 구현을 물어보는 질문이었다.
저 가운데의 Picker view는 External Accessory Framework 에서 제공해주는 메서드이다.

앱에서 Device와 Bluetooth accessory가 페어링하는 것을 허용하는 Alert를 보여주는 메서드다. 공식 문서에서 보는 것과 같이, 동기적으로 Picker view를 띄워주지만 비동기적으로 뜨게 할 수도 있다. (자세한 건 공식 문서에서..) 사용자가 Picker view에서 악세서리를 선택해 페어링이 되면 EAAccessoryManager의 connectedAccessories: [EAAccessory]가 업데이트 된다. 그러므로 우리는 EAAccessory의 connectedAccessories로 연결되어 있는 기기들을 확인할 수 있다는 것이다! 우오오 😲
그러면 External Accessory Framework를 어떻게 사용하는지 알아보도록 하자!

이 프레임워크는 Apple Lightning connector나 Bluetooth로 연결이 되는 악세서리와의 통신을 위한 것이다. 나한테 블루투스로 연결이 가능한 디바이스가 있다면, 이 프레임워크를 써서 연결을 헨들링할 수 있겠지? 헤헤! 라는 일차원적인 생각을 했다면 아주 우습게 됐다. Overview를 조금 읽어보면, 이런 얘기가 나온다.
Use the External Accessory framework to set up and manage a connection to an MFi accessory your iOS app supports. → 너의 iOS app이 지원하는 MFi 악세서리와의 연결을 세팅하고 관리하려면 이 프레임워크를 쓰렴!
잠깐만... MFi가 뭔데...?
MFi의 풀네임은 Made For iPhone/iPod/iPad 등등... 으로 Apple의 라이센스를 얻은 하드웨어 제품을 말한다. 자사의 하드웨어가 MFi 프로그램에 가입되어 있다면, 당신(이 개발자라면)은 Apple의 HomeKit, AirPlay audio, Find My, CarPlay 등과 같은 다양한 기능을 함께 제공해줄 수가 있다! 오오 ~~ (o.o)b

사이트에 들어가면 정확히 어떤 프로그램인지, 그리고 누구에게 필요하고 누구에겐 필요하지 않고, 어떻게 가입할 수 있는지 자세한 사항들이 나와있다. 하지만.... 우리는 지금 그냥 마이크를 앱에서 연결하고 싶었을 뿐인데! 이렇게까지 해야하나...? 하지만 이 글은 무조건 마이크를 앱에서 연결하고 싶은 사람들, 또는 마이크가 디바이스와 연결이 되어있는지를 알고 싶은 사람들을 위해 쓰여졌기 때문에 우리는 좀 더 알아보도록 하자...!! 🤣🤣🤣
이렇게 된 이상 MFi 프로그램에 가입해야할 것 같은 기분이 드는데.....
좀 더 리서칭을 하다보니 stackoverflow에서 나와 비슷한 고민을 하는 사람의 질문글을 보았다. 답변해준 사람은Bluetooth and iOS – Use Bluetooth in your iPhone apps 라는 아티클을 첨부하였다. 이 아티클은 2012년도의 글이기 때문에 글쓴이가 제시한 솔루션은 동작하지 않는다. 연결된 링크들도 404 에러가 뜨기 때문에... 하지만 MFi에 대한 정보가 있다.

하하.. 자세한 금액도 나와있지 않고, 작은 회사에는 적합하지가 않다고 한다. 게다가 MFi를 등록하는 페이지를 살짝 보니, 조건에 부합하는지 확인하는 것 같더라... 그렇다는 것은 엄청 긴 심사기간이 있을 것이고, 심사 후 리젝이 될 수도 있다는 것이다! 😱 게다가 내가 다니는 회사는 스몰하기 때문에... 아무래도 MFi 등록하는 것은 어려울 것이다.
그리고 저 밑에 써있는 다른 방법들은.... 되긴 되는데 출시 못할 거야! 아니면 이러이러한 제약이 있어! 라고 하기 때문에, 이걸 읽고 있는 YOU의 상황에 적합하다면 다행이지만, 아니라면.... 아래의 내가 작성한 딱히 방법같지도 않은 방법을 따라해보자.
그렇다면, 우리 망한 건가? 우리... 어떻게 하면 좋지?!
라고 생각한 나는 다른 방법을 찾아보았다. 그래, 앱에서 연결은 하지 못하더라도 최소한 연결이 되어있는지를 확인하고 싶어! 😭
난 꽤 오래 리서칭을 했지만, 생각보다 아주 쉬운 방법이 있다. 우리가 지금 연결하고자 하는 디바이스가 바로 Microphone이잖아! 앱에서는 Audio Session으로 어디서 Input이 들어오는지 알 수 있으니까, 이걸 이용하면 된다!

portType을 따로 필터링하지 않고 session으로부터 받을 수 있는 값을 모두 출력해보면, 가장 기본으로 MicrophoneBuiltIn 타입의 iPhone mic가 나올 것이다. 그리고 우리가 찾는 것은 bluetooth에 연결된 내 마이크니까, .bluetoothHFP 로 필터링한다면 우리 마이크를 잘 찾을 수 있을 것이다!
하지만 여기서 아직도 풀지 못한 미스테리는, 마이크의 이름이 바뀌면 portName 또한 바뀌어서 들어온다. 그렇다면 AudioSession으로 받을 수 있는 정보의 유효한 값이 정해져있을까??? 그건 다양한 기종의 iPhone 에서 테스트한 후에 다시 작성해보겠다!
잘못된 정보나 새로운 방법 등 다양한 의견은 코멘트로 남겨주시길 =3=3
오늘은 끝~
+) 여기까지 읽다보면 "아니, 우리 아요 CoreBluetooth가 버젓이 있는데 왜 이런 노가다를 해야하는 거지?"라는 생각이 자연히 들 것이다. BLE 통신이라면 나도 CoreBluetooth를 쓰겠지만, 내가 원하는 것은 Microphone과의 연결이고 Microphone을 연결해야 하는 주목적은 당연 Recording이다! 슬프게도 Recording에 필요한 A2DP profile은 BLE의 영역이 아니다. 또한, iOS는 BLE 이외의 다른 profile들은 제공하지 않는다. 개발자 권한은 BLE에만 있을 뿐, Bluetooth profile에는 없다! CoreBluetooth는 일반적인 Bluetooth Classic이 아닌, BLE만을 다룰 수가 있다. 그것이 내가 리서칭을 열심히 한 이유인 것이다~ 휴우~ 😓 (reference)
+) 또 누군가는 "아니... 이거 진짜야? External Accessory Framework 정말로 MFi 아니면 동작 안하는 거야?" 라는 의문이 들 수도 있다. 마치 나처럼! 왜냐하면 MFi에 대한 내용은 Overview에 쓰고 정작 한줄요약에서는 그런 내용 없었으니까! (뻔뻔) 그런 사람들은 Bluetooth Classic with iOS ExternalAccessoryFramework 를 읽어보도록 하자. 이 질문자는 직접 Apple Techinal Developer Support에 질문해서 답을 얻었다. 모두 의구심에서 벗어나서 다른 방법을 찾아보도록 하자!