将数据从 iOS 传递到 WatchOS 2.0
时出现问题我想将ArrayList
发送到 WatchOS ,但我的ArrayList
没有类似String
,Int
的类型,只有Object
我生成的。
// here I fetch my Lists with Users
var friendList: [UserProfile] = Utils().loadUsers("friendList")
var blackList: [UserProfile] = Utils().loadUsers("blackList")
var users: [UserProfile] = Utils().loadUsers("UsersList")
// here I put the Lists in the Dictionary in order to send this Dictionary to Watch
let dictionary: [String: AnyObject]=[
"UsersList" : self.users,
"BlackList" : self.blackList,
"FriendList" : self.friendList
]
WCSession.defaultSession().sendMessage(dictionary, replyHandler: { (data) -> Void in
// handle the response from the device
}) { (error) -> Void in
print("error: \(error.localizedDescription)")
}
在我的WatchApp类中,我尝试获取数据,但出现以下错误:
错误:Payload包含不受支持的类型。
这就是我想要获取数据的方式。如果我发送Bools
,Integers
或String
这有效,但不适用于像Arrays
那样:
let userList: [UserProfile] = applicationContext["UsersList"] as! [UserProfile]
let blackList: [UserProfile] = applicationContext["BlackList"] as! [UserProfile]
let friendList: [UserProfile] = applicationContext["FriendList"] as! [UserProfile]
希望有人能帮助我解决这个问题。
答案 0 :(得分:1)
UserProfile对象friendList,blackList,用户尚未序列化,也无法直接发送给Apple Watch。
您可以在将它们发送到Apple Watch之前将它们转换为词典。
答案 1 :(得分:1)
您可以使用属性列表中允许的任何类型:
由于NSString是其中一种数据类型,因此您可以使用任何可以序列化为字符串的内容。
一个示例:您可以将对象序列化为JSON字符串,将其作为String发送到监视器,并使用JSON从中创建对象。这就是我选择的方式。
答案 2 :(得分:1)
第1步:您需要让NSCoding正常工作。
import Foundation
class UserProfile : NSObject, NSCoding {
/// The name of the activity.
var name: String
/**
The constructor
:param: name The name of the user.
*/
init(name: String, start: Int, end: Int) {
self.name = name
}
required init(coder aDecoder: NSCoder) {
name = aDecoder.decodeObjectForKey("Name") as! String
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(name, forKey: "Name")
}
}
第2步:设置将接收数据的功能:
func session(session: WCSession, didReceiveMessageData messageData: NSData, replyHandler: (NSData) -> Void) {
// Set the same class to avoid the name change for every target.
NSKeyedUnarchiver.setClass(UserProfile.self, forClassName: "UserProfile")
// Unarchive the activity object passed from the paired device.
guard let data = NSKeyedUnarchiver.unarchiveObjectWithData(messageData) else {
return
}
let userProfiles = data as! [UserProfile]
//Send the replyHandler you might need
let response: NSData = //...
replyHandler(response)
}
}
第3步:设置将发送数据的功能:
let userProfiles: [UserProfile] = //some of your UserProfiles...
// Set the same class to avoid the name change for every target.
NSKeyedArchiver.setClassName("UserProfile", forClass: UserProfile.self)
// Archive the object to NSData.
let data = NSKeyedArchiver.archivedDataWithRootObject(userProfiles)
session.sendMessageData(data, replyHandler: { (data) -> Void in
// handle the response from the device
}) { (error) -> Void in
print("error: \(error.localizedDescription)")
}
答案 3 :(得分:1)
如果Watch没有更新用户的ArrayList,最好使用here: -
您可以分享您的" ArrayListObj "通过在应用程序和观察目标上启用组的功能,并通过目标(iPhone和手表)中的用户默认进行共享。
// iPhone共享Userinfo func sharedUserInfo(){
func sharedInfo() {
if let userDefaults = UserDefaults(suiteName: "group.watch.app.com") {
let userInfo = userDefaults.string(forKey: "UserInfo")
}
}
//观看提取信息
String(byte[])