是否可以通过手表连接将复杂的阵列从iPhone发送到AppleWatch?

时间:2016-01-19 16:03:48

标签: ios iphone arrays swift watch-os-2

将数据从 iOS 传递到 WatchOS 2.0

时出现问题

我想将ArrayList发送到 WatchOS ,但我的ArrayList没有类似StringInt的类型,只有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包含不受支持的类型。

这就是我想要获取数据的方式。如果我发送BoolsIntegersString这有效,但不适用于像Arrays那样:

let userList: [UserProfile] = applicationContext["UsersList"] as! [UserProfile]
let blackList: [UserProfile] = applicationContext["BlackList"] as! [UserProfile]
let friendList: [UserProfile] = applicationContext["FriendList"] as! [UserProfile]

希望有人能帮助我解决这个问题。

4 个答案:

答案 0 :(得分:1)

UserProfile对象friendList,blackList,用户尚未序列化,也无法直接发送给Apple Watch。

您可以在将它们发送到Apple Watch之前将它们转换为词典。

答案 1 :(得分:1)

您可以使用属性列表中允许的任何类型:

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/AboutPropertyLists/AboutPropertyLists.html

由于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: -

UserDefaults

您可以分享您的" 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[])