iOS 7.1 から iOS 8.1 へのプロジェクトに命を吹き込もうとしています。明らかに、これは NewsStand アプリです。別のホスト名に対して証明書を手動で検証できる必要があります。これはすべて、willSendRequestForAuthenticationChallenge 内で発生します。iOS 7.1 では、これはすべて正常に動作します。まだ 7.1 を実行している iPad で再テストしたところ、動作しましたが、iOS 8.1 ではメソッドが呼び出されませんでした。その結果、すべてのアセットのダウンロードdidFailWithError
が呼び出されて失敗し、" The operation couldn’t be completed. (NSURLErrorDomain error -1202.)
"のエラーが発生します。
これを引き起こすiOS 8.1で何が変更された可能性があるかを知っている人はいますか? 彼らは電話をかけていませんか?メソッドが検出されて呼び出されるかどうかに影響を与える可能性のある、iOS 8.1 での継承に関して何か変更はありましたか? すべてのメソッドを最上位クラスに移動しようとしましたが、それは役に立たなかったようです。これは「POST」リクエストを使用した結果である可能性はありますか?
私の人生では、willSendRequestForAuthenticationChallenge が iOS 8.1 で NKAssetDownload に対して呼び出されないのに、iOS 7.1 では呼び出されるという明らかなコードの理由はわかりません。私は iOS 8.0 でテストしたことがないので、iOS 8.0 で呼び出されていないとは断言できません。
このメソッドは、iOS 8.1 で使用している他のすべての URL 接続に対して呼び出されることに注意してください。したがって、問題は NKAssetDownload (または少なくとも NKAssetDownload の呼び出し) に固有のようです。
関連するコードは次のとおりです。
@implementation myDownloader
{
NKIssue * theIssue; // pointer to the magazine Issue object
NSString * theJsonReceiptArrayBase64String;
NKAssetDownload * theAssetDownload;
NSString * sourceURL;
NSString * theFileName;
NSString * issueUniqueId;
NSURLConnection * theConnection;
NSNumber * expectedFileSize;
}
...
-(myDownloader *)initWithIssueAndIdAndSourceAndFinalPath:(NKIssue *)issue uniqueId:(NSString *)uniqueId source:(NSString *)source fileName:(NSString *)fileName fileSize:(NSNumber *) fileSize Receipt:(NSString *)receipt
{
NSLog(@"initWithIssueAndIdAndSourceAndFinalPath");
self = [super init];
if (self)
{
theIssue = issue;
sourceURL = source;
theFileName = fileName;
issueUniqueId = uniqueId;
expectedFileSize = fileSize;
theJsonReceiptArrayBase64String = receipt;
}
return self;
}
...
- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection
{
/* never get here on iOS 8.1 */
return NO;
}
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
/* never get here on iOS 8.1 */
[self handleAuthenticationOnConnection:connection withChallenge:challenge];
}
...
-(void) downloadPackage
{
CCommunictionMgr * communicator = [CCommunictionMgr instance];
NSMutableURLRequest * thePackageRequest = [communicator generateJsonPostPackageRequest:sourceURL uniqueId:issueUniqueId recieptData:theJsonReceiptArrayBase64String];
theAssetDownload = [theIssue addAssetWithRequest:thePackageRequest];
[theAssetDownload setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:kASSET_TYPE_PACKAGE, kASSET_TYPE_DK, nil]];
theConnection = [theAssetDownload downloadWithDelegate:self];
}
オブジェクト「myDownloader」は、NSURLConnectionDelegate、NSURLConnectionDownloadDelegate の両方を実装します
ヘッダファイル
@interface myDownloader : CConnectionDelegate <NSURLConnectionDelegate, NSURLConnectionDownloadDelegate>
...
認証チャレンジの中身は CConnectionDelegate オブジェクト内で処理されます。
必要に応じて、他のコードの根性を喜んで含めます。