Передать сохраненную тренировку с часов на iPhone
На Watch, я могу передать сохраненную тренировку из WorkoutInterfaceController
к SummaryInterfaceController
, Но мне было интересно, как передать сохраненную тренировку с часов на iPhone (чтобы я мог также отображать ее в контроллере сводного представления).
Вы знаете? Или есть лучший способ, которым я должен сделать это?
Вот что я использую для передачи сохраненной тренировки от WorkoutInterfaceController
к SummaryInterfaceController
:
private func saveWorkout() {
// Create and save a workout sample
let configuration = workoutSession!.workoutConfiguration
let isIndoor = (configuration.locationType == .indoor) as NSNumber
print("locationType: \(configuration)")
let workout = HKWorkout(activityType: configuration.activityType,
start: workoutStartDate!,
end: workoutEndDate!,
workoutEvents: workoutEvents,
totalEnergyBurned: totalEnergyBurned,
totalDistance: totalDistance,
metadata: [HKMetadataKeyIndoorWorkout:isIndoor]);
healthStore.save(workout) { success, _ in
if success {
self.addSamples(toWorkout: workout)
}
}
WKInterfaceController.reloadRootControllers(withNames: ["SummaryInterfaceController"], contexts: [workout])
}
private func addSamples(toWorkout workout: HKWorkout) {
// Create energy and distance samples
let totalEnergyBurnedSample = HKQuantitySample(type: HKQuantityType.activeEnergyBurned(),
quantity: totalEnergyBurned,
start: workoutStartDate!,
end: workoutEndDate!)
// Add samples to workout
healthStore.add([totalEnergyBurnedSample], to: workout) { (success: Bool, error: Error?) in
if success {
// Samples have been added
}
}
}
Дайте мне знать, если какие-либо вопросы или информация нужна, спасибо!
2 ответа
В рамках своих исследований и разработок я обнаружил, что соединение iPhone и Apple Watch может быть полезным. В этом случае, нажав на кнопку в приложении Watch, вы отправите текст на iPhone.
Чтобы сделать простую демонстрацию этой функциональности, поместите кнопку в интерфейсе WatchKit и метку на раскадровке приложения iOS.
Теперь подключите кнопку к контроллеру интерфейса WatchKit как IBAction, чтобы реагировать на события касания кнопки. Также подключите Label к UI View Controller как IBOutlet.
В контроллере интерфейса мы создаем строковую переменную для отправки на метку, а в методе IBAction кнопки создаем словарь, который включает строковую переменную, которую вы создали. Этот словарь - то, что передано приложению iPhone.
class InterfaceController: WKInterfaceController {
Var str: String = "Hello Phone"
@IBAction func button() {
let dict: Dictionary = ["message": str]
}
Используйте следующий метод, чтобы отправить словарь на iPhone.
WKInterfaceController.openParentApplication(dict, reply: {(reply, error) -> void in
print("Reply receive from iPhone app")
})
В AppDelegate приложения iOS добавьте следующий метод приложения. Это то, что будет обрабатывать предыдущие методы связи от Watch. Также мы можем использовать уведомление, чтобы уведомить контроллер представления о том, что данные были получены, и передать их.
func application(application: UIApplication, handleWatchkitExtensionRequest userInfo: [NSObject : AnyObject]?, reply:(([NSObject : AnyObject]!) {
NSNotificationCenter.defaultCenter().postNotificationName("WatchKitReq", object: userInfo)
}
Наконец, в контроллере представления создайте прослушиватель для уведомления, которое обновит текст метки до строки, которая была отправлена с данными.
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector("handleWatchKitNotification:"), name: "WatchKitReq", object: nil)
}
func handleWatchKitNotification(notification: NSNotification) {
if let userInfo = notification.object as? [String : String] {
label.text = userInfo["message"]
}
}
Надеюсь, это поможет вам понять. Для большего количества проблем вы можете посмотреть на это,
Для этого вам нужно создать группу приложений, которая по сути является пространством, которое могут использовать оба приложения. Он был введен с платформой расширения в iOS8, чтобы приложения могли взаимодействовать со своими виджетами Today или пользовательскими клавиатурами, а также среди других приложений.
ДОБАВИТЬ ВОЗМОЖНОСТИ
Первое, что нам нужно сделать, это добавить возможность группы приложений для наших целей iPhone и Watch Watch Extension.
Для этого откройте настройки проекта (синий значок вверху списка файлов) и выберите цель для iPhone. Вам нужно будет выбрать вкладку "Возможности" в верхней части страницы и прокрутить вниз, чтобы включить группы приложений.
Для этого требуется подключенный профиль разработчика, и для его включения потребуется некоторое время. Вам нужно будет выполнить те же действия, чтобы включить группы приложений для расширения набора часов.
Затем вы должны убедиться, что строка группы приложения - это строка идентификатора, которую вы хотите, и которая имеет смысл для вашего приложения, она должна начинаться со слова group или жалоба. Вы также можете добавить несколько групп, если хотите. Что бы вы ни выбрали, они должны быть включены с синей галочкой (опять же, это может занять некоторое время) и абсолютно одинаковы для целей расширения iPhone и Watch!
Чтобы использовать группы приложений, это не так уж и сложно, как NSUserDefaults:
var userDefaults = NSUserDefaults(suiteName: "group.com.example.My-App")
userDefaults.setObject(true, forKey: "isDarkModeEnabled")
userDefaults.synchronize()
Единственные различия здесь заключаются в том, как создается экземпляр NSUserDefaults и в конце вызывается синхронизация. Вы передаете ему идентификатор контейнера параметру конструктора с именем "suiteName", затем вызываете "synchronize()", и ваши данные отправляются в облако для использования другими приложениями и устройствами.
Возьмите это на следующий уровень
Вы можете сделать еще один шаг вперед, создав класс для вашего приложения и абстрагировав базовое хранилище для ваших свойств. Вот пример:
public class ConfigurationModel: NSObject {
public static let storageKey = "group.com.example.My-App"
public let userStorage = NSUserDefaults(suiteName: storageKey)
public var isDarkModeEnabled: Bool {
get {
// Get setting from storage or default
if userStorage?.objectForKey("isDarkModeEnabled") == nil {
userStorage?.setObject(false, forKey: "isDarkModeEnabled")
userStorage?.synchronize()
}
return userStorage?.objectForKey("isDarkModeEnabled")
}
set {
// Set new value in storage
userStorage?.setObject(newValue, forKey: "isDarkModeEnabled")
userStorage?.synchronize()
}
}
В верхней части класса я объявляю свой контейнерный идентификатор группы и создаю из него объект NSUserDefault. Тогда у моих свойств для класса есть методы получения и установки для хранения данных в группе приложений. Если ключ не существует, он создает его со значением по умолчанию и синхронизирует его. Использовать класс с этого момента просто:
var configModel = ConfigurationModel()
configModel.isDarkModeEnabled = true
Это свойство хранится в облаке! Все абстрагировано для вас. Вам не нужно беспокоиться о сохранении и синхронизации его в группе приложений. Все это делается автоматически для вас в методах получения и установки!
Надеюсь, это поможет вам понять, как вы можете обмениваться данными между iPhone и приложением Apple Watch.