[Swift] WWDC22 Enhance voice communication with Push to Talk

 

안녕하세요. 미닛메이드 Minnit 입니다😋

 

이번 6월 둘째 주에 열린 애플 세계 개발자 회의 WWDC22 !

iOS16에서 볼 수 있는 새롭고 업그레이드된 기능들 중에

제가 관심 있는 영상을 모아 모아 정리해보았습니다 ~

 

이번 영상은 애플워치에서만 제공했던 "워키토키" 기능을

iPhone에서도 서비스할 수 있게 API 제공을 시작한다고 합니다 

간단하게 요약해보겠습니다 🤙🏻

 


PushToTalk Framework 란?

iOS의 새로운 오디오 커뮤니케이션 class로, iOS 앱에서 워키토키 통신을 통해 빠른 커뮤니케이션 진행하도록 도와주는 Framework이다.

위에서도 말했지만 한마디로 애플워치 watchOS 5.3 이후 사용할 수 있는 앱 서비스인 "워키토키" 를

앱에서도 구현할 수 있게 Apple에서 만들어준 서비스입니다 !

이름하여 Push To Talk Framework  (a.k.a PTT)

 

PTT의 서비스 방법

1. session join Button( 채널 입장 버튼)을 통해 채널에 참가합니다

2. 채널에 참가한 사용자는 하루 종일 이 채널 안의 사용자들과 오디오를 송수신할 수 있게 됩니다

3. 마이크 버튼(Talk Button)을 누른 채로 말하게 되면, 이 채널에 들어와 있는 다른 사용자들에게 내 오디오가 송신됩니다

4. 핸드폰이 잠겨있는 상태 혹은 Background 상태에서도 alert이 뜨기 때문에 쉽게 이용이 가능합니다

(왼) 잠금화면에서 왼쪽 상단 파란색 Fill 클릭 시 (오) Background 상태에서 오디오 송수신시

서비스 사용방법은 우리가 애플워치에서 사용했던,

혹은 다른 어플에서 사용했던 워키토키의 기능과 같습니다

워키토키는 전화와는 다르게 무전기 방식인데,

무전기는 우리가 아는 것처럼 버튼을 누르고 있는 동안에만 내 오디오가 송신되고,

버튼에서 손을 떼면 내 오디오가 상대방에게 송신되지 않습니다

이 방식과 동일하게 앱에서는 Talk 버튼을 누른 상태에서 이야기하면 내 목소리가 오디오가 송신되고,

Talk 버튼에서 손을 떼면 송신이 끊기는 형식으로 구현되었습니다

 

PTT의 장점

첫 번째, 배터리 절약이 가능합니다 🔋

PTT는 Apple Push Notification service token(APNs Token) 을 제공해서

Session 진행 동안 백그라운드에서 앱을 깨워서 오디오 송신/수신이 가능합니다

이 말은, 오디오를 송수신하지 않을 때는 앱이 자고 있어도 괜찮기 때문에

배터리 절약에 효율적이라는 말이겠죠 .. !?

 

두 번째, 투명성을 지원합니다 😎

채널에 접속한 누군가의 오디오가 재생될 때는 말하는 사람을 표시하여

사용자에게 투명성을 제공해줍니다 !

 

기본 설정 순서

1. push to talk background mode 활성화

2. push to talk 기능 추가하기

3. push notification 기능을 추가

(audio 재생하기 위해 너의 앱을 백그라운드 모드에서 깨워주는 역할)

4. 유저한테 microphone permission 요구

(info.plist 에 작성)

 

서비스 개발 및 Delegate 호출

1. channelManager를 생성자를 만들어줍니다

class func channelManager(
    delegate: PTChannelManagerDelegate,
    restorationDelegate: PTChannelRestorationDelegate,
    completionHandler: @escaping (PTChannelManager?, Error?) -> Void
)
  • channel manager delegate랑 channel manager restoration delegate 를 정의해줘야 합니다
  • 이 생성자는 appdelegate의 didFinishlaunchingWithOptions method에 작성하면 됩니다

