AppleWatch 模拟器和 iPhone 模拟器之间的 transferUserInfo 停止从 Xcode 11 工作

Posted

技术标签:

【中文标题】AppleWatch 模拟器和 iPhone 模拟器之间的 transferUserInfo 停止从 Xcode 11 工作【英文标题】:transferUserInfo between AppleWatch simulator and iPhone simulator stop working from Xcode 11 【发布时间】:2019-12-26 18:05:24 【问题描述】:

我有一个依赖手表应用程序,它曾经在 Xcode 10.2.1 的模拟中正常工作,但是当我更新到 Xcode 11.x.x 时,传输数据似乎不再工作了。

在 Xcode 10.x.x 中,WatchKit App 的目标总是触发 ios 和 Watch App。但从 Xcode 11 开始,它只触发 Apple Watch 模拟器。我已经仔细检查以使用更正的配对模拟器(更正配对的 iPhone + Apple Watch 模拟器)。已经检查了所有要激活的WCSesssionActivationStateWCSession.default.isReachable 为真,session didFinish userInfoTransfer 被调用为同一个目标,但在另一个目标中,session didReceiveUserInfo 根本没有被调用。

还有什么我需要做的配置吗?有人有同样的问题吗? 非常感谢任何帮助!

这是主 App ViewController 中的代码

import UIKit
import WatchConnectivity

class ViewController: UIViewController, WCSessionDelegate 

    @IBOutlet weak var textFieldMessage : UITextField!
    @IBOutlet weak var buttonSend : UIButton!
    var wcSession : WCSession!

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        wcSession = WCSession.default
        wcSession.delegate = self
        wcSession.activate()
    

    //MARK: - Button Actions

    @IBAction func clickSendMessage(_ sender : UIButton) 

        let message = ["message" : textFieldMessage.text!]
        do 
            try wcSession.updateApplicationContext(message)

            if wcSession.activationState == .activated 
                if wcSession.isReachable 
                    let data = ["text": "User info from the iphone"]
                    wcSession.transferUserInfo(data)
                
            
         catch 
            print("Something went wrong")
        
    

    // MARK: - WCSessionDelegate

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) 
        NSLog("%@", "activationDidCompleteWith activationState:\(activationState) error:\(String(describing: error))")
    

    func sessionDidBecomeInactive(_ session: WCSession) 
        print("%@", "sessionDidBecomeInactive: \(session)")
    

    func sessionDidDeactivate(_ session: WCSession) 
        print("%@", "sessionDidDeactivate: \(session)")
    

    func sessionWatchStateDidChange(_ session: WCSession) 
        print("%@", "sessionWatchStateDidChange: \(session)")
    

    func session(_ session: WCSession, didFinish userInfoTransfer: WCSessionUserInfoTransfer, error: Error?) 
        DispatchQueue.main.async 
            if session.isReachable 
                print("Transfered data")
            
        
    

WatchKit Extension中的InterfaceController

import WatchKit
import Foundation
import WatchConnectivity

class InterfaceController: WKInterfaceController, WCSessionDelegate 

    var session : WCSession?
    @IBOutlet weak var sessionLabel : WKInterfaceLabel!

    override func willActivate() 
        // This method is called when watch view controller is about to be visible to user
        super.willActivate()

        session = WCSession.default
        session?.delegate = self
        session?.activate()
    

    // MARK: - WCSessionDelegate

    func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) 
        NSLog("%@", "activationDidCompleteWith activationState:\(activationState) error:\(String(describing: error))")
    

    func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) 
        NSLog("didReceiveApplicationContext : %@", applicationContext)
        sessionLabel.setText(applicationContext["message"] as? String)
    

    func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) 
        print("9. InterfaceController: ", "didReceiveUserInfo")
        DispatchQueue.main.async 
            if let text = userInfo["text"] as? String 
                print(text)
            
        
    

奇怪的是wcSession.updateApplicationContext(message) 工作正常,但wcSession.transferUserInfo(data) 不向 Apple Watch 发送数据,甚至代码在 print("Transfered data") 中用于 ViewController

【问题讨论】:

【参考方案1】:

对于那些面临同样问题的人。我仍然无法使用 wcSession.transferUserInfo 发送数据,但它可以与另一个 api wcSession.sendMessage 一起使用。似乎迁移逻辑以使用 sendMessage 是目前的解决方法。

参考:https://forums.developer.apple.com/thread/127460

【讨论】:

这对我也有用!出于某种原因,transferUserInfo 在 iOS 13 中不再适用于我,但 wcSession.sendMessage 有效。

以上是关于AppleWatch 模拟器和 iPhone 模拟器之间的 transferUserInfo 停止从 Xcode 11 工作的主要内容,如果未能解决你的问题,请参考以下文章

在 Apple Watch 模拟器上推送通知

数据未从 iphone 传输到真实设备上的 iWatch (AppleWatch)

如何在模拟器中看到苹果手表的主屏幕?

Apple Watch 中的本地通知

如何在模拟器上更改 Apple Watch 系统的文本大小?

Apple Watch 应用程序的应用程序图标