Programming/iOS

[iOS/Swift] 흔들어서 QR체크인 실행하기 파헤쳐보기 (motionShake)

devssun 2021. 10. 15. 00:00
728x90
반응형

흔들어서 QR체크인 실행하기 파헤쳐보기

코로나 때문에 식당, 공용 시설을 방문하게 되면 QR체크인을 해야하는데 카카오톡에서는 앱을 켜고 흔들면 QR체크인 화면이 뜨는 기능을 제공하고 있다.
이런 기능은 어떻게 만들 수 있을까?

예제

  • 일단 코드로 먼저 시작해서 흔들기하면 네이버를 띄우는 예제를 해본다.
  • 시뮬레이터에서 control+command+z 하면 Shake 모션을 할 수 있다.

import UIKit
import SafariServices

class ViewController: UIViewController {

    @IBOutlet private weak var mainLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
        print("모션 시작")
        if motion == .motionShake {
            mainLabel.text = "흔들기 모션 시작"
            let safari = SFSafariViewController(url: URL(string: "https://m.naver.com")!)
            self.present(safari, animated: true, completion: nil)
        }
    }

    override func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
        mainLabel.text = "흔들기 모션 종료"
        print("모션 종료")
    }

    override func motionCancelled(_ motion: UIEvent.EventSubtype, with event: UIEvent?) {
        mainLabel.text = "흔들기 모션 취소"
        print("모션 취소")
    }
}


motionBegan(_:with:)

// Declaration
func motionBegan(_ motion: UIEvent.EventSubtype, with event: UIEvent?)
  • 이 함수는 모션 이벤트가 시작되었을 때 receiver에게 알리는 함수이다. 두개의 파라미터를 가지고 있는데 motion과 event이다.
    • motion : EventSubType에 해당하는 상수로 motion의 종류를 나타낸다. 일반적으로 shaking을 사용한다.
    • event : 모션과 관련된 이벤트를 나타내는 객체이다.
  • UIKit은 모션 이벤트가 시작하거나 끝났을 때만 responder에게 알린다. 중간에 발생하는 모션은 알리지 않는다.
    모션 이벤트는 처음에 first responder에게 전달되고 필요에 따라 responder chain으로 전달된다. (responder chain 설명은 다른 블로그 참조)

EventSubtype

  • EventSubtype 에는 다양한 case가 존재하는데 remote가 붙어있는 원격 제어 이벤트는 헤드셋 또는 외부 악세사리에서 수신한 command로 발생하는 이벤트이다.
  • 여기서 우리가 쓸 것은 motionShake !!
public enum EventSubtype : Int {


        // available in iPhone OS 3.0
        case none = 0


        // for UIEventTypeMotion, available in iPhone OS 3.0
        case motionShake = 1


        // for UIEventTypeRemoteControl, available in iOS 4.0
        case remoteControlPlay = 100

        case remoteControlPause = 101

        case remoteControlStop = 102

        case remoteControlTogglePlayPause = 103

        case remoteControlNextTrack = 104

        case remoteControlPreviousTrack = 105

        case remoteControlBeginSeekingBackward = 106

        case remoteControlEndSeekingBackward = 107

        case remoteControlBeginSeekingForward = 108

        case remoteControlEndSeekingForward = 109
    }

motionEnded(_:with:)

// Declaration
func motionEnded(_ motion: UIEvent.EventSubtype, with event: UIEvent?)
  • 이 함수는 모션 이벤트가 종료되었을 때 receiver에게 알리는 함수이다.

motionCancelled(_:with:)

// Declaration
func motionCancelled(_ motion: UIEvent.EventSubtype, with event: UIEvent?)
  • 이 함수는 모션 이벤트가 취소되었을 때 receiver에게 알리는 함수이다.
  • 모션 이벤트 취소가 필요한 interruption을 수신할 때 UIKit에서 해당 메소드를 호출한다.
  • interruption이란 앱을 비활성화시키거나, 모션 이벤트를 처리하는 view를 window에서 제거하는 모든 것을 말한다.
  • 모션 이벤트 취소는 흔들림이 너무 오래 지속되는 경우에도 UIKit이 해당 메소드를 호출할 수 있다.


마무리

이렇게 흔들기 기능을 어떻게 가져오고 어떻게 사용할 수 있는지 확인할 수 있다. 예제 프로젝트는 아래 링크에서!
https://github.com/devssun/Wonder-Series-iOS/tree/master/ShakeTest

반응형