2. requestJoinChannel 함수를 이용해 채널에 참여하기

  • 채널을 확인할 수 있는(=고유한) UUID와 채널 설명을 제공해야합니다
  • 한 번에 하나의 채널만 활성화 가능합니다
  • 채널 설명에는 이미지랑 이름이 들어갸아합니다
  • foreground 상태에서만 join 이 가능합니다

3. 만약 채널 참가에 성공했다면

  • PTChannelManagerDelegate의 didJoinChannel이 호출되며 join 된 것을 알 수 있습니다
  • receivedEphemeralPushToken에서 APNs push token을 받을 수 있습니다

4. 만약 채널 참가에 실패했다면

  • failedToJoinChannel이 호출되면서 실패를 알려줍니다
  • 다른 채널에서 이미 활동중인데 또 다른 채널에 들어가려고 했을 때도 실패로 기록됩니다

5. 채널에 있다가 나갈때

 

전송 과정 및 호출 Delegate 순서

  • requestBeginTransmitting : 내가 참가해 있는 채널로 오디오 전송 시작할 때(= 내가 말할 때) 사용
    • 앱이 foreground 상태일 때 혹은 주변 블루투스 장치 변화에 반응했을 때( 블루투스 장치가 연결 혹은 해제됐을 때 앱이 깨어날 수 있어서인듯!)사 사용하는 함수
    • failedToBeginTransmittingInChannel : 전송 실패 시 호출되는 delegate 함수
    • didBeginTransmittingFrom : 전송 시작을 알리는 delegate 호출
    • didActivate: 오디오 세션이 활성화 되었음을 알리는 delegate 호출
    • 이 함수들은 사용자가 이제 recording을 시작해도 된다는 시그널입니다
  • stopTransmitting : 전송 stop시 (= 말 끝났을 때) 사용
    • failedToStopTransmittingInChannel : 전송 종료 실패 시 호출되는 delegate 함수
    • didEndTransmittingFrom : 전송 종료를 알리는 delegate 호출
    • didDeactivate : 오디오 세션 비활성화를 알리는 delegate 호출
    • 전송 중일때 핸드폰에 전화오거나 페이스타임이 와서 오디오가 중단되는 경우도 있기 때문에 이런 경우에 대해서도 handling필요

New APNs push 작동

나의 push to talk 서버가 다른 유저가 전송한 새로운 음성을 가지고 있을 때,

( = 채널에 있는 다른 유저가 말했을 때)

이것은 유저에게 채널 입장할 때 받은 device push token을 사용해서 push to talk notification을 보내게 됩니다

앱이 push notification을 받았을 때, 이것은 반드시 프레임워크에서 활동중인 speaker에게 알려주기 때문에

시스템이 앱의 오디오 세션을 활성화하고 재생을 시작할 수 있습니다

 

APNs push type을 request header에 “pushtoken”으로 설정한 후

APNs topic header를 앱의 번들 idenfitier에 “.voip-ptt” 를 뒤에 붙여서 설정합니다

 


효율에 진심인 애플..🍎

애플워치에서만 제공해주던 워키토키 기능을 폰에서도 사용할 수 있다니

이걸로 재밌는 기능을 많이 만들어볼 수 있지 않을까요?ㅎㅎ

물론 안드로이드 사용자와는 함께 session에 참가할 수는 없겠지만..

라이딩 어플에서 워키토키 기능을 많이 사용한다고 알고 있는데,

정식 버전이 나오면 한번 구현해보고 싶네요!

 

혹시 더 궁금하신 부분이 있다면

댓글 남겨주세요 ! 👐🏻

또한, 요약된 부분이 있기 때문에

꼭 영상을 보시는 것을 추천드려요 ㅎㅎ

 

애플 WWDC22 - Enhance voice communication with Push to Talk의

원본영상은 여기 있습니다 ! 

 

 

Enhance voice communication with Push to Talk - WWDC22 - Videos - Apple Developer

We're coming in loud and clear to help you bring walkie-talkie communication to your app — over! Discover how you can add prominent...

developer.apple.com