代码编织梦想

前言

就在今天遇到一个很诡异的技术问题,Unity调用Quick苹果SDK支付。Quick 支付需要游戏(Unity)传入一些数据到原生OC中,格式是json,在OC中打印的日志看着数据是没问题的,但是解析json却一直显示失败 。问题最终还是解决了,用倒推法给大家说一下解决的思路。

1.jpg

场景重现

下面代码是OC中定义的支付方法,void *payData是接Unity中传过来的支付json数据,当用户点击支付按钮的时候,Unity把支付的数据传到IOS 原生OC中。没有了解过的可以看下之前写过的文章 :Unity接入ios SDK(小7手游)没有你想的那么难

//支付
void SDk_pay(void *payData){
       NSLog(@"SDk_pay"); //控制台展示这段日志说明Unity调用到了OC的支付方法

       NSString *idList = [NSString stringWithUTF8String:payData];
       NSLog(@"获取的支付数据=======:%@",idList);

       //将解析得到的内容存放字典中,编码格式为UTF8,防止取值的时候发生乱码

       NSData *jsonData = [idList dataUsingEncoding:NSUTF8StringEncoding];
       NSError *err;
       NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
                                               options:NSJSONReadingMutableContainers error:&err];
       
       if(err) {
           NSLog(@"json解析失败:%@",err);
           return;
       }
}

当点击完成支付按钮后,控制台显示Json解析异常日志如下所示:

json解析失败:Error Domain=NSCocoaErrorDomain Code=3840 "Unescaped control character around character 206." 
UserInfo={NSDebugDescription=Unescaped control character around character 206.}

解决问题思路和过程

上面解析Json异常去Google 上去搜了一下,根据搜索内容的解释,出现这个问题的原因就是:返回的Json字符串里面有换行符、空格。既然知道是什么原因导致的,那么我们一步步分析一下。

NSLog(@“SDk_pay”);控制台有这么一段日志,说明Unity调用OC的支付方法是没问题的,成功调用到了。再看下一个日志点,获取Unity传过来的数据 idList ,传过来的数据字段如下代码:

payLog.png

看着上面显示的日志乍一看返回的数据都是正常,没有什么特殊啊?但是异常报错不会错的。于是把我上面的Json数据放到了格式化工具上查看,果然发现了问题所在。Json中 orderid字段多一个空格(截图中小红点就是一个空格)。

formatJson.png

既然知道是订单号的问题,我们来倒推一下,订单号(orderid字段)是拼的加密字符串由游戏服务器原样返回,其中一部分数据取自客户端的ChannelId。我把代码贴出来乍一看还是没问题吧。

method.png

其实所有问题的关键都指向了return MakeStringCopy(“10184”)这货。最开始我定位到GetSdkChannelId()方法里了,但是怎么看怎么也不像有空格的样子啊?于是我尝试用光标一点点试看有没有空格,一试果然试出问题了。

下面截图就是我从有问题的那段注释里copy出来放到VSCode里面,一看10184后面已有一个空格的。当时我都惊了,同一个字符串在Xcode里面显示的正常,在VSCode里面却多出一个空格。

Xcode(11.5版本)还有这个操作? 由于我不是专业搞IOS的,我查了资料还有询问了一些写IOS的朋友。最终结论基本上都是Xcode编译器自带的Bug。把空格去掉继续跑程序,一点事都没有。事情就这样解决了,你学废了吗?

There is a problem.png

结尾

如果文章对你有帮助留下一个赞呗,你的支持是我继续写下去的动力,如有不对劳烦大家多多指正。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/baidu_31156101/article/details/111084275

Unity中连接MySQL 错误:KeyNotFoundException: The given key was not present in the dictionary. 解决办法-爱代码爱编程

  一:连接数据库时报错 string sql = string.Format("Database={0};Data Source={1};User Id={2};Password={3};", database, host, id, pwd, "3306"); 在命令后面加上“charset=utf8”定义字符串的编码格式。 string sql

ECS(一) 创建物体到场景中-爱代码爱编程

