问题描述:
提交页面时显示,参数错误。
这个一般是 Appkey 与 AppSecrect 参数错误导致的,排查方法:
- 一方面可以与后台数据比对,排查该值是否正确,比如有可能是:项目中的 AppKey 或 AppSecret 与控制台中的没完全对应。
- 如果值正确,那么需要排查是否为内存方面的问题,导致网络请求时没有发送到服务端。一般为 YWFeedbackKit 对象被提前释放。
下面举例说明一下第二种情况:
比如有用户采用下面的方式打开用户反馈页面:
- [backcolor=transparent] [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]void[backcolor=transparent])[backcolor=transparent]viewDidLoad [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]super[backcolor=transparent] viewDidLoad[backcolor=transparent]];
- [backcolor=transparent] [backcolor=transparent]FeedbackHelper[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]helper [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent][[backcolor=transparent]FeedbackHelper[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent]];
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]helper openFeedbackViewController[backcolor=transparent]];[backcolor=transparent]
- [backcolor=transparent]}
在 FeedbackHelper 中有下面的逻辑:
- [backcolor=transparent] [backcolor=transparent]@interface[backcolor=transparent] [backcolor=transparent]FeedbackHelper[backcolor=transparent] [backcolor=transparent]()<[backcolor=transparent]UISplitViewControllerDelegate[backcolor=transparent]>
- [backcolor=transparent]@property[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]nonatomic[backcolor=transparent],[backcolor=transparent] strong[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]YWFeedbackKit[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]feedbackKit[backcolor=transparent];
- [backcolor=transparent]@end
- [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]YWFeedbackKit[backcolor=transparent] [backcolor=transparent]*)[backcolor=transparent]feedbackKit [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent](![backcolor=transparent]_feedbackKit[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] _feedbackKit [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent][[[backcolor=transparent]YWFeedbackKit[backcolor=transparent] alloc[backcolor=transparent]][backcolor=transparent] initWithAppKey[backcolor=transparent]:[backcolor=transparent]kAppKey appSecret[backcolor=transparent]:[backcolor=transparent]kAppSecret[backcolor=transparent]];
- [backcolor=transparent] [backcolor=transparent]}
- [backcolor=transparent] [backcolor=transparent]return[backcolor=transparent] _feedbackKit[backcolor=transparent];
- [backcolor=transparent]}
- [backcolor=transparent]/** 打开用户反馈页面 */
- [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]void[backcolor=transparent])[backcolor=transparent]openFeedbackViewController [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]feedbackKit makeFeedbackViewControllerWithCompletionBlock[backcolor=transparent]:^([backcolor=transparent]YWFeedbackViewController[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]viewController[backcolor=transparent],[backcolor=transparent] [backcolor=transparent]NSError[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]error[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]viewController [backcolor=transparent]!=[backcolor=transparent] [backcolor=transparent]nil[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]UINavigationController[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]nav [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent][[[backcolor=transparent]UINavigationController[backcolor=transparent] alloc[backcolor=transparent]][backcolor=transparent] initWithRootViewController[backcolor=transparent]:[backcolor=transparent]viewController[backcolor=transparent]];
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent] [backcolor=transparent][[backcolor=transparent]ViewController[backcolor=transparent] getInstance[backcolor=transparent]][backcolor=transparent] presentViewController[backcolor=transparent]:[backcolor=transparent]nav animated[backcolor=transparent]:[backcolor=transparent]YES completion[backcolor=transparent]:[backcolor=transparent]nil[backcolor=transparent]];
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]viewController setCloseBlock[backcolor=transparent]:^([backcolor=transparent]UIViewController[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]aParentController[backcolor=transparent]){
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]aParentController dismissViewControllerAnimated[backcolor=transparent]:[backcolor=transparent]YES completion[backcolor=transparent]:[backcolor=transparent]nil[backcolor=transparent]];
- [backcolor=transparent] [backcolor=transparent]}];
- [backcolor=transparent] [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent]/** 使用自定义的方式抛出error时,此部分可以注释掉 */
- [backcolor=transparent] [backcolor=transparent]NSString[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]title [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent][[backcolor=transparent]error[backcolor=transparent].[backcolor=transparent]userInfo objectForKey[backcolor=transparent]:@[backcolor=transparent]"msg"[backcolor=transparent]]?:@[backcolor=transparent]"接口调用失败,请保持网络通畅!"[backcolor=transparent];
- [backcolor=transparent] [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"%@"[backcolor=transparent],[backcolor=transparent] title[backcolor=transparent]);
- [backcolor=transparent] [backcolor=transparent]}
- [backcolor=transparent] [backcolor=transparent]}];
- [backcolor=transparent]}
我们可以看到,当打开页面后,helper 对象就被释放掉了,于是 self.feedbackKit 也就被释放掉了,进而导致属性 Appkey 与 AppSecrect 都被释放掉,发送网络请求后。
改为:
- [backcolor=transparent] [backcolor=transparent]FeedbackHelper[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]helper [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent][[backcolor=transparent]FeedbackHelper[backcolor=transparent] sharedInstance[backcolor=transparent]];
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]helper openFeedbackViewController[backcolor=transparent]];
或者将 FeedbackHelper *helper 设置为属性:
- [backcolor=transparent]@interface[backcolor=transparent] [backcolor=transparent]ViewController[backcolor=transparent] [backcolor=transparent]()
- [backcolor=transparent]@property[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]nonatomic[backcolor=transparent],[backcolor=transparent] strong[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]FeedbackHelper[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]helper[backcolor=transparent];
- [backcolor=transparent]@end
- [backcolor=transparent] [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]void[backcolor=transparent])[backcolor=transparent]viewDidLoad [backcolor=transparent]{
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]super[backcolor=transparent] viewDidLoad[backcolor=transparent]];
- [backcolor=transparent] [backcolor=transparent]self[backcolor=transparent].[backcolor=transparent]helper [backcolor=transparent]=[backcolor=transparent] [backcolor=transparent][[backcolor=transparent]FeedbackHelper[backcolor=transparent] [backcolor=transparent]new[backcolor=transparent]];
- [backcolor=transparent] [backcolor=transparent][[backcolor=transparent]helper openFeedbackViewController[backcolor=transparent]];[backcolor=transparent]
- [backcolor=transparent]}
防止了 FeedbackKit 对象被释放。从而也就保证了 Appkey 与 AppSecrect 值在内存里不会被提前释放,后序网络请求时不会出现参数错误。