1

呼び出している REST サービスへの NSURL 接続に問題があります。

問題は、ブラウザまたは RESTClient を使用して確認すると正常に動作することですが、デバイス (iOS5、iOS6、エミュレーター) では最初は動作しないことがあります。タイムアウト後、それ以降は機能します。

それは本当に私を狂わせ始めています。

これを呼び出すメイン関数は GCD を介して呼び出され、メイン スレッドで結果コードを処理します。200 = 認証成功、!200 = もちろん失敗 (タイムアウトなど、返された整数で処理)。

前述のように、問題は初めて呼び出されたときにタイムアウトになり、何も返されないことです。後続の呼び出しは、十分に迅速に行われると機能する傾向がありますが、1 ~ 2 分放置すると、アクセスしようとしている間に接続がタイムアウトします。

ブラウザまたは RESTClient を介してこの動作を複製することはできません。ちょうどiOSのようです。私はそれでバナナに行きます。

これは、呼び出しを行うメイン関数です

-(int)AuthUser:(ApiUser*)user{

// Authenticates the Users
// Build the URL
NSString *accessAppendix = @"/api/user/authenticate";
NSString *accessURL = [NSString stringWithFormat:@"%@%@",self.apiParameters.rootServer, accessAppendix];
NSURL *accessJSONURL= [[NSURL alloc] initWithString:accessURL];

// Setup HTTP Request Headers
NSMutableURLRequest *urlRequest = [self BuildApiUrlRequest:accessJSONURL];

// Setup dictionaries
// For posting login data

NSDictionary *Application = [[NSDictionary alloc]
                             initWithObjectsAndKeys:@"XXXXXXXXX",
                             @"Application", nil];

NSDictionary *User = [[NSDictionary alloc]
                      initWithObjectsAndKeys:
                      user.UserId,@"UserId",
                      user.Password,@"Password",
                      user.Type,@"Type",nil];

NSDictionary *Office = [[NSDictionary alloc]
                        initWithObjectsAndKeys:
                        user.office,@"Number", nil];

NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:
                            User,@"User",
                            Application,@"Application",
                            Office,@"Office",nil];

// Setup Error handler
NSError *jError;

// Serialise JSON String
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONReadingMutableContainers error:&jError];

// attach to HTTP Body
[urlRequest setHTTPBody:jsonData];

// Log URL Body
NSLog(@"Data %@",[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]);
NSLog(@"Data length: %u",[jsonData length]);    

// set Content Length
// This doesn't seem to be required really
NSString *msgLength = [NSString stringWithFormat:@"%d", [jsonData length]];
[urlRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];

NSURLResponse* response;
NSError* error = nil;

// fire Request        
NSData* result = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error];

NSString *responseBody = [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
NSLog(@"URL Response: %@",responseBody);
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
NSLog(@"HttpResponse: %d",[httpResponse statusCode]);

return [httpResponse statusCode];
}

Build API URL Request 関数です。

// Builds API URL Request
-(NSMutableURLRequest*) BuildApiUrlRequest:(NSURL*)jURL
{
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:jURL];
[urlRequest setHTTPMethod:@"POST"];
NSString *authHeader = [@"Basic " stringByAppendingFormat:@"%@", self.apiParameters.rootCredentials];
[urlRequest addValue:authHeader forHTTPHeaderField:@"Authorization"];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[urlRequest setTimeoutInterval:10];
urlRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

return urlRequest;
}

考え?応答コード 0 を返すだけで、失敗するとタイムアウトします。それが機能するときは、非常にうまく機能し、200 を返します。

UPDATE : これは、View Controller から呼び出される方法です (ボタンを押すと):

dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        int returnNumber = [app.pApi AuthUser:newUser];

        dispatch_async( dispatch_get_main_queue(), ^{
            [self loginResultHandler:returnNumber];
        });
    });

このようにしたのは、API クラスを制御クラスから分離したいからです。

4

0 に答える 0