watchkit,iOS在手表和iphone之间发送数据

时间:2014-11-20 01:38:08

标签: ios objective-c nsnotificationcenter nsnotifications watchkit

我想在手表中创建一个按钮,同时点击手表启动一个进程到我的ios应用程序。如何在2个设备之间发送数据

-(void)viewWillAppear:(BOOL)animated

{
 [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(sayHello:) name: @"sayHelloNotification" object: nil];

}

 [[NSNotificationCenter defaultCenter] postNotificationName: @"sayHelloNotification" object: nil];

在我的按钮表中,但它不起作用

7 个答案:

答案 0 :(得分:10)

如果您想将数据发送到您的父应用,请使用。

[WKInterfaceController openParentApplication:userInfo reply:^(NSDictionary *replyInfo, NSError *error){}];

在您的观看应用中调用此方法将触发AppDelegate中的回调

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply;

您必须在发送的userInfo字典中定义数据。

答案 1 :(得分:3)

AFAIK,您无法直接共享数据,例如在它们之间发送一些数据 您可以做的是将数据写入同一文件。

请参阅此博文:
http://www.atomicbird.com/blog/sharing-with-app-extensions

答案 2 :(得分:1)

WatchKit中的手表代码直接在iPhone上执行。请参阅Apple文档。!

  

在运行时,您可以通过读取和写入共享容器目录中的文件来在进程之间共享数据。要访问容器,请使用NSFileManager的containerURLForSecurityApplicationGroupIdentifier:方法检索目录的基本URL。使用提供的URL枚举目录内容或为目录中的文件创建新URL。

答案 3 :(得分:1)

不幸的是,NSNotificationCenter在应用之间无法正常工作。使用MMWormhole在WatchKit和iOS之间传递消息。

答案 4 :(得分:0)

您可以发送这样的数据..

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void(^)(NSDictionary *replyInfo))reply
{
    NSLog(@"Username %@",[userInfo objectForKey:@"username"]);
    NSLog(@"Password %@",[userInfo objectForKey:@"password"]);
}


- (IBAction)passUserInfo:(id)sender
{
    NSDictionary *userInfo = @{@"username":@"hi",@"password":@"123456"};

    [WKInterfaceController openParentApplication:userInfo reply:^(NSDictionary *replyInfo, NSError *error){

    }];// userinfo must be non-nil
}

答案 5 :(得分:0)

watchOS 2.0 开始,您只需在两台设备之间发送消息即可。您可以随时发送消息观看> iPhone (如果您的iPhone未运行,则发生活动)和 iPhone->观看,如果您的手表对手正在展示。只需检查[WCSession defaultSession].isReachable以确保您可以发送消息。

对于这两个平台的代码示例:

@import WatchConnectivity;

...

if ([WCSession defaultSession].isReachable) {
     [[WCSession defaultSession] sendMessage:@{
                                   @"Key" : @"Value"
                              } replyHandler:^(NSDictionary<NSString *,id> * _Nonnull replyMessage) {
                                   NSLog(@"Sent update is OK");
                              } errorHandler:^(NSError * _Nonnull error) {
                                   NSLog(@"Sent update with error %@", error);
                              }];
}

要对此消息做出反应,您应该在对应的WCSessionDelegate中实施:

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message;

- (void)session:(WCSession *)session didReceiveMessage:(NSDictionary<NSString *, id> *)message replyHandler:(void(^)(NSDictionary<NSString *, id> *replyMessage))replyHandler;

答案 6 :(得分:0)

最好使用 updateApplicationContext ()将数据从Watch发送到iPhone,如果数据冗余&amp;&amp; 经常更新数据: -

iPhone接收数据

func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) {
        let type = applicationContext["watchType"]!
         DispatchQueue.main.async {
            self.updateLabel.text =  " Type: \(type)"
            UserDefaults.standard.set(type, forKey: "savedState") //setObject
        }
    }

观看发送数据

func updateContext(value:String) {
    let dictionary = [ "watchType" : value ]
    do {
        try session?.updateApplicationContext(dictionary)
    }
    catch{
    }
}

Demo app

<强>替代 您可以使用sendMessage()

iPhone发送数据

 @IBAction func sendTextToWatch(_ sender: Any) {
            print("send text to watch amount")
             if let textName = textWord.text {
                session?.sendMessage(["textIndex" : textName as String], replyHandler: nil, errorHandler: nil)
            }

观看接收数据

func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
       let message:String = message["textIndex"] as! String
       textLabel.setText(message)
       print(message)
   }
  }

Demo app2

<强>已过时 openParentApplication:reply:观看OS-2不支持