Corona SDKのFacebook APIを使用して、Facebookで開発中のゲームにスコアを投稿しようとしています。ただし、問題があります。 Facebookに初めて投稿しようとすると、ログインとユーザー認証の後にこのエラーが表示されます。
NSURLErrorDomainエラーコード-999
その後、facebookには投稿しません。このエラーの考えられる原因と対処方法を教えてください。ウェブを検索しようとしましたが、ウェブに関する情報が見つかりませんでした。前もって感謝します。
ところで、私はアプリでwebviewを使用していません。 Facebookクラスのウィジェットapiとshow_dialogリスナーだけです。
エラーは Mac開発者ライブラリ (iOSドキュメント)に文書化されています
ドキュメントからの関連セグメントは次のとおりです。
URL読み込みシステムのエラーコード
これらの値は、ドメイン「NSURLErrorDomain」を持つNSErrorオブジェクトのエラーコードプロパティとして返されます。
enum { NSURLErrorUnknown = -1, NSURLErrorCancelled = -999, NSURLErrorBadURL = -1000, NSURLErrorTimedOut = -1001,
ご覧のように; -999
は、ErrorCancelled
が原因です。つまり、前のリクエストが完了する前に別のリクエストが行われます。
hjpotter92は絶対に正しいです、私はちょうど私の場合の解決策を提供したいです。うまくいけばそれもあなたのために便利です。私の状況は次のとおりです。
ログインページで>ログインを押して>ロードダイアログをポップアップ>サービスでログインを呼び出し>ダイアログを閉じる>別の画面を押す>別のサービスを呼び出す->エラー-999を引き起こす
それを修正するために、ダイアログを閉じてから新しい画面を押すまでに遅延を入れました。
[indicatorAlert dismissWithClickedButtonIndex:0 animated:YES];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self performSegueWithIdentifier:@"HomeSegue" sender:nil];
});
この問題がiOS 7でのみ発生するのは奇妙です。
ここに追加したかったのは、-999 "cancelled"
を受け取ったとき、問題は通常2つのことのいずれかです:
manager
オブジェクトへの弱い参照を維持しているため、早期に割り当てが解除されます。 (強い参照を作成する)Ramon が書いたものに加えて、NSURLErrorDomain -999 cancelled
を受信する場合、考えられる3番目の理由があります。
Datataskオブジェクトで.cancel()
を呼び出すか、セッションオブジェクトで.invalidateAndCancel()
を使用したため、実行中にタスクをキャンセルしました。デリゲートを使用してカスタムセッションを作成する場合は、.invalidateAndCancel()
または.finishTasksAndInvalidate()
を呼び出して、セッションとそのデリゲート間の強い参照を解決する必要があります。これについては Apple Developer Documentation で説明しています。
セッションオブジェクトは、アプリが終了するか、セッションを明示的に無効にするまで、デリゲートへの強い参照を保持します。セッションを無効にしないと、アプリは終了するまでメモリをリークします。
このロギング動作について疑問に思っているなら、 Apple Developer forums で次の説明を見つけました。
説明として、iOS 10に戻って、新しいロギングシステム全体のロギングアーキテクチャを導入しました(詳細については、監視 WWDC 2016セッション721統合ロギングとアクティビティトレース )。CFNetworkを含む多くのサブシステムは、それに移行する過程で。その動きが完全に完了するまで、このような奇妙なEdgeのケースに遭遇するでしょう。
Corona SDKのFacebook APIを使用していませんでしたが、Alamofireを使用しているときにこの問題が発生しました。インターネットで見つけた投稿によれば、secondRequest
は常にエラー-999で実行をキャンセルします。理由はsession
プロパティは非同期作業が完了する前にdeinit
であるため、スコープ外にあるため、セッションプロパティを手動でdeinit
することでこの問題を最終的に解決しました。
class SessionManager {
var session:SessionManager?
init() {
self.session = SessionManager(configuration:URLSessionConfiguration.ephemeral)
}
private func firstRequest() {
guard let session = self.session else {return}
session.request(request_url).responseData {response in
if let data=response.data {
self.secondRequest()
}
}
private func secondRequest() {
guard let session = self.session else {return}
session.request(request_url).responseData {response in
if let data=response.data {
self.secondRequest()
}
//session will no longer be needed, deinit it
self.session = nil
}
}
Alamofireでも同じエラーが発生しましたが、これは証明書のピン留めが原因でした。証明書はもう有効ではないため、削除して新しい証明書を追加する必要がありました。それが役に立てば幸い。
当社のアプリには、iOSで多くの-999エラーがあります。ネットワークタスクが割り当て解除されたか、証明書が無効であるなど、理由が2つあることを見つけました。しかし、コードを確認しましたが、これら2つは不可能です。 URLSessionを使用しているAlamofireを使用しています。幸いなことに、当社のAndroidアプリのネットワークは正常です。そこで、違いを確認します。 iOSからのhttpリクエストはHttp2.0であり、AndroidはHttp1.1であることがわかりました。そのため、バックエンドHTTPサポートバージョンを強制的にhttp1.1に下げ、その後-999エラーカウントが下がります!!!
AppleのURLSessionにはおそらくバグがあると思います。詳細な考えについては、リンクを確認してください DataTaskのすべての過剰実行に対する新しいNSURLSession?