iOS-WatchKit如何将信息/数据从iPhone应用程序发送到WatchKit应用程序?

iOS-WatchKit如何将信息/数据从iPhone应用程序发送到WatchKit应用程序?,ios,iphone,swift,communication,watchkit,Ios,Iphone,Swift,Communication,Watchkit,我正在创建一个WatchKit应用程序,想知道如何从iPhone向手表发送消息/数据 我知道如何使用“openParentApplication:reply:”和“应用程序:handleWatchKitExtensionRequest:reply:”以另一种方式(观看->手机)进行操作,但找不到任何关于如何从手机到观看进行通信的文档 简单的设置是,iPhone应用程序有一个按钮,按下该按钮时,手表应用程序上的标签会更新 谁能给我指出正确的方向吗 您应该尝试应用程序组,这些应用程序组用于在iOS应

我正在创建一个WatchKit应用程序,想知道如何从iPhone向手表发送消息/数据

我知道如何使用“openParentApplication:reply:”和“应用程序:handleWatchKitExtensionRequest:reply:”以另一种方式(观看->手机)进行操作,但找不到任何关于如何从手机到观看进行通信的文档

简单的设置是,iPhone应用程序有一个按钮,按下该按钮时,手表应用程序上的标签会更新


谁能给我指出正确的方向吗

您应该尝试应用程序组,这些应用程序组用于在iOS应用程序和应用程序扩展之间共享数据

在Apple Watch应用程序界面控制器类中:

    let sharedDefaults = NSUserDefaults(suiteName: "group.com.<domain>.<appname>.AppShare")
    sharedDefaults?.setObject("Came from Apple Watch App", forKey: "AppleWatchData")
    sharedDefaults?.synchronize()
让sharedDefaults=NSUserDefaults(suiteName:“group.com…AppShare”)
sharedDefaults?.setObject(“来自Apple Watch应用程序”,forKey:“AppleWatchData”)
sharedDefaults?.synchronize()
在您的家长应用程序中:

    let sharedDefaults = NSUserDefaults(suiteName: "group.com.<domain>.<appname>.AppShare")

    if let appWatchData = sharedDefaults?.objectForKey("AppleWatchData") as? NSString {
        println(appWatchData)
    }
让sharedDefaults=NSUserDefaults(suiteName:“group.com…AppShare”)
如果让appWatchData=sharedDefaults?.objectForKey(“AppleWatchData”)作为?NSString{
println(appWatchData)
}

“AppShare”是在为父应用目标的功能中创建应用组时指定的名称

首先,您必须为您的目标启用应用程序组:

然后,您可以通过
NSUserDefaults
开始写入和读取对象:

// write 
let sharedDefaults = NSUserDefaults(suiteName: appGroupName)
sharedDefaults?.setInteger(1, forKey: "myIntKey")


// read
let sharedDefaults = NSUserDefaults(suiteName: appGroupName)
let myIntValue = sharedDefaults?.integerForKey("myIntKey")
请参见

中的“与包含iOS的应用程序共享数据”一章

您可以使用此解决方案在两个不同的应用程序之间共享文件,当然也可以在watch应用程序(扩展名)和父iOS应用程序之间共享文件

第一步由@zisoft描述,启用应用程序组

然后在运行时获取组容器的URL

- (NSString *)containerPath
{
    return [[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"YOUR_APP_GROUP"] relativePath];
}
现在,您可以在给定路径下编写任何文件/文件夹,下面是我的示例代码段

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.array];

NSString *path = [[[self containerPath] stringByAppendingPathComponent:@"Library"] stringByAppendingPathComponent:@"history"];

if ([data writeToFile:path atomically:YES])
{
    NSLog(@"Success");
}
else
{
    NSLog(@"Failed");
}

这是我的工作。试着用在手表上

- (void)registerToNotification
{
    [ self unregisterToNotification ];
    CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), (__bridge const void *)(self), didReceivedDarwinNotification, CFSTR("NOTIFICATION_TO_WATCH"), NULL, CFNotificationSuspensionBehaviorDrop);
}

- (void)unregisterToNotification
{
    CFNotificationCenterRemoveObserver(CFNotificationCenterGetDarwinNotifyCenter(), (__bridge const void *)( self ), CFSTR( "NOTIFICATION_TO_WATCH" ), NULL );
}

void didReceivedDarwinNotification()
{
    // your code
}
在主应用程序中

- (void)sendNotificationToWatch:(NSDictionary*)info
{
    CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), CFSTR("NOTIFICATION_TO_WATCH"), (__bridge const void *)(self), nil, TRUE);
}

watchOS 2.0有一个新的框架,名为,允许您在两个设备之间发送消息

该框架提供了一个双向通信通道,用于在两个进程之间发送文件和数据字典

请参阅示例,其中包括使用调试模式的实际字典示例

还提供了一个WiKi示例


祝你好运。

非常感谢!您知道如何在Watch Kit扩展中正确地将KVO observer添加到应用程序组NSUserDefaults中,以便我可以获得实时更新吗?我试过了,但它在启动时不断崩溃(见新问题:)