Ios Apple Watch、WatchKit扩展和主要应用程序

Ios Apple Watch、WatchKit扩展和主要应用程序,ios,main,watchkit,Ios,Main,Watchkit,有一个逻辑的主应用程序,我们将应用程序扩展到Apple Watch 添加目标xCode后,将创建另外两个应用程序:带代码的扩展和监视工具包应用程序 问题:来自扩展的代码如何重用已经准备好的主iOS应用程序的逻辑?扩展应用程序如何与主应用程序通信并发送命令。在Apple Watch扩展程序的当前状态下: 您可以在iOS主应用程序和WatchKit扩展程序之间共享信息。使用应用程序组和NSUserDefaults访问共享信息对象 您无法执行iOS应用程序中的代码,该程序由Apple Watch上的

有一个逻辑的主应用程序,我们将应用程序扩展到Apple Watch

添加目标xCode后,将创建另外两个应用程序:带代码的扩展和监视工具包应用程序


问题:来自扩展的代码如何重用已经准备好的主iOS应用程序的逻辑?扩展应用程序如何与主应用程序通信并发送命令。

在Apple Watch扩展程序的当前状态下:

  • 您可以在iOS主应用程序和WatchKit扩展程序之间共享信息。使用应用程序组和NSUserDefaults访问共享信息对象

  • 无法执行iOS应用程序中的代码,该程序由Apple Watch上的操作触发

至少现在还没有

编辑:从Xcode 6.2 Beta 2开始

现在可以从Apple Watch与父iOS应用程序进行通信

在WatchKit扩展中,通过
openparentappentapplication
调用父应用程序。可以将值字典传递给父应用程序,父应用程序可以返回值字典

手表套件扩展:

// 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"])
})
// 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)
}
iOS应用程序:

// 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"])
})
// 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)
}
//在AppDelegate.swift中
func应用程序(应用程序:UIApplication!,handleWatchKitExtensionRequest用户信息:[NSObject:AnyObject]!,回复:(([NSObject:AnyObject]!)->Void)!){
//从Apple Watch检索到的参数
println(userInfo[“value1”])
println(userInfo[“value2”])
//将值传回Apple Watch
var retValues=Dictionary()
retValues[“retVal1”]=“返回测试1”
retValues[“retVal2”]=“返回测试2”
答复(返回值)
}

与您可以使用的iPhone应用程序通信

(BOOL)openParentApplication:(NSDictionary *)userInfo
                        reply:(void (^)(NSDictionary *replyInfo,
                                        NSError *error))reply
在您的
WKInterfaceController

来自苹果文档

使用此方法与您的iOS应用程序通信。使命感 该方法使iOS在后台启动应用程序(根据需要) 并调用
应用程序:handleWatchKitExtensionRequest:reply
:方法 它的应用程序代理。该方法具有以下签名:

应用程序代理接收您传递到userInfo的字典 参数,并使用它来处理您提出的任何请求。如果是 提供应答,WatchKit执行您在中提供的块 此方法的reply参数


你的问题太宽泛了。请提出更具体的问题。根据文档,您将拥有一个在手机上运行的主应用程序、一个在手机上运行的应用程序扩展程序和一个watchkit捆绑包,这些都是传送到手表上以在手表上显示的资源。您的代码实际上都不是在手表上运行的。您只是向手表提供了一个资源包和数据。您可以使用应用程序组或。谢谢zisoft,有没有办法在memmory中的Extension和host App之间实现事件侦听器和触发器功能?我假设您正在考虑这样的问题:按下Apple watch上的按钮,然后在iPhone上启动操作。这需要保持iOS应用程序的运行,并对任何类型的信息进行轮询。到目前为止,我还没有找到这样做的方法。也许有时候,这是非常新的东西…我创建了Pull服务,它监视我们存储在NSUserDefaults中的值,如果它们发生了更改,就会通知侦听器。问题:似乎只有在应用程序启动、重新启动时才更改值。有什么想法吗?通过更新共享应用程序组容器中的文件,也可以在应用程序及其扩展名之间传递信息。然后,您可以在一个进程中写入文件,并在另一个进程中使用
NSFilePresenter
获取通知。有关如何使用后台模式(确保主应用有时间发送回复)的代码示例,请参阅“从Watch app调用父应用程序”()