前言
该 APP 基于 ApiCloud 开发,出现的问题是:在 iOS 端,提交订单后点击微信支付 APP 闪退,支付宝支付无问题,Android 端也没有问题。
准备开发和调试环境
我本机没有 ApiCloud 的开发环境,需要安装一个。使用的是 WebStrom 和 WebStorm APICloud 插件。
一、安装 WebStorm APICloud 插件
按照 ApiCloud 文档 安装 WebStorm 插件,对了,我用的是 Win10。
举个例子:
安装"ios真机同步"插件。在 'External Tools'选项中,点击 '+' 。在Create Tool中,填写如下内容:
name : ios真机同步 Program : java Parameters : -jar \$ProjectFileDir\$/webStorm-APICloud/webStorm_loader.jar \$ProjectFileDir\$/webStorm-APICloud/ \$FileDir\$ ios
安装好之后,右键点击 工作空间(文件夹) -> 弹出菜中选择 'External Tools' -> 根据需要选择相应的插件。这里报错:
Error running 'ios本地打包': Cannot run program "java" (in directory "D:\www\uuhui"): CreateProcess error=2, 系统找不到指定的文件。
是因为我没有 Java 环境,我安装 WebStorm 时安装了 JDK,但是没有添加到环境变量中。如果不想添加环境变量,在 'External Tools'选项中把 Program 中的 java 改成绝对路径即可:
C:\Program Files\JetBrains\WebStorm 2017.3.5\jre64\bin\java.exe
二、安装 WebStorm WiFi 真机同步插件
参照 官方文档 安装即可。值得注意的是需要关闭 Win10 的防火墙,手机才能连接成功。
三、安装WiFi日志输出插件
安装日志输出插件才能定位闪退的问题。按照 官方文档 安装:
把插件包中 wifilog.jar 放到目录C:\APICloud\workspace 下。
在 Settings-Tools-Terminal 面板配置如图所示内容:
cmd.exe /K "chcp 936 && java -jar C:/APICloud/workspace/wifilog.jar C:/APICloud/workspace/log_info"
按快捷键 Alt+F12启动WiFi日志输出。有些键盘可能需要同时按fn键。
又报错了:
Can't Open Local Terminal java.io.IOException: Couldn't create PTY
把 cmd 和 java 的路径都改为绝对路径即可:
"C:\Windows\System32\cmd.exe" /K "chcp 936 && "C:\Program Files\JetBrains\WebStorm 2017.3.5\jre64\bin\java.exe" -jar C:/APICloud/workspace/wifilog.jar C:/APICloud/workspace/log_info"
定位和解决问题
终于进入正题,手机上安装 AppLoader (下载地址), 连接电脑端进行真机同步,测试支付。不出意料,点击微信支付时闪退,同时捕获到了日志:
03-26 16:02:37.524 E/app3c (1): Exception name:NSSignalException
Exception reason:Signal SIGABRT was raised!
Exception stack:(
0 UZApp 0x0000000102de0f68 UZApp + 823144,
1 UZApp 0x0000000102de0b00 UZApp + 822016,
2 libsystem_platform.dylib 0x0000000182dafb40 _sigtramp + 36,
3 libsystem_pthread.dylib 0x0000000182db52f8 + 396,
4 libsystem_c.dylib 0x0000000182c0efbc abort + 140,
5 libc++abi.dylib 0x00000001823ac068 __cxa_bad_cast + 0,
6 libc++abi.dylib 0x00000001823c4568 + 44,
7 libc++abi.dylib 0x00000001823c4158 __cxa_rethrow + 144,
8 libobjc.A.dylib 0x00000001823d46e8 objc_exception_rethrow + 44,
9 CoreFoundation 0x0000000183050cc4 CFRunLoopRunSpecific + 544,
10 GraphicsServices 0x0000000184efcf84 GSEventRunModal + 100,
11 UIKit 0x000000018c7a95c4 UIApplicationMain + 236,
12 UZApp 0x0000000102de81ac UZApp + 852396,
13 libdyld.dylib 0x0000000182b7056c + 4
)
通过搜索报错信息,在官方论坛上的 这个帖子 看到了一样的问题:
原来是nonce_str 传成数字类型了。我用的当前时间戳。这个nonce_str 必须要字符串类型。给以后遇到这个问题的人留一个解决思路。
原来是格式问题,通过 Surge 抓包看了下服务端返回的数据(已打马赛克):
{
"errno": 0,
"message": "",
"data": {
"appid": "wx13af8XXXXXX",
"noncestr": "OsiLIttL",
"package": "Sign=WXPay",
"partnerid": 148000000,
"prepayid": "wx20180326165311f3eefe5a000000000",
"timestamp": 1522054391,
"paySign": "DBB418114528C06326DF14109EDBFA91"
}
}
从返回的 json 数据中可以看出 partnerid 和 timestamp 都为 int 型,iOS 端必须为 String 才可以。在服务端强制转换输出类型为 String 即可。修改后的正确返回数据应该如下:
{
"errno": 0,
"message": "",
"data": {
"appid": "wx13af8XXXXXX",
"noncestr": "OsiLIttL",
"package": "Sign=WXPay",
"partnerid": "148000000",
"prepayid": "wx20180326165311f3eefe5a000000000",
"timestamp": "1522054391",
"paySign": "DBB418114528C06326DF14109EDBFA91"
}
}
至此破案。
彩蛋一枚
ApiCloud 官方的 WebStorm 插件中没有打包成 Widget 功能,在论坛里找到了一个自动压缩打包成Widget的插件。
- 下载扩展文件,存放在 webStorm-APICloud\tools 目录下
- 在 WebStorm 的 Settings > tools > Externel Tools,点击 '+' 。在Create Tool中,填写如下内容:
name : 创建Widget包 Program : cmd Parameters : /C \$ProjectFileDir\$\webStorm-APICloud\tools\WebStormCompressWidget.exe \$FileDir\$ Working directory: \$FileDir\$
附:插件下载