using Unity.Collections; using Unity.Entities; using Unity.Mathematics; using Unity.Rendering; using Unity.Transforms; using UnityEngine; using Random = UnityEngine.Random; publi

Unity一键自动将多个FBX文件生成AB包+又一些小玩意-爱代码爱编程

今天闲来无事,便写了这个博客,大家感兴趣可以看看 首先,由于FBX是外部文件,并不能直接进行处理,所以我的思路是现将FBX文件制作成预制体,然后再打成AB包。 首先我们先在Assets工程目录下创建一个Editor文件夹,再新建一个脚本,我们将它取名为“MyCreateAB”,记住,一定要把这个脚本放在Editor目录下,只有这样Unity才能够将其识别为

Unity(四):UGUI实例演示-爱代码爱编程

最终效果展示 场景布置 创建Unity2D项目创建Panel控件作为背景创建关键基础控件(Button Text)重命名控件并修改控件样式创建新场景作为点击按钮时加载的场景向新场景添加任意控件添加构建场景用于在脚本中获取场景使用记住场景编号脚本配置 新建按钮脚本编写脚本# Assets\Scripts\ShowScript.cs using Sy

unity开发记录:c# 简单单例,标准单例,泛型单例示例-爱代码爱编程

文章目录 简单单例标准单例泛型单例-正确示例泛型单例-错误示例 简单单例 public class Singleton { private Singleton(){} public static readonly Singleton instance = new Singleton(); } 标准单例 public cl

Unity制作地震防空知识视频讲解程序-爱代码爱编程

https://www.bilibili.com/video/BV1Hy4y1S78b/ 定制访问https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111debJplIKu&ft=t&id=616168034838 主场景代码 using System.Collection

iOS底层探索--内存管理(下)-爱代码爱编程

iOS内存管理(上)简单的说了下retain、release和dealloc。不过关于内存管理还有个比较重要的东西autoreleasepool,也是兄弟们常说的自动释放池作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:196800191,加群密码:112233,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试

iOS开发实战-第4节-进一步完善微博页面-爱代码爱编程

本节内容 为上一节创建的微博页面增加插图 知识点 为重复的方法新建一个函数,抽象出创建图片的方法。 按照 4:3 的宽高比切分图片。 使用 Divider() 绘制一个细分割线 Post 结构体中仅保存于数据有关的内容,而将View相关的只读属性存放在extension中。 添加评论和点赞按钮。 修改TableView默认样式,不显示默认的

iOS开发实战-第3节-解析json-爱代码爱编程

本节内容 Codable 解码以解析json swift 的异常处理方法 知识点 Codable 可编码 A type that can convert itself into and out of an external representation. 一个可以将自己转换为和脱离外部表示的类型。 通常是创建一个实例对象,在实例对象中创

iOS OC动态运行时(runtime)~动态特性表现-爱代码爱编程

一、概念: 因为运行时 runtime 是 必须到运行时(run time)才会做一些事情; 所以OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载; 动态:主要是将数据类型的确定由编译时,推迟到了运行时。之所以叫做动态, 二、iOS OC动态运行时~动态类型 1.动态类型,就是id类型。 2.动态类型是跟静态类

微软将开始强制部分用户升级 Windows 10 | 新闻拍一拍-爱代码爱编程

  导读:更多:• WPS 进入全国计算机二级考试 • Brave 被迫剔除了 iPad/iOS 版本的广告奖励项目 本文字数:935,阅读时长大约:1分钟 作者:硬核老王 微软将开始强制部分用户升级 Windows 10 在微软宣布结束对 Windows 10 版本 1903 的支持之后,从本月开始,微软将开始强制部分用户升级

好家伙,微信能设置2个头像了!-爱代码爱编程

上一期为大家分享了一个微信小技能,改昵称。 没想到反响很不错, 小伙伴玩得不亦乐乎,留言区变成一片彩色的海洋, 既然大家对这类微信小技能如此感兴趣。 今天,再给小伙伴分享一个微信玩法——双头像。 效果如下图所示↓ ,安卓iOS都支持哦。 小图查看的不太清晰,给你们实际操作一遍仔细瞧瞧。 制作步骤非常简单,进入工具后,顶部显示的是