有逻辑的主要应用程序,我们将应用程序扩展到 Apple Watch。
添加目标后,xCode 会再创建 2 个应用程序:带有代码的扩展程序和监视套件应用程序。
问题:扩展中的代码如何重用准备好的和已经制作的主 iOS 应用程序的逻辑?扩展应用程序如何与主应用程序通信并发送命令。
要与包含的 iPhone 应用程序通信,您可以使用
(BOOL)openParentApplication:(NSDictionary *)userInfo
reply:(void (^)(NSDictionary *replyInfo,
NSError *error))reply
在你的WKInterfaceController
来自 Apple 文档
使用此方法与您的包含 iOS 应用程序进行通信。调用该方法会导致 iOS 在后台启动应用程序(根据需要)并调用
application:handleWatchKitExtensionRequest:reply
其应用程序委托的 : 方法。该方法具有以下签名:
- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo
reply:(void(^)(NSDictionary *replyInfo))reply
应用程序委托接收您传递给 userInfo 参数的字典,并使用它来处理您发出的任何请求。如果它提供了回复,WatchKit 将执行您在此方法的回复参数中提供的块。
在 Apple Watch Extension 的当前状态下:
您可以在 iOS 主应用程序和 WatchKit 扩展程序之间共享信息。使用 App Groups 和 NSUserDefaults 访问共享信息对象。
您无法从 Apple Watch 上的操作触发的 iOS 应用程序中执行代码。
至少现在还没有。
编辑:从 Xcode 6.2 Beta 2 开始
现在可以从 Apple Watch 与父 iOS 应用程序进行通信。
在 WatchKit Extension 中,通过openParentAppentApplicion
. 可以将值字典传递给父应用程序,而父应用程序可以返回值字典。
Watchkit 扩展:
// Call the parent application from Apple Watch
// values to pass
let parentValues = [
"value1" : "Test 1",
"value2" : "Test 2"
]
WKInterfaceController.openParentApplication(parentValues, reply: { (replyValues, error) -> Void in
println(replyValues["retVal1"])
println(replyVaiues["retVal2"])
})
iOS 应用程序:
// in AppDelegate.swift
func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!, reply: (([NSObject : AnyObject]!) -> Void)!) {
// retrieved parameters from Apple Watch
println(userInfo["value1"])
println(userInfo["value2"])
// pass back values to Apple Watch
var retValues = Dictionary<String,String>()
retValues["retVal1"] = "return Test 1"
retValues["retVal2"] = "return Test 2"
reply(retValues)
}