SRM*_*RMR 2 swift watchkit xcode7 watchos-2
我不敢didReceiveApplicationContext打电话。有任何想法吗?
InterfaceController:
import WatchKit
import Foundation
import WatchConnectivity
class InterfaceController: WKInterfaceController, WCSessionDelegate {
@IBOutlet var colorLabel: WKInterfaceLabel!
private let session: WCSession? = WCSession.isSupported() ? WCSession.defaultSession() : nil
override init() {
super.init()
session?.delegate = self
session?.activateSession()
}
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
}
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]){
let colors : String = applicationContext["color"] as! String
colorLabel.setText(colors)
NSLog("session did receive application context")
}
}
Run Code Online (Sandbox Code Playgroud)
我一直在跟随本教程:http : //www.kristinathai.com/watchos-2-how-to-communicate-between-devices-using-watch-connectivity/
否NSLog或colorLabel发生的情况。不知道我在想什么。谢谢!
这似乎是一个典型的“开发阶段”问题!
该WCSession.defaultSession.applicationContext是缓冲上的iOS设备,所以它只是转移到表(扩展)一次,如果它不会改变。
这导致了一个奇怪的发现,即当再次在iOS应用中调用WCSession.defaultSession.updateApplicationContext时,似乎没有调用手表扩展' didReveiveApplicationContext: ' 。(尝试在扩展名中调用WSSession.defaultSession.receivedApplicationContext来查找实际上已提供了较早传输的上下文)!
在测试情况下,向上下文字典中添加一个“ changeer ”对象(例如UUID对象,或者甚至更好的是NSDate.date)非常有帮助。这将确保上下文已更改(与缓冲的上下文相比)并再次传输(导致对didReceiveApplicationContext的调用):-)
NSError* error = nil;
[WCSession.defaultSession updateApplicationContext:@{ @"yourKey" : @"your content",
@"forceTransfer" : NSDate.date }
error:&error];
Run Code Online (Sandbox Code Playgroud)
并且:不要忘了在应用的生产版本中删除它,因为-当然,这会导致应用与手表扩展之间不必要的数据传输!
PS:选中的答案通过创建新应用来解决此问题。然后以这种方式刷新所有缓冲区...
小智 2
我将上面的代码复制到一个新的手表应用程序中,它工作正常。错误必定出在发送方。您确定正在调用 iOS 应用程序中的代码吗?我假设您正在使用 Xcode 和两个模拟器,一个用于 iOS 应用程序,一个用于 WatchApp。
除非您在手机模拟器上打开应用程序,否则 iOS 端的代码不会运行。在 iOS 端,您在何处以及如何发出 updateAppContext 调用?
在我的测试中,这就是我在 iOS 端添加到 ViewController.swift 中的所有内容(直到我在 iPhone 上启动 iOS 应用程序后才会触发此代码。)
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let session = WCSession.defaultSession()
session.delegate = self
session.activateSession()
do {
try session.updateApplicationContext( ["color" : "Red" ])
} catch _ {
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2721 次 |
| 最近记录: |