I am wondering if it´s possible to get the IP address of the airplay device my iOS app is currently using.
Either that, or the IP-addresses of all airplay capable devices on the network.
Thank you in advance!
EDIT: Although I now have an accepted answer, I´m interested in knowing how to get the IP of the currently playing airplay device.
Open the Settings application on your Apple TV. Navigate to the AirPlay section. Select the Name option. Change the name as desired, and select Done.
To use AirPlay, devices don't need to be on the same network, or on any network at all. A device can discover Apple TV using Bonjour discovery, Bluetooth IP address advertisement, or peer-to-peer discovery.
What you have to use is NSNetServiceBrowser to do a search of the devices with the protocol. I have did the same with printers, my code looks like:
_netServiceBrowser= [[NSNetServiceBrowser alloc] init];
_netServiceBrowser.delegate= self;
[_netServiceBrowser searchForServicesOfType:@"_pdl-datastream._tcp" inDomain:@"local."];
You have to change @"_pdl-datastream._tcp"
for the protocol you want to search, you can find a list of the protocols here: http://developer.apple.com/library/mac/#qa/qa1312/_index.html
After that you have to write the functions of the protocol:
#pragma mark - NSNetServiceBrowserDelegate
-(void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)aNetServiceBrowser{
//prepare the start of the search
}
-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing{
//Find a service, remember that after that you have to resolve the service to know the address
[_printers addObject:aNetService];
aNetService.delegate=self;
[aNetService resolveWithTimeout:5.0];
//More coming says if it has find more services, in case of more service are in queue wait to reload your interface
if (!moreComing) {
[self.tableView reloadData];
}
}
-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didNotSearch:(NSDictionary *)errorDict{
//Do what you want in case of error
}
-(void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)aNetServiceBrowser{
//End search!
}
- (NSString *)getStringFromAddressData:(NSData *)dataIn {
//Function to parse address from NSData
struct sockaddr_in *socketAddress = nil;
NSString *ipString = nil;
socketAddress = (struct sockaddr_in *)[dataIn bytes];
ipString = [NSString stringWithFormat: @"%s",
inet_ntoa(socketAddress->sin_addr)]; ///problem here
return ipString;
}
- (void)netServiceDidResolveAddress:(NSNetService *)sender
{
//delegate of NSNetService resolution process
[_addresses addObject:[self getStringFromAddressData:[sender.addresses objectAtIndex:0]]];
[self.tableView reloadData];
}
A web that can be useful: http://www.macresearch.org/cocoa-scientists-part-xxviii-bonjour-and-how-do-you-do
I hope it helps you
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With