用户提交反馈时显示参数错误

问题详述

提交页面时显示,参数错误:param_error

问题分析

这个一般是Appkey与AppSecrect参数错误导致的。

解决方法

  • 一方面可以与后台数据比对,排查该值是否正确,比如有可能是:项目中的AppKey或AppSecret与控制台中的没完全对应。

  • 如果值正确,那么需要排查是否为内存方面的问题,导致网络请求时没有发送到服务端。一般为 YWFeedbackKit 对象被提前释放。

  • Android端,请先升级到3.3.1版本后进行提交反馈测试。

下面举例说明一下第二种情况:

比如有用户采用下面的方式打开用户反馈页面:

 - (void)viewDidLoad {
    [super viewDidLoad];
    FeedbackHelper *helper = [FeedbackHelper new];
    [helper openFeedbackViewController];  
}

FeedbackHelper 中有下面的逻辑:

 @interface FeedbackHelper ()<UISplitViewControllerDelegate>
@property (nonatomic, strong) YWFeedbackKit *feedbackKit;
@end


- (YWFeedbackKit *)feedbackKit {
    if (!_feedbackKit) {
        _feedbackKit = [[YWFeedbackKit alloc] initWithAppKey:kAppKey appSecret:kAppSecret];
    }
    return _feedbackKit;
}

/** 打开用户反馈页面 */
- (void)openFeedbackViewController {
    [self.feedbackKit makeFeedbackViewControllerWithCompletionBlock:^(YWFeedbackViewController *viewController, NSError *error) {
        if (viewController != nil) {
            UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
            [ [ViewController getInstance] presentViewController:nav animated:YES completion:nil];

            [viewController setCloseBlock:^(UIViewController *aParentController){
                [aParentController dismissViewControllerAnimated:YES completion:nil];
            }];
        } else {
            /** 使用自定义的方式抛出error时,此部分可以注释掉 */
            NSString *title = [error.userInfo objectForKey:@"msg"]?:@"接口调用失败,请保持网络通畅!";
            NSLog(@"%@", title);
        }
    }];

}

我们可以看到,当打开页面后,helper对象就被释放掉了,于是self.feedbackKit也就被释放掉了,进而导致属性Appkey与AppSecrect都被释放掉,发送网络请求后。

改为:

    FeedbackHelper *helper = [FeedbackHelper sharedInstance];
    [helper openFeedbackViewController];

或者将 FeedbackHelper *helper 设置为属性:

@interface ViewController ()
@property (nonatomic, strong) FeedbackHelper *helper;
@end
 - (void)viewDidLoad {
    [super viewDidLoad];
    self.helper = [FeedbackHelper new];
    [helper openFeedbackViewController];  
}

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