新機能
すべてのスマートウォッチの主な欠点は、バッテリー寿命が短いことです。 Appleのエンジニアは、この点を非常に簡単な方法で修正することにしました。可能な限りクロックプロセッサをアンロードします。 このために、オリジナルのソリューションが発明されました-プログラムリソースのみが時計に保存され、すべての計算は電話のプロセッサで行われました。 監視プログラムは、2つのコンポーネントで構成されています:Watch App(時計に保存されているもの)およびWatchKit Extention(電話に保存されているもの)。 つまり 実際、これはスマートフォンの一種の「リモートデスクトップ」オプションでした。近くの電話がなければ、アプリケーションは動作しませんでした。 おそらく、それほど高速ではないBluetooth LEが通信チャネルとして使用されました。 その結果、ユーザーはしばしば、この原則の結果であるインターフェースの「抑制」について不満を述べました。 一般的に、独創性にもかかわらず、コンセプトは「離陸しませんでした」。 したがって、OS2の主な違いは、アプリケーションが時計に完全に保存されるようになったことです。 しかし、とにかく完全に独立しているわけではありません-アプリケーションは時計上で独立して動作しますが、このアプリケーションがインストールされるiPhone用の「メイン」プログラムが必要です。 これはすべて「松葉杖」に非常に似ており、この制限の次のバージョンではおそらくそうではありません。 しかし、見てみましょう。
ハードウェアについて話すと、プログラマーはデバッグのために2時間の選択肢があります。
-画面38mm、解像度272x340、
-42mmスクリーン、解像度312x390。
Apple Webサイトの残りの特性(メモリ、プロセッサなど)が見つかりませんでした。 ただし、このプロジェクトでは、これはそれほど重要ではありません。 プロジェクト(慎重に、トラフィック)に進みましょう。
プロジェクトを作成する
Mac OS、iOSのすべてのアプリケーションと同様に、watchOSプログラムはXcode環境で作成されます 。 Mac App Storeから無料でダウンロードできます。 そのため、Xcodeで新しいプロジェクトの作成を選択します。 バージョン7.0では、WatchKitアプリを備えた新しいテンプレートiOSアプリが登場しました。
アプリケーションを作成し、WatchTestと呼びます。 Xcodeは次のようにプロジェクトを作成します。
ご覧のとおり、プロジェクトは3つの部分で構成されています。
-WatchTest-iOSのメインアプリケーション、
-WatchKitアプリ-リソースを保存するアプリケーションの一部、
-WatchKitエクステンション-コードを保存するアプリケーションの一部。
(2つの部分への分割は、N2の「松葉杖」に似ていますが、少なくとも両方の部分が時計に保存されることは明らかであり、スマートフォンへの信号の送信に関連する遅延はありません。
iOSアプリを作成する
教育目的のために、ストップウォッチプログラムなどのシンプルなものを作成します。 時間を出力する1つのラベルと、「開始-停止」および「リセット」の2つのボタン。 スタートボタンを押すと、タイマーが1秒未満の単位で増加します。 多くの中間的な詳細を省略し、結果をすぐに表示します。 コード(Swift内)とリソースを図に示します。
ここでは、コントロール(タグ
@IBOutlet
、この場合は1つのUILabelのみ)と、タグ
@IBAction
2つのボタンのハンドラーを見ることができます(詳細については、 ここで読むことができます )。
この部分のソースコード(少しリファクタリングした後)
import UIKit class ViewController: UIViewController { @IBOutlet weak var timeLabel: UILabel! var seconds: Int! var timer: NSTimer! let interval: Double = 1.0/20.0 override func viewDidLoad() { super.viewDidLoad() self.seconds = 0; // Watch support initWatchConnection() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @IBAction func onButtonStart(sender: AnyObject) { startOrStopTimer() } @IBAction func onButtonReset(sender: AnyObject) { resetTimer() } func startOrStopTimer() { if (self.timer == nil) { self.timer = NSTimer.scheduledTimerWithTimeInterval(interval, target:self, selector:"onTimer", userInfo:nil, repeats:true) } else { self.timer.invalidate() self.timer = nil } } func resetTimer() { if (self.timer != nil) { self.timer.invalidate() self.timer = nil } self.seconds = 0; self.timeLabel.text = "0.00" } func onTimer() { self.seconds = self.seconds + 1 self.timeLabel.text = String(format: "%.2f", Double(self.seconds)*interval) } }
アプリケーションを起動し、動作することを確認します。 次に、Apple Watch用のプログラムを作成します。これは、ストップウォッチの「リモートコントロール」になります。 「開始」と「リセット」の2つのボタンがあり、スマートフォン上の対応するコマンドが有効になります。 これを行うことはできず、時計上の同じストップウォッチに限定されますが、時計と電話の交換用に特別に設計された新しいWatch Connectivityフレームワークを試してみるのは興味深いです。
Apple Watchアプリを作成する
WatchKitアプリでinterface.storyboardを開きます。 2つのボタンとラベルを追加して、結果を表示します。 コードでは、 WCSessionクラスのオブジェクトを作成します。これは、時計を電話に接続する役割を果たします。 このクラスにはsendCommandメソッドがあり、これを使用します。 そのパラメーターは辞書で、そこにさまざまなデータを入れることができます。 この場合、通常のテキストコマンドを渡します。 この方法は最も効果的ではないかもしれませんが、シンプルで直感的です。
最終結果(リソース+コード)を図に示します。
この部分のソースコード
import WatchKit import Foundation import WatchConnectivity class InterfaceController: WKInterfaceController, WCSessionDelegate { @IBOutlet var statusLabel: WKInterfaceLabel! private var session : WCSession! override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) } override func willActivate() { super.willActivate() session = WCSession.isSupported() ? WCSession.defaultSession() : nil session?.delegate = self session?.activateSession() } override func didDeactivate() { session = nil super.didDeactivate() } @IBAction func onButtonStartStop() { self.sendCommand("startstop") } @IBAction func onButtonReset() { self.sendCommand("reset") } func sendCommand(cmd: String) { self.statusLabel.setText("Sending...") if let session = session where session.reachable { let applicationData = [ "body" : cmd ] session.sendMessage(applicationData, replyHandler: { replyData in self.statusLabel.setText("Send: done") }, errorHandler: { error in self.statusLabel.setText("Send: fail") }) } else { self.statusLabel.setText("No connection") } } }
開始し、ボタンを押します...何も起こりません。 そうです、メインプログラムにクロックメッセージハンドラーを追加しませんでした。
iOSアプリケーションを完成させています
iOSアプリケーションにほぼ同一のコードを追加して、 WCSessionを初期化します 。 興味深いのは、 セッション:didReceiveMessage関数です 。これは、アプリケーションが時計からメッセージを受信するとすぐに自動的に呼び出されます。 この関数のパラメーターは、送信時に渡したものと同じ辞書になります。 replyHandlerでは、ウォッチですでに分析できる応答を伝達できます。 メインスレッドのタイマーを操作するには、dispatch_async(dispatch_get_main_queue())関数が必要です。そうでない場合、正しく起動しません。
コードの最終バージョンが図に表示されています。
完全なソースコード
import UIKit import WatchConnectivity class ViewController: UIViewController, WCSessionDelegate { @IBOutlet weak var timeLabel: UILabel! var seconds: Int! var timer: NSTimer! let interval: Double = 1.0/20.0 private var session : WCSession! override func viewDidLoad() { super.viewDidLoad() self.seconds = 0; // Watch support initWatchConnection() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } @IBAction func onButtonStart(sender: AnyObject) { startOrStopTimer() } @IBAction func onButtonReset(sender: AnyObject) { resetTimer() } func startOrStopTimer() { if (self.timer == nil) { self.timer = NSTimer.scheduledTimerWithTimeInterval(interval, target:self, selector:"onTimer", userInfo:nil, repeats:true) } else { self.timer.invalidate() self.timer = nil } } func resetTimer() { if (self.timer != nil) { self.timer.invalidate() self.timer = nil } self.seconds = 0; self.timeLabel.text = "0.00" } func onTimer() { self.seconds = self.seconds + 1 self.timeLabel.text = String(format: "%.2f", Double(self.seconds)*interval) } func initWatchConnection() { if (WCSession.isSupported()) { session = WCSession.defaultSession() session?.delegate = self session?.activateSession() } } func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void) { if let body:String = message["body"] as? String { if (body == "startstop") { dispatch_async(dispatch_get_main_queue(),{ self.startOrStopTimer() }) replyHandler([ "answer" : "OK" ]) } if (body == "reset") { dispatch_async(dispatch_get_main_queue(),{ self.resetTimer() }) replyHandler([ "answer" : "OK" ]) } } } }
時計とスマートフォンでプログラムを起動すると、すべてが機能します。時計のボタンを正しく押すと、タイマーが開始されます。
デバッグ
Xcode環境には、次のような完全に機能するシミュレータが付属しています。
何らかの理由で、「シミュレーターウォッチ」のペアにはiPhone 6とiPhone 6 Plusしかありません。このウォッチが他のモデルで動作するかどうかはわかりません。 しかし、iPhone 6 / 6PlusのようなApple Watchはまだ持っていないので、残念ながら「ライブ」をチェックするものは何もありません(面白いですが、時計に3万ルーブルを払うには十分ではありません)。
App Storeに投稿する
もちろん、このプログラムをApp Storeに投稿することはありません。 そして、彼らの傑作をそこに投稿したい人のために、私は簡単に注意します:
-Watch Kitアプリにアイコンを追加する必要があります。これらのアイコンは時計に表示されます
-App Storeで新しいスクリーンショットとアイコンを追加する必要があります
- 各コンポーネント (アプリと拡張機能)に新しいApple IDを追加し、 各コンポーネントの配布証明書を生成する必要があります。 合計で、これはプログラムに3つの証明書を提供します。
-その後、いつものように、Build-Archiveを実行します。その結果、すべてが含まれるアーカイブがApp Storeに注がれます。
そのようなもの。 誰かが興味を持っている場合は、続行することが可能になります。 ご覧のとおり、watchOSのプログラミングは、いくつかの機能を備えていますが、通常のiOSプログラムを作成する場合と根本的に違いはありません。 著者は、すべての成功した実験を望んでいます。