Найти IP-адрес в iphone
Я хочу найти IP-адрес в приложении. Я могу найти это. Но проблема в том, что в iphone OS 2.0 или около того он работает. Но в iphone OS 3.0 он дает мне предупреждение:
warning: no '+currentHost' method found
warning: (Messages without a matching method signature)
Я использую этот код, и он отлично работает с ОС версии 2.0.
-(NSString*)getAddress {
char iphone_ip[255];
strcpy(iphone_ip,"127.0.0.1"); // if everything fails
NSHost* myhost = [NSHost currentHost];
if (myhost)
{
NSString *ad = [myhost address];
if (ad)
strcpy(iphone_ip,[ad cStringUsingEncoding: NSISOLatin1StringEncoding]);
}
return [NSString stringWithFormat:@"%s",iphone_ip];
}
Как найти IP-адрес в iphone OS 3.0 или более поздней версии OS?
Заранее спасибо.
8 ответов
#include <arpa/inet.h>
#include <netdb.h>
#include <net/if.h>
#include <ifaddrs.h>
// retun the host name
+ (NSString *)hostname
{
char baseHostName[256];
int success = gethostname(baseHostName, 255);
if (success != 0) return nil;
baseHostName[255] = '\0';
#if !TARGET_IPHONE_SIMULATOR
return [NSString stringWithFormat:@"%s.local", baseHostName];
#else
return [NSString stringWithFormat:@"%s", baseHostName];
#endif
}
// return IP Address
+ (NSString *)localIPAddress
{
struct hostent *host = gethostbyname([[self hostname] UTF8String]);
if (!host) {herror("resolv"); return nil;}
struct in_addr **list = (struct in_addr **)host->h_addr_list;
return [NSString stringWithCString:inet_ntoa(*list[0]) encoding:NSUTF8StringEncoding];
}
Поместите этот скрипт на веб-сервер с PHP:
<?php
$ip = getenv("REMOTE_ADDR");
echo $ip;
?>
Назовите это на устройстве:
NSURL *scriptURL = [[NSURL alloc] initWithString:@"http://yourserver.com/script.php"];
NSString *ip = [NSString stringWithContentsOfURL: scriptURL encoding:NSASCIIStringEncoding error:nil];
Насколько я знаю, есть только один хакерский способ сделать это. Вы в основном открываете сокет и получаете его адрес с помощью функций POSIX. Вот код, который я использовал для этого:
http://iphonesdksnippets.com/post/2009/09/07/Get-IP-address-of-iPhone.aspx
[NSHost currentHost]
также будет работать, но это устарело и считается Apple "Частным API", поэтому вы не сможете подать заявку в App Store.
- (NSString *)getIPAddress {
NSString *address = @"error";
struct ifaddrs *interfaces = NULL;
struct ifaddrs *temp_addr = NULL;
int success = 0;
// retrieve the current interfaces - returns 0 on success
success = getifaddrs(&interfaces);
if (success == 0) {
// Loop through linked list of interfaces
temp_addr = interfaces;
while(temp_addr != NULL) {
if(temp_addr->ifa_addr->sa_family == AF_INET) {
// Check if interface is en0 which is the wifi connection on the iPhone
// it may also be en1 on your ipad3.
if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
// Get NSString from C String
address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
}
}
temp_addr = temp_addr->ifa_next;
}
}
// Free memory
freeifaddrs(interfaces);
return address;
}
Используйте это, чтобы получить свой IP
Если какие-либо ошибки, пожалуйста, используйте
#include <ifaddrs.h>
#include <arpa/inet.h>
Получение IP-адреса немного хакерское. Вы уверены, что не можете жить с идентификатором устройства (UDID), который уникален для каждого iPhone и может быть легко получен с помощью общедоступного API?
[UIDevice currentDevice].uniqueIdentifier
Вы должны взглянуть на этот хороший проект: https://github.com/erica/uidevice-extension
Специальность этого класса
Импортируйте UIDevice-Reachability.h в свой проект, затем попробуйте с одной из этих команд:
NSString *myIp = [UIDevice localIPAddress];
NSString *myIp = [UIDevice localWiFiIPAddress];
NSString *myIp = [UIDevice whatismyipdotcom]; // is using @aamritrao solution
Есть еще один способ получить IP-адрес и это тоже Global IP
NSString* ip=@"http://www.whatismyip.org/";
NSURL *url = [[NSURL alloc] initWithString:ip];
NSString *ans = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:&error];
NSLog(@"%@",ans);
Вышеуказанный сайт даст вам глобальный IP. Просто вставьте это в свой код и используйте IP-адрес там, где вы хотите, а также получите местоположение пользователя, использующего ваше приложение, так как это дает глобальный IP.
bool success;
struct ifaddrs *addrs;
const struct ifaddrs *cursor;
const struct sockaddr_dl *dlAddr;
const uint8_t *base;
int i;
success = getifaddrs(&addrs) == 0;
if (success) {
cursor = addrs;
while (cursor != NULL) {
if ( (cursor->ifa_addr->sa_family == AF_LINK)
&& (((const struct sockaddr_dl *) cursor->ifa_addr)->sdl_type ==IFT_ETHER)
) {
dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr;
// fprintf(stderr, " sdl_nlen = %d\n", dlAddr->sdl_nlen);
// fprintf(stderr, " sdl_alen = %d\n", dlAddr->sdl_alen);
base = (const uint8_t *) &dlAddr->sdl_data[dlAddr->sdl_nlen];
printf(" MAC address ");
for (i = 0; i < dlAddr->sdl_alen; i++) {
if (i != 0) {
printf(":");
}
printf("%02x", base[i]);
}
printf("\n");
}
cursor = cursor->ifa_next;
}
}