开发者社区> 问答> 正文

iOS、android(安卓)平台:提交反馈时显示参数错误该怎么解决?


问题描述:
提交页面时显示,参数错误。

这个一般是 Appkey 与 AppSecrect 参数错误导致的,排查方法:

  • 一方面可以与后台数据比对,排查该值是否正确,比如有可能是:项目中的 AppKey 或 AppSecret 与控制台中的没完全对应。
  • 如果值正确,那么需要排查是否为内存方面的问题,导致网络请求时没有发送到服务端。一般为 YWFeedbackKit 对象被提前释放。

下面举例说明一下第二种情况:
比如有用户采用下面的方式打开用户反馈页面:
  1. [backcolor=transparent] [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]void[backcolor=transparent])[backcolor=transparent]viewDidLoad [backcolor=transparent]{
  2. [backcolor=transparent]    [backcolor=transparent][[backcolor=transparent]super[backcolor=transparent] viewDidLoad[backcolor=transparent]];
  3. [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]];
  4. [backcolor=transparent]    [backcolor=transparent][[backcolor=transparent]helper openFeedbackViewController[backcolor=transparent]];[backcolor=transparent]  
  5. [backcolor=transparent]}

在 FeedbackHelper 中有下面的逻辑:
  1. [backcolor=transparent] [backcolor=transparent]@interface[backcolor=transparent] [backcolor=transparent]FeedbackHelper[backcolor=transparent] [backcolor=transparent]()<[backcolor=transparent]UISplitViewControllerDelegate[backcolor=transparent]>
  2. [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];
  3. [backcolor=transparent]@end
  4. [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]YWFeedbackKit[backcolor=transparent] [backcolor=transparent]*)[backcolor=transparent]feedbackKit [backcolor=transparent]{
  5. [backcolor=transparent]    [backcolor=transparent]if[backcolor=transparent] [backcolor=transparent](![backcolor=transparent]_feedbackKit[backcolor=transparent])[backcolor=transparent] [backcolor=transparent]{
  6. [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]];
  7. [backcolor=transparent]    [backcolor=transparent]}
  8. [backcolor=transparent]    [backcolor=transparent]return[backcolor=transparent] _feedbackKit[backcolor=transparent];
  9. [backcolor=transparent]}
  10. [backcolor=transparent]/** 打开用户反馈页面 */
  11. [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]void[backcolor=transparent])[backcolor=transparent]openFeedbackViewController [backcolor=transparent]{
  12. [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]{
  13. [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]{
  14. [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]];
  15. [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]];
  16. [backcolor=transparent]            [backcolor=transparent][[backcolor=transparent]viewController setCloseBlock[backcolor=transparent]:^([backcolor=transparent]UIViewController[backcolor=transparent] [backcolor=transparent]*[backcolor=transparent]aParentController[backcolor=transparent]){
  17. [backcolor=transparent]                [backcolor=transparent][[backcolor=transparent]aParentController dismissViewControllerAnimated[backcolor=transparent]:[backcolor=transparent]YES completion[backcolor=transparent]:[backcolor=transparent]nil[backcolor=transparent]];
  18. [backcolor=transparent]            [backcolor=transparent]}];
  19. [backcolor=transparent]        [backcolor=transparent]}[backcolor=transparent] [backcolor=transparent]else[backcolor=transparent] [backcolor=transparent]{
  20. [backcolor=transparent]            [backcolor=transparent]/** 使用自定义的方式抛出error时,此部分可以注释掉 */
  21. [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];
  22. [backcolor=transparent]            [backcolor=transparent]NSLog[backcolor=transparent](@[backcolor=transparent]"%@"[backcolor=transparent],[backcolor=transparent] title[backcolor=transparent]);
  23. [backcolor=transparent]        [backcolor=transparent]}
  24. [backcolor=transparent]    [backcolor=transparent]}];
  25. [backcolor=transparent]}

我们可以看到,当打开页面后,helper 对象就被释放掉了,于是 self.feedbackKit 也就被释放掉了,进而导致属性 Appkey 与 AppSecrect 都被释放掉,发送网络请求后。
改为:
  1. [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]];
  2. [backcolor=transparent]    [backcolor=transparent][[backcolor=transparent]helper openFeedbackViewController[backcolor=transparent]];

或者将 FeedbackHelper *helper 设置为属性:
  1. [backcolor=transparent]@interface[backcolor=transparent] [backcolor=transparent]ViewController[backcolor=transparent] [backcolor=transparent]()
  2. [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];
  3. [backcolor=transparent]@end
  1. [backcolor=transparent] [backcolor=transparent]-[backcolor=transparent] [backcolor=transparent]([backcolor=transparent]void[backcolor=transparent])[backcolor=transparent]viewDidLoad [backcolor=transparent]{
  2. [backcolor=transparent]    [backcolor=transparent][[backcolor=transparent]super[backcolor=transparent] viewDidLoad[backcolor=transparent]];
  3. [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]];
  4. [backcolor=transparent]    [backcolor=transparent][[backcolor=transparent]helper openFeedbackViewController[backcolor=transparent]];[backcolor=transparent]  
  5. [backcolor=transparent]}

防止了 FeedbackKit 对象被释放。从而也就保证了 Appkey 与 AppSecrect 值在内存里不会被提前释放,后序网络请求时不会出现参数错误。

展开
收起
猫饭先生 2017-10-24 11:16:52 2068 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
手淘iOS性能优化探索 立即下载
From Java/Android to Swift iOS 立即下载
深入剖析iOS性能优化 立即下载