【问题标题】:Using Simple Ping in swift (iOS)在 swift (iOS) 中使用 Simple Ping
【发布时间】:2015-06-16 22:38:40
【问题描述】:

我正在尝试使用 Apple 的类:Simple Ping,但我无法使用它。

当我运行示例 mac os x 项目时,它正在工作:

2015-06-17 00:03:22.569 SimplePing[20386:3133535] ping 192.168.1.102

2015-06-17 00:03:22.569 SimplePing[20386:3133535] #0 发送

2015-06-17 00:03:22.570 SimplePing[20386:3133535] #0 收到

2015-06-17 00:03:23.570 SimplePing[20386:3133535] #1 发送

2015-06-17 00:03:23.571 SimplePing[20386:3133535] #1 收到

等等。

但是当我从我的 ios (swift) 应用程序中执行此操作时:

let pinger = SimplePing(hostName: "192.168.1.102")
pinger.delegate = self;
pinger.start()

do {
    NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture() as! NSDate)
} while(pinger != nil)

不确定是否需要 do..while 循环 - 可能不需要。无论如何,我也尝试过不使用它。

我已将 SimplePingDelegate 添加到我的班级:

    func simplePing(pinger: SimplePing!, didFailToSendPacket packet: NSData!, error: NSError!) {
        println("didFailToSendPacket")
    }

    func simplePing(pinger: SimplePing!, didFailWithError error: NSError!) {
        println("didFailWithError")
    }

    func simplePing(pinger: SimplePing!, didReceivePingResponsePacket packet: NSData!) {
        println("didReceivePingResponsePacket")
    }

    func simplePing(pinger: SimplePing!, didReceiveUnexpectedPacket packet: NSData!) {
        println("didReceiveUnexpectedPacket")
    }

    func simplePing(pinger: SimplePing!, didSendPacket packet: NSData!) {
        println("didSendPacket")
    }

    func simplePing(pinger: SimplePing!, didStartWithAddress address: NSData!) {
        println("didStartWithAddress")
    }

所以它给了我输出:

2015-06-17 00:32:12.368 可用[938:150352] CFHostStartInfoResolution

2015-06-17 00:32:12.374 可用[938:150352] >HostResolveCallback

didStartWithAddress

不调用其他函数。为什么?

顺便说一句。我也尝试过将 pinger 移动到类变量中,如下所示:

var pinger: SimplePing?

完全没有区别。

我该如何解决这个问题?

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    不知道为什么这不起作用,但是一旦地址被解析,您可以自己调用 ping 方法。

    一个告诉你可以开始ping的变量:

    var canStartPinging = false
    

    调用ping的代码:

    let pinger = SimplePing(hostName: "www.apple.com")
    pinger.delegate = self;
    pinger.start()
    
    do {
        if (canStartPinging) {
            pinger.sendPingWithData(nil)
        }
        NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture() as! NSDate)
    } while(pinger != nil)
    

    在开始 ping 之前要等待的 SimplePing 委托方法:

    func simplePing(pinger: SimplePing!, didStartWithAddress address: NSData!) {
        println("didStartWithAddress")
        canStartPinging = true
    }
    

    【讨论】:

    • 就是这样!我错过了 sendPingWithData!不知道为什么苹果的例子没有那个并且有效..
    • 你能解释一下这个sn-p吗? do { if (canStartPinging) { pinger.sendPingWithData(nil) //对我来说它在这里崩溃 } NSRunLoop.currentRunLoop().runMode(NSDefaultRunLoopMode, beforeDate: NSDate.distantFuture() as! NSDate) //如果我不使用这个委托从不调用 } while(pinger != nil)
    • @Artal - 你知道我们如何用简单的 Ping ping 多个 IP 地址吗?
    • @iRahulDubey 我从来没有真正在生产中使用过这段代码。出于这个问题的目的,刚刚查看了 Apple 示例代码。我建议你打开一个单独的问题,看看是否有人有答案..
    猜你喜欢
    • 2021-12-14
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多