Приложение 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 и не может сделать это слишком далеко, если маршрутизаторы, через которые проходят ваши пакеты, не настроены на это.

Другие вопросы по тегам