关闭辅助视图控制器后,如何继续从 Apple Watch 接收消息/数据

Posted

技术标签:

【中文标题】关闭辅助视图控制器后,如何继续从 Apple Watch 接收消息/数据【英文标题】:How can I continue to receive messages/data from apple watch after dismissing a secondary view contoller 【发布时间】:2016-04-14 20:59:59 【问题描述】:

我正在编写一个应用程序,它允许我记录我的高尔夫击球并保存它们,以便我可以在 iPhone 上查看分数。问题是,虽然应用程序在启动和打开辅助视图控制器后确实收到了消息,但它在关闭任何辅助视图控制器后停止侦听消息。如果我然后切换到辅助视图控制器,它将监听消息,直到我再次关闭它。我不知道为什么根视图控制器只会在打开辅助视图控制器之前进行监听。

我正在使用sendMessage 及其相应的接收器函数在设备之间传输斯托克斯数。每个视图控制器都包含接收消息功能。

有问题的代码如下:

import UIKit // or WatchKit on Apple watch
import WatchConnectivity

class ViewController: UIViewController, WCSessionDelegate 

var session: WCSession!
let userData = NSUserDefaults.standardUserDefaults()

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    ScrollHoles.contentSize = CGSize(width: 360,height: 1090)
    if (WCSession.isSupported())
        self.session = WCSession.defaultSession()
        self.session.delegate = self
        self.session.activateSession()
        userData.synchronize()
    

发送消息功能是...

// Save Data From Strokes To standatdUserDefaults.
@IBAction func SaveButton(sender: AnyObject) 
    let hole1Score = Strokes1.text;
    userData.setObject(hole1Score, forKey: "hole1Strokes")
    userData.synchronize()
    session.sendMessage(["score1A": hole1Score!], replyHandler: nil, errorHandler: nil) // score1A becomes score1B on Apple watch

而接收消息函数是……

// Recieve Data from Apple Watch And Save It To standardUserDefaults (e.g. # of strokes).
func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) 
    let hole1Msg = message["score1B"] as? String // score1B becomes score1A on apple watch
    let hole2Msg = message["score2B"] as? String

    if (hole1Msg != nil)
        userData.setObject(hole1Msg, forKey: "hole1Strokes")
    
    if (hole2Msg != nil)
        userData.setObject(hole2Msg, forKey: "hole2Strokes")
    

所有 18 个孔的常量和 if 语句继续。

我正在使用以下内容来关闭辅助视图控制器。

@IBAction func backButton(sender: AnyObject) 
    self.dismissViewControllerAnimated(true, completion: );

【问题讨论】:

欢迎来到 Stack Overflow!获得答案的最佳方式是发布minimal reproducible example。现在这个问题的方式,我们必须先问你问题,然后才能给你一个好的答案。有关编写好问题的更多详细信息,请参阅How to Ask! 【参考方案1】:

正如this answer 中所述,WCSession 一次仅支持一个委托。

由于您是在视图控制器中设置会话,因此当您加载另一个视图控制器时会话委托会发生变化。尽管您可以解雇辅助控制器,但它仍然是会话的委托人。

这就是您的根视图控制器不再接收消息的原因,因为它不再是会话委托。

Apple 工程师推荐的方法:

正如上一个答案和developer forum posts 建议的那样,您可以创建一个会话包装器,在手机的 AppDelegate 中激活它,让它处理来自您手表的应用程序范围的消息,然后更新数据存储,或者直接传递它向观察者提供数据。

一般来说,尽快设置 Watch Connectivity 是有利的(在启动时,而不是在特定的视图控制器中)。

场外教程:

Natasha The Robot 有an excellent tutorial,它详细介绍了如何使用 Watch Connectivity 会话管理器和数据源。

【讨论】:

好的,感谢您的帮助。我想我将不得不退后一段时间,因为我很难理解如何为我的目的实施本教程的说明。我仍然是一个初学者,只是将程序作为一种爱好。我只在 Visual Basic .Net 和 C# 中完成了非常基本的工作。在这两种方法中,我都可以在表单获得焦点时简单地执行代码。在 Xcode 中玩了一会儿后,我发现覆盖 viewDidAppear 函数并在那里启动 WCSession 是可行的。在我能正确完成之前,我将使用这个工作。

以上是关于关闭辅助视图控制器后,如何继续从 Apple Watch 接收消息/数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在快速关闭第二个视图控制器后启用带有视图的自定义视图控制器

UWP 多个视图未关闭

关闭模式视图控制器后如何正确对齐 rightBarButtonItem?

滑动最后一个视图控制器后,如何关闭/弹出 UIPageViewController?

如何从弹出视图中关闭第二个视图控制器

iOS:如何检测视图控制器是不是在弹出或关闭后出现