-1

「アクション可能な通知」ボタンをクリックした後にアプリが実行されていないときに、次のコードを実行しています。バックグラウンドモード、リモート通知を有効にしました。

//base url is changed for privacy purpose
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/engine/auth/tx", [SharedData getGatewayURL]]]
                                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                                   timeoutInterval:HTTP_REQUEST_TIME_OUT];
                [request setHTTPMethod:@"POST"];
                NSString *encodedXML = [encrypted urlEncodeUsingEncoding:NSUTF8StringEncoding];
                NSString *params = [NSString stringWithFormat:@"%@=%@", REQUEST_PARAMETER_NAME, encodedXML];
                [request setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];


               NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
                NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];

                NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {


               //Handle response


                  }];
            [postDataTask resume];

//デリゲート

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler{
    if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
        if([challenge.protectionSpace.host isEqualToString:@"211.23.34.234"]){
            NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
        }
    }
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location {
    NSData *data = [NSData dataWithContentsOfURL:location];

}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes {

}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {

}

(ここに示したデモ サーバーの URL は実際のものではありません)

アプリが一時停止または閉じられたときにバックグラウンド タスクを実行するために NSURLSessionDataTask を使用できますか?

このコードは、サーバー URL ex に対して完全に機能します。https://211.23.34.234/engine/auth/tx

しかし、サーバー URLhttps://demo.tes.com/engine/auth/txに変更すると機能し ません。

NSURLSessionDataTask の何が問題になっていますか?

これは静的 IP 211.23.34.234によるものですか? 同じコードがhttps://demo.tes.com/engine/auth/txで機能しないのはなぜですか? (このサーバーの URL は動的に変更される可能性があります) どんな助けでも大歓迎です。

これを修正する方法は?

注: : デリゲートを NSURLSessionDataTask の "nil" に設定すると、https: //demo.tes.com/engine/auth/tx サーバーでは機能しますが、 https ://211.23.34.234/engine/auth/tx では機能しません

両方のサーバーで動作させるにはどうすればよいですか?

4

1 に答える 1

0

修理済み。問題はデリゲートメソッドにありました。デモ サーバーの完了ハンドラを制限します。

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler{
    if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
  //  if([challenge.protectionSpace.host isEqualToString:@"211.23.34.234"]){    
            NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
   //     }
    }
}

私は固定IPチャレンジ認証のみを認証することを許可されていたので、条件が正常に機能するかどうかコメントします.

于 2016-07-28T04:19:26.343 に答える