Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios AFNetworking会抛出一个错误,但我如何显示它呢?_Ios_Objective C_Afnetworking_Instapaper - Fatal编程技术网

Ios AFNetworking会抛出一个错误,但我如何显示它呢?

Ios AFNetworking会抛出一个错误,但我如何显示它呢?,ios,objective-c,afnetworking,instapaper,Ios,Objective C,Afnetworking,Instapaper,我有一个应用程序,用户可以通过Instapaper进行身份验证。但是,他们需要订阅Instapaper才能做到这一点,因此,如果他们试图使用未订阅Instapaper的帐户登录,我想向他们显示一个错误 但当他们尝试登录时,会将其视为成功,然后向控制台显示此错误: 错误:错误域=AFNetworkingErrorDomain代码=-1011“应为 状态代码在(200-299)中,获得400“UserInfo=0x8374840 {NSLocalizedRecoverySuggestion=[{“错

我有一个应用程序,用户可以通过Instapaper进行身份验证。但是,他们需要订阅Instapaper才能做到这一点,因此,如果他们试图使用未订阅Instapaper的帐户登录,我想向他们显示一个错误

但当他们尝试登录时,会将其视为成功,然后向控制台显示此错误:

错误:错误域=AFNetworkingErrorDomain代码=-1011“应为 状态代码在(200-299)中,获得400“UserInfo=0x8374840 {NSLocalizedRecoverySuggestion=[{“错误代码”:1041,“消息”: “需要订阅帐户”,“类型”:“错误”}], AFNetworkingOperationFailingURLRequestErrorKey=https://www.instapaper.com/api/1/bookmarks/list>, NSErrorFailingURLKey=, NSLocalizedDescription=预期状态代码为(200-299),获得400, AFNetworkingOperationFailingURLResponseErrorKey=}

我所用的是对AFN网络的修改。我将其子类化,以创建自定义Instapaper API客户端,如下所示:

#import "AFInstapaperClient.h"
#import "AFJSONRequestOperation.h"

@implementation AFInstapaperClient

+ (AFInstapaperClient *)sharedClient {
    static AFInstapaperClient *sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedClient = [[AFInstapaperClient alloc] initWithBaseURL:[NSURL URLWithString:@"https://www.instapaper.com/"]
                                                   key:@"..."
                                                   secret:@"..."];
    });

    return sharedClient;
}

- (id)initWithBaseURL:(NSURL *)url {
    if (self = [super initWithBaseURL:url]) {
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
        [self setDefaultHeader:@"Accept" value:@"application/json"];
    }

    return self;
}

@end
当他们登录时,将执行以下代码:

- (IBAction)doneButtonPressed:(UIBarButtonItem *)sender {       
    [[AFInstapaperClient sharedClient] authorizeUsingXAuthWithAccessTokenPath:@"/api/1/oauth/access_token"
                 accessMethod:@"POST"
                 username:self.loginBox.text
                 password:self.passwordBox.text
                 success:^(AFXAuthToken *accessToken) {
                     // Save the token information into the Keychain
                     [UICKeyChainStore setString:accessToken.key forKey:@"InstapaperKey"];
                     [UICKeyChainStore setString:accessToken.secret forKey:@"InstapaperSecret"];

                     UIAlertView *alert = [[UIAlertView alloc]
                                           initWithTitle:@"Login Successful"
                                           message:@"Your articles are being downloaded now and will appear in your queue."
                                           delegate:nil
                                           cancelButtonTitle:@"OK"
                                           otherButtonTitles: nil];
                     [alert show];

                     [[NSUserDefaults standardUserDefaults] setObject:@"YES" forKey:@"IsLoggedInToInstapaper"];

                     [self dismissViewControllerAnimated:YES completion:nil];
                 }
                 failure:^(NSError *error) {                     
                     UIAlertView *alert = [[UIAlertView alloc]
                                           initWithTitle:@"Login Failed."
                                           message:@"Are you connected to the internet? Instapaper may also be down. Try again later."
                                           delegate:nil
                                           cancelButtonTitle:@"Okay"
                                           otherButtonTitles: nil];
                     [alert show];
                 }];
}

但代码永远不会进入故障块。我如何修改我的代码,使其允许我告诉他们需要Instapaper订阅帐户?

根据您的情况,我认为您永远不会触发失败阻止,因为您的请求没有失败。您将收到来自web服务的响应。根据我的经验,故障块仅在由于网络可用性之类的原因而无法获得响应时才会执行

因此,您需要在成功块中处理帐户错误。一种方法是读取响应中返回的状态代码。如果状态代码为400,如您的控制台所示,则提醒用户


您可以按照此处使用的方法进行操作

正如WeekendDewarrior所说,在这个实现中,即使他们无法提出进一步的请求,它也会认为它是成功的。吐出错误的代码实际上是一个NSLog,我在发出请求后(哎呀,没意识到是我的代码输出的),因为我认为一切都很好


我的解决方案就是向成功块中的API发出请求,检查该请求的结果(返回了
响应
对象),然后对
响应
对象采取相应的行动。

我从哪里得到该响应?你说这是AFNetworking的一个子类。因此,您应该能够使用request调用
httprequestoperation
或类似的调用,它将返回一个
AFHTTPRequestOperation
对象,您可以在其中访问响应并确定状态代码。