Приложение iOS swift с использованием GCDAsyncUdpSocket
Я очень новичок в создании приложений для iOS.
Я пытаюсь сделать класс для получения многоадресных сообщений UDP, но я не могу шов, чтобы заставить его работать вообще...
class Discovery : GCDAsyncUdpSocketDelegate{
var udpSocket:GCDAsyncUdpSocket!;
init() {
udpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
var e:NSErrorPointer = nil;
//Binding to port
if(!udpSocket.bindToPort(2025, error: e)){
println(e);
return;
}
//Joining multicast group
if(!udpSocket.joinMulticastGroup("239.5.6.7", error: e)){
println(e);
return;
}
//Begin recieve
if(!udpSocket.beginReceiving(e)){
println(e);
return;
}
println("UDP socket was opened!")
}
func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) {
println("Got data!");
}
}
Кто-нибудь может увидеть, где я ошибаюсь? Я получаю, что UDP-сокет был открыт, но я не получаю никаких пакетов. Я знаю, что их отправляют, так как я собираю их с помощью wireshark.
Открытие вызвано из моего контроллера просмотра
class ViewController: UIViewController, CLLocationManagerDelegate {
let peer = Peer(id: NSUUID.new())
let uuid = NSUUID.new()
let discovery:Discovery = Discovery()
let locationManager = CLLocationManager()
let region = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "8DEEFBB9-F738-4297-8040-96668BB44281"), identifier: "Roximity")
let com = OconCom()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self;
if (CLLocationManager.authorizationStatus() != CLAuthorizationStatus.AuthorizedAlways) {
locationManager.requestAlwaysAuthorization()
}
locationManager.startMonitoringForRegion(region) //Background
locationManager.startRangingBeaconsInRegion(region) //Foreground
}
Любое предложение будет полезно.
2 ответа
Я столкнулся с той же проблемой в моем обычном классе. Просто добавьте @obj public к своим функциям делегата. Теперь делегат будет вызван правильно.
Ваш ресивер находится в той же сети, что и вещатель. Обычно многоадресная рассылка имеет низкий TTL и не может сделать это слишком далеко, если маршрутизаторы, через которые проходят ваши пакеты, не настроены на это.