gpt4 book ai didi

swift - 没有触觉反馈

转载 作者:搜寻专家 更新时间:2023-10-31 22:05:27 24 4
gpt4 key购买 nike

我的 watchos 应用依赖于在后台运行的触觉反馈。我已经在互联网上搜索和搜索如何执行此操作,并且只学会了如何将内容添加到我的 info.plist

我不想使用通知来提醒我的用户,因为它在 UI 方面太麻烦了,因为这样做太频繁了。

我阅读了有关锻炼类(class)的信息,但无法让它发挥作用。

如何在手腕放低时让触觉反馈发挥作用?最简单的方法就足够了,我不是 swift 最先进的,所以请尝试完整解释!

我的代码示例如下。如果我想让背景触觉反馈起作用,请告诉我把它放在哪里:

我的计时器:

 _ = Timer.scheduledTimer(timeInterval: 88, target: self, selector: "action", userInfo: nil, repeats: true)

我的行动:

 func action() {
print("action")
WKInterfaceDevice.current().play(.success)
imageObject.setImageNamed("number2")
}

这就是我在 HKWorkout session 中所做的,但完全不知道发生了什么。

  func workoutSession(_ workoutSession: HKWorkoutSession, didChangeTo toState: HKWorkoutSessionState, from fromState: HKWorkoutSessionState, date: Date) {
switch toState {
case .running:
workoutDidStart(date)
case .ended:
workoutDidEnd(date)
default:
print("Unexpected state \(toState)")
}
}

func workoutSession(_ workoutSession: HKWorkoutSession, didFailWithError error: Error) {
// Do nothing for now
print("Workout error")
}


func workoutDidStart(_ date : Date) {
if let query = createHeartRateStreamingQuery(date) {
self.currenQuery = query
healthStore.execute(query)
} else {
label.setText("cannot start")
}
}

func workoutDidEnd(_ date : Date) {
healthStore.stop(self.currenQuery!)
label.setText("---")
session = nil
}

// MARK: - Actions
@IBAction func startBtnTapped() {
if (self.workoutActive) {
//finish the current workout
self.workoutActive = false
self.startStopButton.setTitle("Start")
if let workout = self.session {
healthStore.end(workout)
}
} else {
//start a new workout
self.workoutActive = true
self.startStopButton.setTitle("Stop")
_ = Timer.scheduledTimer(timeInterval: 5, target: self, selector: "firsts", userInfo: nil, repeats: false)


startWorkout()
}

}

func startWorkout() {

// If we have already started the workout, then do nothing.
if (session != nil) {
return
}

// Configure the workout session.
let workoutConfiguration = HKWorkoutConfiguration()
workoutConfiguration.activityType = .crossTraining
workoutConfiguration.locationType = .indoor

do {
session = try HKWorkoutSession(configuration: workoutConfiguration)
session?.delegate = self
} catch {
fatalError("Unable to create the workout session!")
}

healthStore.start(self.session!)
}

func createHeartRateStreamingQuery(_ workoutStartDate: Date) -> HKQuery? {


guard let quantityType = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate) else { return nil }
let datePredicate = HKQuery.predicateForSamples(withStart: workoutStartDate, end: nil, options: .strictEndDate )
//let devicePredicate = HKQuery.predicateForObjects(from: [HKDevice.local()])
let predicate = NSCompoundPredicate(andPredicateWithSubpredicates:[datePredicate])


let heartRateQuery = HKAnchoredObjectQuery(type: quantityType, predicate: predicate, anchor: nil, limit: Int(HKObjectQueryNoLimit)) { (query, sampleObjects, deletedObjects, newAnchor, error) -> Void in
//guard let newAnchor = newAnchor else {return}
//self.anchor = newAnchor
self.updateHeartRate(sampleObjects)
}

heartRateQuery.updateHandler = {(query, samples, deleteObjects, newAnchor, error) -> Void in
//self.anchor = newAnchor!
self.updateHeartRate(samples)
}
return heartRateQuery
}

func updateHeartRate(_ samples: [HKSample]?) {
guard let heartRateSamples = samples as? [HKQuantitySample] else {return}

DispatchQueue.main.async {
guard let sample = heartRateSamples.first else{return}
let value = sample.quantity.doubleValue(for: self.heartRateUnit)
self.label.setText(String(UInt16(value)))

// retrieve source from sample
let name = sample.sourceRevision.source.name
self.updateDeviceName(name)
self.animateHeart()
}
}

func updateDeviceName(_ deviceName: String) {
deviceLabel.setText(deviceName)
}

func animateHeart() {
self.animate(withDuration: 0.5) {
self.heart.setWidth(60)
self.heart.setHeight(90)
}

let when = DispatchTime.now() + Double(Int64(0.5 * double_t(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)

DispatchQueue.global(qos: .default).async {
DispatchQueue.main.asyncAfter(deadline: when) {
self.animate(withDuration: 0.5, animations: {
self.heart.setWidth(50)
self.heart.setHeight(80)
}) }


}
}

看,我什至不需要心率数据或任何东西,只需要背景中嗡嗡作响的触觉引擎。

最佳答案

作为 addition to my previous answer 我创建了一个示例项目,展示了如何在后台触发振动:

有关如何使用 HKWorkoutSession 的完整示例,请查看 my sample project on GitHub .即使应用程序在后台运行,示例应用程序也会每五秒触发一次振动。HKWorkoutSession 因此该示例仅在使用包含 HealthKit 授权的配置文件对应用进行签名时才有效。请确保将所有三个可用目标的开发团队更改为您自己的团队。 Xcode 将尝试创建所需的配置文件。如果存在任何签名问题或您使用在后台运行的通配符配置文件将无法工作。

关于swift - 没有触觉反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42351042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com