Apple watchOS 2用の最初のアプリケーションを作成します

最近では、9月にAppleは待望のアップデート、watchOSオペレーティングシステムの第2バージョンをリリースしました。 Habréでのプログラム作成に関する記事はなかったようです。この瞬間を修正しようとします。



新機能



すべてのスマートウォッチの主な欠点は、バッテリー寿命が短いことです。 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プログラムを作成する場合と根本的に違いはありません。 著者は、すべての成功した実験を望んでいます。



All Articles