首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于sendMessage - WatchConnectivity的问题

关于sendMessage - WatchConnectivity的问题
EN

Stack Overflow用户
提问于 2016-04-09 16:49:17
回答 1查看 1.7K关注 0票数 1

我一直将NatashaTheRobot单例用于WCSession,但无法使sendMessage正常工作。

我的目标是从Watch应用程序发送消息到iOS应用程序,并将字典从iOS应用转移到查看应用程序。

这是我在ExtensionDelegate中的代码

代码语言:javascript
复制
import WatchKit
import WatchConnectivity

class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate {

var session:WCSession!
var boolCheck = Int()

func applicationDidFinishLaunching() {

    WatchSessionManager.sharedManager.startSession()
    print("Here i am")
}

func applicationDidBecomeActive() {
    print("I AWOKE")
}

func applicationWillResignActive() {

}

}

class WatchSessionManager: NSObject, WCSessionDelegate {

static let sharedManager = WatchSessionManager()
private override init() {
    super.init()
}

private let session: WCSession = WCSession.defaultSession()

func startSession() {
    session.delegate = self
    session.activateSession()
    if WCSession.isSupported(){
        self.session.sendMessage(["b":"peek"], replyHandler: nil, errorHandler: nil)
        print("works")
    } else {
        print("don't work")
    }

func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {
    let sweetN = message["b"]! as? String
    dispatch_async(dispatch_get_main_queue(), {
        if sweetN == "insertData1" {
            NSNotificationCenter.defaultCenter().postNotificationName("sweetData1", object: nil)
    })
}
func sendMessage(message: [String : AnyObject],
    replyHandler: (([String : AnyObject]) -> Void)? = nil,
    errorHandler: ((NSError) -> Void)? = nil)
{
    session.sendMessage(message, replyHandler: replyHandler, errorHandler: errorHandler)
    print("this is message \(replyHandler)")
    var pretty = replyHandler
}

下面是我在WCSingleton中的iOS应用程序中的代码(与AppDelegate分开)

代码语言:javascript
复制
import WatchConnectivity

@available(iOS 9.0, *)
class WatchSessionManager: NSObject, WCSessionDelegate {

static let sharedManager = WatchSessionManager()
private override init() {
    super.init()
}

private let session: WCSession? = WCSession.isSupported() ? WCSession.defaultSession() : nil

private var validSession: WCSession? {

    if let session = session where session.paired && session.watchAppInstalled {
        return session
    }
    return nil
}

func startSession() {
    session?.delegate = self
    session?.activateSession()
}
func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {
    //receieve messages from watch
    print(message["b"]! as? String)
    let sweetN = message["b"]! as? String
    dispatch_async(dispatch_get_main_queue(), {
        if sweetN == "peek"{
            NSNotificationCenter.defaultCenter().postNotificationName("giveMeInfo", object: nil)
        }
     }
    })
}

@available(iOS 9.0, *)
extension WatchSessionManager {

func sendMessage(message: [String : AnyObject],
    replyHandler: (([String : AnyObject]) -> Void)? = nil,
    errorHandler: ((NSError) -> Void)? = nil)
{
    session!.sendMessage(message, replyHandler: replyHandler, errorHandler: errorHandler)
}

}

下面是我在ViewController中使用的方法(从NSNotificationCenter中激发)。然而,这部分代码从未得到执行(这很奇怪,因为当我使用applicationContext时,它工作得很好)。

代码语言:javascript
复制
func giveMeInfo(){
        let linesAdd1 = linesAdd as! AnyObject
        WatchSessionManager.sharedManager.sendMessage(["a":linesAdd1])
}

任何关于如何让所有这些部件一起工作的见解都是非常受欢迎的!

EN

回答 1

Stack Overflow用户

发布于 2016-04-26 13:16:13

在我看来,您的代码有点混乱,而且看起来很正确,但是由于以下原因,这种方法会遇到麻烦:

  • 如果在ViewController中接收到通知,而监视更改为非活动状态,则sendMessage()方法将无法将数据发回: 在WatchKit扩展中调用此方法时,它是活动的,运行时会在后台唤醒相应的iOS应用程序,并使其可访问。从iOS应用程序调用此方法不会唤醒相应的WatchKit扩展。如果调用此方法,且对应方不可访问(或在消息传递之前变得不可访问),则执行errorHandler块时会出现适当的错误。如果消息参数包含非属性列表数据类型,也可以调用errorHandler块。
  • 如果您想要返回数据,那么您应该使用一个回复块。但是在您的配置中,这些块将不会被调用,因为:

sendMessage(reply==nil) ->didReceiveMessage(.电文:)

sendMessage(回复!=零)->didReceiveMessage(.信息: replyHandler:)

  • 另一方面,如果您使用contextMethod:使用此方法将数据项字典传递给相应的应用程序。当机会出现时,系统发送上下文数据,目标是在对应方醒来时准备好使用这些数据。对应方的会话将数据传递给会话:didReceiveUpdate:委托的方法。对应方还可以从其会话的receivedApplicationContext属性检索数据。

我希望这会有所帮助;)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36519863

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档