[swift] Core Motion을 이용한 음악과 움직임의 상호작용 앱 개발

Core Motion은 iOS 기기의 가속도, 회전율, 오리엔테이션 등과 같은 모션 데이터에 대한 액세스를 제공하는 프레임워크입니다. 이를 활용하여 음악과 움직임을 상호작용시킬 수 있는 앱을 개발해보겠습니다.

1. Core Motion 프레임워크 추가하기

먼저, 프로젝트에 Core Motion 프레임워크를 추가해야 합니다. 이를 위해 프로젝트 네비게이터에서 프로젝트 파일을 선택한 후, “Build Phases” 탭에서 “Link Binary with Libraries” 섹션을 찾습니다. “+” 버튼을 클릭하여 Core Motion 프레임워크를 추가합니다.

2. 모션 데이터 가져오기

Core Motion에서 제공하는 CMMotionManager 클래스를 사용하여 모션 데이터를 가져올 수 있습니다. 먼저, CMMotionManager 객체를 생성하고, startDeviceMotionUpdates(to:withHandler:) 메서드를 사용하여 모션 데이터를 업데이트할 콜백 핸들러를 설정합니다.

import CoreMotion

let motionManager = CMMotionManager()

if motionManager.isDeviceMotionAvailable {
    motionManager.startDeviceMotionUpdates(to: .main) { motionData, error in
        // 모션 데이터 처리
    }
}

3. 모션 데이터 처리하기

모션 데이터 처리를 위해 startDeviceMotionUpdates(to:withHandler:) 메서드의 콜백 핸들러에서 모션 데이터를 처리하는 로직을 구현합니다. 이 예제에서는 가속도 값의 변화에 따라 음악 재생을 제어합니다.

motionManager.startDeviceMotionUpdates(to: .main) { motionData, error in
    guard let acceleration = motionData?.userAcceleration else {
        return
    }
    
    let threshold: Double = 0.5
    
    if acceleration.x > threshold || acceleration.y > threshold || acceleration.z > threshold {
        // 음악 재생
    } else {
        // 음악 일시정지
    }
}

이 코드는 가속도 값의 어느 한 축이 임계값(threshold)을 초과하는 경우 음악을 재생하고, 그렇지 않은 경우 음악을 일시정지합니다.

4. 음악 재생 및 제어하기

모션 데이터에 따라 음악을 재생하고 제어하기 위해서는 AVFoundation 프레임워크를 활용할 수 있습니다. 먼저 AVAudioPlayer 객체를 생성하여 음악 파일을 로드하고 재생할 수 있습니다.

import AVFoundation

var audioPlayer: AVAudioPlayer?

func playMusic() {
    guard let soundURL = Bundle.main.url(forResource: "music", withExtension: "mp3") else {
        return
    }
    
    do {
        audioPlayer = try AVAudioPlayer(contentsOf: soundURL)
        audioPlayer?.prepareToPlay()
        audioPlayer?.play()
    } catch {
        print("음악 재생 실패: \(error.localizedDescription)")
    }
}

func pauseMusic() {
    audioPlayer?.pause()
}

이제 음악 재생 및 일시정지 기능을 음악 제어 코드에 추가하여 완성할 수 있습니다.

5. 앱 테스트 및 디버깅

앱을 테스트하고 디버깅하는 동안에는 Xcode의 디버깅 도구를 활용할 수 있습니다. 예를 들어, 디버그 영역에서 motionData 값을 출력하여 현재 가속도 값을 확인할 수 있습니다.

motionManager.startDeviceMotionUpdates(to: .main) { motionData, error in
    print(motionData?.userAcceleration)
    
    // 모션 데이터 처리
}

이제 Core Motion을 활용하여 음악과 움직임을 상호작용시킬 수 있는 앱을 개발하는 방법에 대해 알아보았습니다. Core Motion을 더 자세히 알고 싶다면 Apple 공식 문서를 참고해보세요.