2017-01-18 15 views
0

iPhoneからAppleWatchに連絡先の名前と誕生日を送信するために、ユーザーの連絡先にアクセスしています。私は連絡先にアクセスでき、電話でデータを表示できますが、WatchConnectivityで情報を送信する際に問題があります。私はRay Wenderlichの本WatchOS by Tutorialsをガイドとして使用していますが、まだ問題があります。WatchConnectivityを使用して名前と誕生日をに送信する

ここでは、時計の接続性を設定するために電話機側でAppDelegate.swiftを設定しています。

// MARK: Watch Connectivity 
extension AppDelegate: WCSessionDelegate { 

func sessionDidBecomeInactive(_ session: WCSession) { 
    print("WC Session did become inactive.") 
} 

func sessionDidDeactivate(_ session: WCSession) { 
    print("WC Session did deactivate.") 
    WCSession.default().activate() 
} 


func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 
    if let error = error { 
     print("WC Session activation failed with error:" + "\(error.localizedDescription)") 
     return 
    } 
    print("Phone activated with state:" + "\(activationState.rawValue)") 
} 

func setUpWatchConnectivity() { 
    if WCSession.isSupported() { 
     let session = WCSession.default() 
     session.delegate = self 
     session.activate() 
     } 
    } 

} 

そしてこの

// MARK Watch Connectivity 

extension ViewController { 


func sendNameAndBirthdayToWatch() { 
    if WCSession.isSupported() { 
     let session = WCSession.default() 
     if session.isWatchAppInstalled { 
      let nameAndBirthday = ["name": nameLabel.text, "birthday": birthdayLabel.text] 
      do { 
       try session.updateApplicationContext(nameAndBirthday) 
      } catch { 
       print("Error") 
      } 
     } 
    } 
    } 

} 

ViewController.swiftに私が電話でUIButtonとsendNameAndBirthdayToWatch()を呼んでいます。プロトタイプとして、電話機は現在、Xcodeシミュレータの連絡先から引き出された2つの別々のラベルに名前と誕生日を表示しているので、少なくとも私はデータを取得していることを知っています。

腕時計にはExtensionDelegate.swiftがあります。

// MARK: Watch Connectivity 
extension ExtensionDelegate: WCSessionDelegate { 

func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 
    if let error = error { 
     print("Activation failed with error: \(error.localizedDescription)") 
     return 
    } 
    print("Watch activated with activation state: \(activationState.rawValue) ") 
} 

func setupWatchConnectivity() { 
    if WCSession.isSupported() { 
     let session = WCSession.default() 
     session.delegate = self 
     session.activate() 
    } 
} 

func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) { 
    if let name = applicationContext["name"] as? String, let birthday = applicationContext["birthday"] as? String { 
     InterfaceController.sharedInterfaceController.updateWatchLabel(name: name, birthday: birthday) 
    } 
} 
} 

これは私が立ち往生した場所です。私はどこが間違っていたのか、そして/または前進する方法がわからない。

私は時計のInterfaceController.swiftupdateWatchLabel()と電話していますが、結果は表示されません。

ご協力いただきありがとうございます。私はしっかりした週にこれを見つめていました。残念ながら、Wenderlichの本のサンプルプロジェクトは、私の理解のためには少し複雑です。

私は時間でのXcode 8.2.1およびスウィフト3

+0

シミュレータの代わりに実際のデバイスを使用して試したことがありますか? – ccjensen

+0

@ccjensen WatchConnectivityがウォッチでアクティブになっているというメッセージがコンソールに表示されないということに気付きました。私は現在それに取り組んでいます。 –

答えて

1

を使用しています私は自分の質問に答えました。

ここにコードはViewController.swiftです。コードは、私の元の投稿と同じままですAppDelegate.swift

func sendMessageToWatch() { 
    if WCSession.isSupported() { 
     let session = WCSession.default() 
     if session.isWatchAppInstalled { 
      do { 
       let message = ["message": "A message as String"] 
       try session.updateApplicationContext(message) 
      } catch { 
       print("Error: \(error)") 
      } 

     } else if session.isWatchAppInstalled == false { 
      print("No watch app installed") 
     } 
    } 
} 

私は現在、電話機のUIButtonを押してこの機能を呼び出しています。その後、受信側の時計の側にInterfaceController.swiftがあります。私は基本的にExtensionDelegate.swiftからInterfaceController.swiftにコードを移動しました。

// MARK: Watch Connectivity 
func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) { 
    if let error = error { 
     print("Activation failed with error: \(error.localizedDescription)") 
     return 
    } 
    print("Watch activated with activation state: \(activationState.rawValue) ") 
} 


func setupWatchConnectivity() { 
    if WCSession.isSupported() { 
     let session = WCSession.default() 
     session.delegate = self 
     session.activate() 
    } 
} 

func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) { 
    let message = applicationContext["message"] as? String 

    DispatchQueue.main.async(execute: { 
     self.label.setText(message) 
    }) 

} 
関連する問題