WKInterfaceControllerのopenParentApplication:reply:メソッドを使うことでiPhone側の親アプリを起動することができます。現在のところ、親アプリのみ起動が可能。
一つ目の引数に渡したいデータを入れればOK。
iPhone App側の実装
- (void)application:(UIApplication *)application
handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply
Watch Kit App
からiPhone側の親アプリが起動されたとき、application:handleWatchKitExtensionRequest:reply:メソッドが最初に呼ばれます。渡ってきたデータを利用することができます。
URLスキームを設定していれば、特定のページへ遷移させることも可能。
Main.storyboardでUIを作成します。
いつものiOS開発と同じです。Labelを貼り付けます。
Interface.storyboardでUIを作成します。
いつものiOS開発と同じです。LabelとButtonを3つ貼り付けます。
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
// rootViewController を PersonViewController にする
var personViewController: PersonViewController {
return window?.rootViewController as! PersonViewController
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
return true
}
func application(application: UIApplication, handleWatchKitExtensionRequest
userInfo: [NSObject : AnyObject]?, reply: (([NSObject : AnyObject]!) -> Void)?) {
// userInfo通知のデータを確認
if let info = userInfo as? [String: String] {
// personViewController メソッド:showPerson <- userInfo
personViewController.showPerson(info["personName"]!)
// 応答 成功
reply.map { $0(["response" : "success"]) }
} else {
// 応答 失敗
reply.map { $0(["response" : "fail"]) }
}
}
func applicationWillResignActive(application: UIApplication) {
}
func applicationDidEnterBackground(application: UIApplication) {
}
func applicationWillEnterForeground(application: UIApplication) {
}
func applicationDidBecomeActive(application: UIApplication) {
}
func applicationWillTerminate(application: UIApplication) {
}
}
import UIKit
// クラスをPersonViewController
class PersonViewController: UIViewController {
// personNameラベル
@IBOutlet private weak var personName: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// 相撲番付け表示(人)
func showPerson(name: String) {
personName.text = name
}
}
import WatchKit
import Foundation
class InterfaceController: WKInterfaceController {
// 最初に呼び出されるメソッド
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
// Configure interface objects here.
}
// ユーザーにUIが表示されたタイミングで呼び出されるメソッド
override func willActivate() {
// This method is called when watch view controller is about to be visible to user
super.willActivate()
}
// UIが非表示になったタイミングで呼び出されるメソッド
override func didDeactivate() {
// This method is called when watch view controller is no longer visible
super.didDeactivate()
}
@IBAction func showYoko() {
openParent("横綱")
}
@IBAction func showOuze() {
openParent("大関")
}
@IBAction func showSeki() {
openParent("関脇")
}
// カウントラベル
func openParent(person: String) {
var userInfo = ["personName" : person]
// openParentApplication:reply:メソッド iPhone側の親アプリを起動
WKInterfaceController.openParentApplication(userInfo, reply: { (data, error) in
if let error = error {
// 応答 失敗 ["response" : "fail"]
println(error)
}
if let data = data {
// 応答 成功 [response: success]
println(data)
}
})
}
}
これでApple Watch側でそれぞれのカウントボタンをタップするとiPhone(親アプリ)が起動し、
Apple Watch側のカウントと親アプリ側のカウントの表示が同期します。
GitHub WatchKitCommuni
▫️参考にしたページ
WatchKit: Open Your iOS App From The Watch
WatchKit AppからiPhone Appを起動する方法
WatchKitにおける iPhone Appとのデータ共有
コメントをお書きください