2

Appleのクラスを使用して、Reachabilityデータまたは Wi-Fi が利用可能かどうかを判断しています。ただし、ユーザー (米国の iPhone を使用) が別の国でアプリをテストしていて、MapKit にアクセスしようとすると次のエラーが表示されます。

コンソール

このエラーに関する私の調査では、それPBRequesterProtocolBufferであることがわかりました。

2012-10-15 21:16:00.921 WrightsCS App[24239:907] PBRequester がエラー エラー Domain=kCFErrorDomainCFNetwork Code=-1018 "International roaming is currently off." で失敗しました。UserInfo=0x1e5587d0 {NSErrorFailingURLKey=https://gsp13-cn.ls.apple.com/shift, NSErrorFailingURLStringKey=https://gsp13-cn.ls.apple.com/shift, NSLocalizedDescription=国際ローミングは現在オフです。}

-(BOOL)hasDataConnection
{
    Reachability *networkReachability = [Reachability reachabilityForInternetConnection];
    NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];

    if ( networkStatus == NotReachable )
    {
        return NO;
    }
    else
    {
        if ( ! [Reachability reachabilityWithHostName:@"www.google.com"] )
            return NO;

        return YES;
    }
}

質問

ユーザーがローミングしているかどうかを検出する方法、またはユーザーがローミングしている場合に少なくともこのエラーが発生しないことを確認するにはどうすればよいでしょうか?

4

4 に答える 4

2

OK - これは答えではありませんが、正しい方向を示している可能性があります。まず、これを実行できると思われる Objective C のクラス ( NSURLRequestClass など) が見つかりません。

CFNetworkError コードを見ると、これらの興味深いエントリ (エラー メッセージと一致する) があるため、CFNetwork Framework (CFNetwork Framework Reference)に直接アクセスする必要があると思います。

kCFURLErrorNotConnectedToInternet  = -1009,
kCFURLErrorInternationalRoamingOff = -1018,
kCFURLErrorDataNotAllowed          = -1020,

残念ながら、私は CFNetwork フレームワークを知りません。Apple のドキュメントを見ても、どの CFNetwork フレームワーク API がこれらの値を使用しているかについてはわかりません。しかし、私は道があると確信しています。

私の2つの「アイデア」(そして私はその言葉を大まかに使用しています):

  1. 使用CFHost(およびコールバックを取得してエラーコードを照会)
  2. を使用CFNetDiagnosticCopyNetworkStatusPassively(および返された文字列を解析) します。

専門家がいるなら本当の答えを知りたいです。

于 2012-10-17T03:29:27.063 に答える
-2

ローミングを確認するためにそれを行いました(100%完全な証拠ではありませんが..):

1.最初に、ユーザーが初めてアプリをロードするときに、キャリア ネットワークをユーザーのデフォルトに保存します。

CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = [netinfo subscriberCellularProvider];
NSString *name = [[carrier carrierName] copy];
NSLog(@"Carrier Name: %@", name);

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
self.homeNetwork = [standardUserDefaults objectForKey:SNAP_homeNetwork];
if(self.homeNetwork == nil || self.homeNetwork.length == 0){
    self.homeNetwork = [[Globals sharedInstance] getCarrier];
    [standardUserDefaults setObject:self.homeNetwork forKey:SNAP_homeNetwork];
    [standardUserDefaults synchronize];
}
  1. アプリの最初の起動時に保存したものと currentCarrier を確認する必要があるたびに、名前が異なる場合、ユーザーはローミングしています。
于 2013-08-20T20:17:55.170 に答える