아이폰의 작은 위젯에 걸음 수를 표시해 보세요.

iOS 10의 부품이 새로 만들어졌기 때문에 부품에 단계 수를 표시합니다.
이미 작은 프로그램에 걸음걸이를 제공하는 프로그램이 있지만 신경 쓸 필요가 없다.
Xcode 8.2
Swift 3.0.2

할 일


위젯의 마지막 링크를 추가하거나 상세하게 설명합니다. 이 링크를 참고하면 그림이 쉽게 이해됩니다.
위젯에만 걸음 수를 표시할 때 할 일은
• 추가 부품(Today Extension)
• 헬스키트를 ON으로 설정하여 걸음 수 얻기
두 개밖에 없어요.
어플리케이션 및 애플릿에서 데이터를 표시하고 공유할 때
· Framework 추가(코드의 일반화)
· App Groupe 추가(데이터 공유)
필요

추가 부품(App Extension)


메뉴 표시줄의 [File]->[New]->[Target...]Application Extension에서 Today Extension을 추가합니다.
추가하면 Product Name의 폴더와 같을 수 있으므로 애플릿에서 사용할 ViewController와 storyboard 등이 추가됩니다.

HealthKit를 ON으로 설정하여 단계 수 지정


프로젝트 파일의 [TARGET]에 적용된 [Capability] 페이지의 [HealthKit]를 ON으로 변경합니다.
iOS 10에서 사용자 데이터를 처리할 때 쓰기 위해 info가 필요하기 때문입니다.plist 속성에 Privacy - Motion Usage Description 를 추가하여 대화상자에 표시할 문자열을 추가하거나 xml에 다음 내용을 추가합니다.
<key>NSMotionUsageDescription</key>
<string>ダイアログに表示する文字列</string>

이렇게 하면 보수를 얻을 수 있기 때문에 실제로 얻으려고 시도해 본다.
추가import CoreMotion 잊지 마세요.
TodayViewController.swift
    @IBOutlet weak var stepsLabel: UILabel!

    func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) {

        if CMPedometer.isStepCountingAvailable() {
            let formatter = DateFormatter()
            formatter.dateFormat = "yyyy-MM-dd"
            let midnight = formatter.string(from: Date())
            let fromDateString = midnight + " 00:00:00"
            formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
            let fromDate = formatter.date(from: fromDateString)!
            let toDate = Date()
            CMPedometer().queryPedometerData(from: fromDate, to: toDate, withHandler: { data, error in
                if let stepsNumber = data?.numberOfSteps {
                    let steps = String(describing: stepsNumber)
                    DispatchQueue.main.async {
                        self.stepsLabel.text = "本日" + steps + "歩歩きました"
                    }
                }
            })
        }
        completionHandler(NCUpdateResult.newData)
    }
viewDidLoad는 위젯을 추가할 때viewDidLoad라고 불리기 때문에 주로widgetPerformUpdate로 처리됩니다.
날짜가 변경된 후 표시될 때까지의 걸음수입니다.
부품의 UILAbel에 직접 반영하면 시간이 많이 걸리기 때문에 Main 스레드로 처리하기로 했습니다.

응용 프로그램 및 부품에 표시하거나 데이터를 공유할 때


Framework 추가(코드 일반화)


Framework 추가 등 자세한 설명은 여기.을 참조하십시오.
메뉴 표시줄의 [File]->[New]->[Target...][Framework & Library]에서 [Cocoa Touch Framework]를 추가합니다.
Framework를 만들면 응용 프로그램에서 사용할 수 있지만 애플릿이 직접 추가해야 사용하기 때문에 프로젝트 파일의 위젯을 열고 [Linked Frameworks and Libraries]에서 + 키를 눌러 만든 Framework를 추가합니다.
이후 제작된 프레임워크를 import로 활용하면 프레임워크에 추가된 방법 등을 이용할 수 있다.

공유 데이터


데이터 공유 방법에는 Keychain을 사용하는 방법과 User Defaults를 사용하는 방법 두 가지가 있는데 이번에는 User Defaults를 사용하여 데이터를 공유합니다.앱과 애플릿은 다른 앱이기 때문에 앱 그룹으로 같은 데이터에 접근할 수 있다.
프로젝트 파일의 [TAEGETS] 응용 프로그램의 [Capability] 페이지의 [HealthKit]를 ON으로 변경"group.hoge.appname"등의 적절한 이름으로 추가합니다.
        let userDefaults = UserDefaults.init(suiteName: "group.hoge.appname")!
        // 保存
        userDefaults.set(steps, forKey: "steps")
        userDefaults.synchronize()
        // 取得
        let steps = userDefaults.string(forKey: "steps")
이렇게 데이터를 공유합니다.

사이트 축소판 그림


http://blog.jeffsuke.com/entry/2014/07/28/121827
http://qiita.com/masahiro_kusumoto/items/8358ce3b63ab4907c6c3

좋은 웹페이지 즐겨찾기