2016-11-17 2 views
0

На Watch я могу пройти сохраненную тренировку от WorkoutInterfaceController до SummaryInterfaceController. Но мне было интересно, как с передать сохраненную тренировку с Watch на iPhone (так что я могу отобразить ее и в средстве просмотра).Прохождение сохраненной тренировки от Watch to 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 
     } 
    } 
} 

Позволь мне знать, если какие-либо вопросы или информацию, необходимые, спасибо!

ответ

1

В рамках моих исследований и разработок я обнаружил, что спаривание iPhone и Apple Watch может быть полезным. В этом случае нажатие на кнопку в приложении «Наблюдение» отправит текст на iPhone.

Чтобы сделать простую демонстрацию этой функции, поместите кнопку на интерфейс WatchKit и ярлык в раскадровку приложения iOS.

Теперь подключите кнопку к контроллеру интерфейса WatchKit как IBAction, чтобы реагировать на события нажатия кнопок. Также подключите ярлык к контроллеру представления пользовательского интерфейса как 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"] 
    } 
} 

Надеюсь, это поможет вам понять. Для более проблем, вы можете посмотреть на это,

Delegate Method

+0

Вы пробовали код/​​процесс, который вы опубликовали? – SRMR

1

Для этого вам необходимо создать группу приложений, которая по сути является пространством, которое могут использовать оба приложения. Он был внедрен в инфраструктуру exetension в iOS8, поэтому приложения могут общаться со своими виджетами Today или пользовательскими клавиатурами и среди других приложений.

ADD ВОЗМОЖНОСТЕЙ

Первое, что мы должны сделать, это добавить возможность группы приложений для обеих наших целей iPhone и удлинители Часы Часы.

Для этого откройте настройки проекта (синий значок в верхней части списка файлов) и выберите цель для iPhone. Вам нужно будет выбрать вкладку «Возможности» в верхней части страницы и прокрутить вниз, чтобы включить группы приложений.

Для этого требуется связанный профиль разработчика, и для его включения потребуется некоторое время. Вам также нужно будет выполнить те же действия, чтобы включить группы приложений для расширения набора часов.

Далее вам нужно убедиться, что строка группы приложений - это строка идентификатора, которую вы хотите, и которая имеет смысл для вашего приложения, она должна начинаться с группы слов или она жалуется. Вы также можете добавить несколько групп. Независимо от того, что вы выбираете, они должны быть включены с синим тиком (опять это может занять некоторое время) и точно такие же, как для целей iPhone, так и для увеличения!

Capabilities Image

Чтобы использовать App группы, это не значит, что разные или трудно использовать, чем NSUserDefaults:

var userDefaults = NSUserDefaults(suiteName: "group.com.example.My-App") 
userDefaults.setObject(true, forKey: "isDarkModeEnabled") 
userDefaults.synchronize() 

Единственное различие здесь как NSUserDefaults конкретизируется и призвании синхронизации в конце. Вы загружаете его идентификатор контейнера в параметр конструктора под названием «имя набора», затем вызываете «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 из него. Тогда у моих свойств для класса есть получатели и сеттеры для хранения данных в App Group. Если ключ не существует, он создает его со значением по умолчанию и синхронизирует его.Использование класса с этой точки вперёд просто:

var configModel = ConfigurationModel() 
configModel.isDarkModeEnabled = true 

Это свойство хранится в облаке! Все отвлечено за вас. Вам не нужно беспокоиться о хранении и синхронизации его в группе приложений. Все это делается автоматически для вас в геттерах и сеттерах!

Надеюсь, это поможет вам понять, как вы можете обмениваться данными между iPhone и Apple Watch.

+0

ли watchOS 3 поддержки App группы, хотя? Я почти уверен, что весь путь назад к watchOS 2 не поддерживает UserDefaults, и по какой-то причине я думаю, что это было одинаково для групп приложений. Но я могу полностью ошибаться, я пытаюсь найти документацию на нем! – SRMR

+0

https://forums.developer.apple.com/thread/3927 – SRMR

+0

Да WatchOS 3 поддерживает группы приложений, вы можете проверить их: –

Смежные вопросы