1

私のアプリケーションでは、ユーザーのパブリック/インターネット IP アドレスの値と等しい NSString オブジェクト値を取得する必要があります。私はこれを行う方法を試しましたが、どちらもローカル IP アドレスを返しません。以下は私の2つの方法です。1 つはより正確で、常に配列内の正しい項目を返します。もう一方はそうではありません。(ランダムなインデックスを選択するだけなので)...

- (NSString *)getPublicIP {   
    NSHost *publicIP = [[[NSHost currentHost] addresses] objectAtIndex:0];
    return publicIP;  
}

その他のより正確な:(ただし、パブリック IP は取得しません)

 //start get ip
- (NSString *)getIPWithNSHost { 

NSArray *addresses = [[NSHost currentHost] addresses];
NSString *stringAddress;
for (NSString *anAddress in addresses) {
    if (![anAddress hasPrefix:@"127"] && [[anAddress componentsSeparatedByString:@"."] count] == 4) {
    stringAddress = anAddress;
    break;
    }
    else {
    stringAddress = @"IPv4 address not available" ;

}
    //NSLog(stringAddress);
}
NSLog (@"getIPWithNSHost: stringAddress = %@ ",stringAddress); 
stringAddress = (@"getIPWithNSHost: stringAddress = %@ ",stringAddress);

return  stringAddress;

}

いずれにせよ、外部/パブリック/インターネット IP アドレスを取得する方法が必要です。(外部/パブリック/インターネットIPを明確にするために、whatsmyip.orgから取得できるものです)

4

6 に答える 6

4

それは罪のように醜いですが、これは私にとってはうまくいきます:

NSTask *task = [[[NSTask alloc] init] autorelease];
[task setLaunchPath:@"/usr/bin/curl"];
[task setArguments:[NSArray arrayWithObjects:@"-s",@"http://checkip.dyndns.org", nil]];
NSPipe *outputPipe = [NSPipe pipe];
[task setStandardOutput:outputPipe];
[task launch];
NSData *curlData = [[outputPipe fileHandleForReading] readDataToEndOfFile];
NSString *curlString = [[NSString alloc] initWithData:curlData encoding:NSASCIIStringEncoding];
NSMutableString *strippedString = [NSMutableString
                                   stringWithCapacity:curlString.length];

NSScanner *scanner = [NSScanner scannerWithString:curlString];
NSCharacterSet *numbers = [NSCharacterSet
                           characterSetWithCharactersInString:@"0123456789."];

while ([scanner isAtEnd] == NO) {
    NSString *buffer;
    if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
        [strippedString appendString:buffer];

    } else {
        [scanner setScanLocation:([scanner scanLocation] + 1)];
    }
}
NSLog(@"IP Address: %@", strippedString);
于 2013-01-21T22:08:54.370 に答える
3

STUN プロトコルは、パブリック IP とポートを取得するための優れたソリューションです。iOS の STUN プロトコルの実装を確認してください https://github.com/soulfly/STUN-iOS

于 2012-09-20T19:19:01.717 に答える