您可以在 URL QueryItems 中发送字符串以外的对象吗?
Can you send objects other than strings in URLQueryItems?
好的,我正在构建一个 iMessage 应用程序并来回传输数据,我必须使用 URLQueryItem
s。我正在使用 SKScene
并需要传输 Int
s、CGPoint
s、图像等。阅读 Apple 的文档和我自己的尝试,您似乎只能将字符串存储在 URLQueryItem
秒。
由于这是我们来回传递数据的唯一方式,是否有(更好的)方式来存储其他类型的数据?目前我一直在这样做:
func composeMessage(theScene: GameScene) {
let conversation = activeConversation
let session = conversation?.selectedMessage?.session ?? MSSession()
let layout = MSMessageTemplateLayout()
layout.caption = "Hello world!"
let message = MSMessage(session: session)
message.layout = layout
message.summaryText = "Sent Hello World message"
var components = URLComponents()
let queryItem = URLQueryItem(name: "score",value: theScene.score.description)
components.queryItems = [queryItem] //array of queryitems
message.url = components.url!
print("SENT:",message.url?.query)
conversation?.insert(message, completionHandler: nil)
}
然后在另一方面,我必须再次将此字符串转换回 Int
。使用 CGPoint
s 这样做效率低下.. 如何在 URLQueryItem
中传递 CGPoint
之类的东西?除了将 x 和 y 值存储为字符串之外,还有其他方法吗?
编辑:这就是我从其他人那里接收数据并将其放入他们的场景的方式:
override func willBecomeActive(with conversation: MSConversation) {
// Called when the extension is about to move from the inactive to active state.
// This will happen when the extension is about to present UI.
// Use this method to configure the extension and restore previously stored state.
let val = conversation.selectedMessage?.url?.query?.description
print("GOT IT ", val)
if(val != nil)
{
scene.testTxt = val!
}
}
如您所见,要通过 URLQueryItem
传递数据,您必须将所有内容转换为 String
,因为毕竟信息应该表示为 URL: ) 对于 CGPoint
信息,您可以将 x 和 y 值分开并将它们作为两个单独的 Int
发送,转换为字符串。或者,您可以将其作为“10,5”形式的单个字符串值发送,其中 10 是 x,5 是 y 值,但在另一端,您需要先用逗号分隔值,然后再转换结果值回到 Int
s,像这样(在另一端):
let arr = cgPointValue.components(separatedBy:",")
let x = Int(arr[0])
let y = Int(arr[1])
对于其他类型的数据,您必须遵循类似的策略,即以某种方式将值转换为 String
。对于图像,如果您的资源中有图像,您应该能够只传递名称或标识号。对于外部图像,URL(如果图像都来自同一服务器,则为其中的一部分)应该可以工作。否则,如果使用 URLQueryItem
,您可能需要查看对图像数据进行 base64 编码或其他内容,但如果到了这一点,您可能需要查看您正在尝试实现的目标,以及是否有更好的方法这样做的方法,因为大图像可能会导致发送大量数据,我不确定 iMessage 应用程序是否支持它。因此,您可能还想查看 iMessage 应用程序数据传递的限制。
希望这对您有所帮助:)
您可以使用 iMessageDataKit 库在 MSMessage
对象中存储键值对。它使设置和获取数据变得非常简单直接,例如:
let message: MSMessage = MSMessage()
message.md.set(value: 7, forKey: "moveCount")
message.md.set(value: "john", forKey: "username")
message.md.set(values: [15.2, 70.1], forKey: "startPoint")
message.md.set(values: [20, 20], forKey: "boxSize")
if let moveCount = message.md.integer(forKey: "moveCount") {
print(moveCount)
}
if let username = message.md.string(forKey: "username") {
print(username)
}
if let startPoint = message.md.values(forKey: "startPoint") {
print("x: \(startPoint[0])")
print("y: \(startPoint[1])")
}
if let boxSize = message.md.values(forKey: "boxSize") {
let size = CGSize(width: CGFloat(boxSize[0] as? Float ?? 0),
height: CGFloat(boxSize[1] as? Float ?? 0))
print("box size: \(size)")
}
(免责声明:我是 iMessageDataKit
的作者)
好的,我正在构建一个 iMessage 应用程序并来回传输数据,我必须使用 URLQueryItem
s。我正在使用 SKScene
并需要传输 Int
s、CGPoint
s、图像等。阅读 Apple 的文档和我自己的尝试,您似乎只能将字符串存储在 URLQueryItem
秒。
由于这是我们来回传递数据的唯一方式,是否有(更好的)方式来存储其他类型的数据?目前我一直在这样做:
func composeMessage(theScene: GameScene) {
let conversation = activeConversation
let session = conversation?.selectedMessage?.session ?? MSSession()
let layout = MSMessageTemplateLayout()
layout.caption = "Hello world!"
let message = MSMessage(session: session)
message.layout = layout
message.summaryText = "Sent Hello World message"
var components = URLComponents()
let queryItem = URLQueryItem(name: "score",value: theScene.score.description)
components.queryItems = [queryItem] //array of queryitems
message.url = components.url!
print("SENT:",message.url?.query)
conversation?.insert(message, completionHandler: nil)
}
然后在另一方面,我必须再次将此字符串转换回 Int
。使用 CGPoint
s 这样做效率低下.. 如何在 URLQueryItem
中传递 CGPoint
之类的东西?除了将 x 和 y 值存储为字符串之外,还有其他方法吗?
编辑:这就是我从其他人那里接收数据并将其放入他们的场景的方式:
override func willBecomeActive(with conversation: MSConversation) {
// Called when the extension is about to move from the inactive to active state.
// This will happen when the extension is about to present UI.
// Use this method to configure the extension and restore previously stored state.
let val = conversation.selectedMessage?.url?.query?.description
print("GOT IT ", val)
if(val != nil)
{
scene.testTxt = val!
}
}
如您所见,要通过 URLQueryItem
传递数据,您必须将所有内容转换为 String
,因为毕竟信息应该表示为 URL: ) 对于 CGPoint
信息,您可以将 x 和 y 值分开并将它们作为两个单独的 Int
发送,转换为字符串。或者,您可以将其作为“10,5”形式的单个字符串值发送,其中 10 是 x,5 是 y 值,但在另一端,您需要先用逗号分隔值,然后再转换结果值回到 Int
s,像这样(在另一端):
let arr = cgPointValue.components(separatedBy:",")
let x = Int(arr[0])
let y = Int(arr[1])
对于其他类型的数据,您必须遵循类似的策略,即以某种方式将值转换为 String
。对于图像,如果您的资源中有图像,您应该能够只传递名称或标识号。对于外部图像,URL(如果图像都来自同一服务器,则为其中的一部分)应该可以工作。否则,如果使用 URLQueryItem
,您可能需要查看对图像数据进行 base64 编码或其他内容,但如果到了这一点,您可能需要查看您正在尝试实现的目标,以及是否有更好的方法这样做的方法,因为大图像可能会导致发送大量数据,我不确定 iMessage 应用程序是否支持它。因此,您可能还想查看 iMessage 应用程序数据传递的限制。
希望这对您有所帮助:)
您可以使用 iMessageDataKit 库在 MSMessage
对象中存储键值对。它使设置和获取数据变得非常简单直接,例如:
let message: MSMessage = MSMessage()
message.md.set(value: 7, forKey: "moveCount")
message.md.set(value: "john", forKey: "username")
message.md.set(values: [15.2, 70.1], forKey: "startPoint")
message.md.set(values: [20, 20], forKey: "boxSize")
if let moveCount = message.md.integer(forKey: "moveCount") {
print(moveCount)
}
if let username = message.md.string(forKey: "username") {
print(username)
}
if let startPoint = message.md.values(forKey: "startPoint") {
print("x: \(startPoint[0])")
print("y: \(startPoint[1])")
}
if let boxSize = message.md.values(forKey: "boxSize") {
let size = CGSize(width: CGFloat(boxSize[0] as? Float ?? 0),
height: CGFloat(boxSize[1] as? Float ?? 0))
print("box size: \(size)")
}
(免责声明:我是 iMessageDataKit
的作者)