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 模拟器)。已经检查了所有要激活的WCSesssionActivationState
,WCSession.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 工作的主要内容,如果未能解决你的问题,请参考以下文章
数据未从 iphone 传输到真实设备上的 iWatch (AppleWatch)