iOS应用通过短信收发JSON数据的实现技术咨询
嗨,我来帮你理清实现这个需求的可行方案——你已经找对了发送的方向(用MFMessageComposeViewController),核心难点就在接收端怎么解析短信里的JSON数据。下面给你两种靠谱的实现思路:
方案一:结合深度链接(URL Scheme/Universal Links)实现无缝唤起+数据传递
直接在短信里发纯JSON字符串的话,用户体验很差(一堆类似乱码的字符),而且系统不会自动唤起你的APP。所以更流畅的方式是把JSON编码后嵌入到你的APP的深度链接里,用户点击短信里的链接就能直接打开APP,同时把数据传递过去。
发送端步骤:
- 把要发送的JSON数据序列化为字符串,再转成Base64编码(避免URL转义的麻烦)
- 把编码后的字符串拼接到你的APP的自定义URL里
- 将这个URL放进短信内容,还可以加友好的提示文字
示例代码:
// 准备要发送的JSON数据 let sharedData: [String: Any] = [ "itemId": "789", "itemName": "My Shared Item", "metadata": ["createdAt": Date().timeIntervalSince1970] ] do { // 序列化JSON为Data let jsonData = try JSONSerialization.data(withJSONObject: sharedData, options: []) // 转成Base64字符串 let base64Payload = jsonData.base64EncodedString() // 拼接成自定义深度链接 let deepLink = "yourapp://share-data?payload=\(base64Payload)" // 初始化短信控制器 let messageVC = MFMessageComposeViewController() messageVC.messageComposeDelegate = self messageVC.recipients = ["138xxxxxxx"] // 接收方手机号 messageVC.body = "点击链接查看我共享的数据:\(deepLink)" present(messageVC, animated: true) } catch { print("JSON处理失败:\(error.localizedDescription)") }
接收端步骤:
- 在
Info.plist里配置你的自定义URL Scheme(比如yourapp) - 在AppDelegate/SceneDelegate里监听URL唤起事件,解析URL里的
payload参数 - 解码Base64字符串得到原始JSON数据,然后做业务逻辑处理
示例代码(iOS 13+ 用SceneDelegate):
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let url = URLContexts.first?.url else { return } // 验证是我们的APP的深度链接 guard url.scheme == "yourapp", url.host == "share-data" else { return } // 解析payload参数 let components = URLComponents(url: url, resolvingAgainstBaseURL: false) guard let payload = components?.queryItems?.first(where: { $0.name == "payload" })?.value else { // 提示用户链接无效 return } // 解码Base64得到JSON Data guard let jsonData = Data(base64Encoded: payload) else { // 提示数据损坏 return } do { // 解析JSON为字典 if let receivedData = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { // 这里就可以使用接收的数据了,比如跳转到对应的页面展示 print("收到共享数据:\(receivedData)") } } catch { print("JSON解析失败:\(error.localizedDescription)") } }
小贴士:如果用Universal Links代替自定义URL Scheme,用户点击链接时不会弹出“是否允许打开APP”的提示,体验更顺滑,但需要你有自己的域名并完成苹果的验证配置,适合正式环境使用。
方案二:直接解析短信中的纯JSON字符串(适合简单场景)
如果你不想配置深度链接,也可以让用户手动复制短信里的JSON字符串,然后在你的APP里提供“粘贴导入”的功能。这种方式实现简单,但用户操作步骤多一点。
发送端步骤:
直接把JSON字符串放进短信内容即可,比如:
do { let jsonData = try JSONSerialization.data(withJSONObject: sharedData, options: .prettyPrinted) guard let jsonString = String(data: jsonData, encoding: .utf8) else { return } let messageVC = MFMessageComposeViewController() messageVC.messageComposeDelegate = self messageVC.recipients = ["138xxxxxxx"] messageVC.body = "复制以下内容到APP导入:\n\(jsonString)" present(messageVC, animated: true) } catch { /* 处理错误 */ }
接收端步骤:
在APP里加一个“粘贴导入”按钮,点击后读取粘贴板内容并解析JSON:
@IBAction func importFromClipboard(_ sender: UIButton) { guard let clipboardContent = UIPasteboard.general.string else { // 提示用户粘贴板为空 return } guard let jsonData = clipboardContent.data(using: .utf8) else { // 提示内容不是有效的字符串 return } do { if let importedData = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] { // 使用导入的数据 print("导入数据成功:\(importedData)") } } catch { // 提示用户内容不是有效的JSON } }
注意事项
- 短信内容有长度限制,如果你要传的JSON很大,建议先把JSON上传到你的服务器,然后短信里只传服务器的下载链接(不过这需要依赖后端服务)
- 所有涉及JSON序列化/反序列化、Base64编码/解码的步骤都要做好错误处理,给用户清晰的提示
- 如果用深度链接,一定要测试不同iOS版本的唤起逻辑,确保兼容
内容的提问来源于stack exchange,提问作者Luke Allen
相关产品推荐
相关产品推荐

