私はSimplePing app from Appleを試しています。ただし、デリゲートメソッドは呼び出されません。私は解決策を見つけようとしていますが、私はまたここで助けを求めています。Apples SinglePingアプリはデリゲートメソッドを呼び出さない
ありがとうございます。
ここでは、見るための完全なMainViewControllerクラスを示します。
import UIKit
class MainViewController: UITableViewController, SimplePingDelegate {
let hostName = "www.apple.com"
override func viewDidLoad() {
super.viewDidLoad()
self.title = self.hostName
}
var pinger: SimplePing?
var sendTimer: Timer?
func start(forceIPv4: Bool, forceIPv6: Bool) {
self.pingerWillStart()
NSLog("start")
let pinger = SimplePing(hostName: self.hostName)
self.pinger = pinger
if (forceIPv4 && !forceIPv6) {
pinger.addressStyle = .icmPv4
} else if (forceIPv6 && !forceIPv4) {
pinger.addressStyle = .icmPv6
}
pinger.delegate = self
pinger.start()
}
func stop() {
NSLog("stop")
self.pinger?.stop()
self.pinger = nil
self.sendTimer?.invalidate()
self.sendTimer = nil
self.pingerDidStop()
}
func sendPing() {
self.pinger!.send(with: nil)
}
// MARK: pinger delegate callback
private func simplePing(pinger: SimplePing, didStartWithAddress address: NSData) {
NSLog("pinging %@", MainViewController.displayAddressForAddress(address: address))
self.sendPing()
assert(self.sendTimer == nil)
self.sendTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(MainViewController.sendPing), userInfo: nil, repeats: true)
}
private func simplePing(pinger: SimplePing, didFailWithError error: NSError) {
NSLog("failed: %@", MainViewController.shortErrorFromError(error: error))
self.stop()
}
private func simplePing(pinger: SimplePing, didSendPacket packet: NSData, sequenceNumber: UInt16) {
NSLog("#%u sent", sequenceNumber)
}
private func simplePing(pinger: SimplePing, didFailToSendPacket packet: NSData, sequenceNumber: UInt16, error: NSError) {
NSLog("#%u send failed: %@", sequenceNumber, MainViewController.shortErrorFromError(error: error))
}
private func simplePing(pinger: SimplePing, didReceivePingResponsePacket packet: NSData, sequenceNumber: UInt16) {
NSLog("#%u received, size=%zu", sequenceNumber, packet.length)
}
private func simplePing(pinger: SimplePing, didReceiveUnexpectedPacket packet: NSData) {
NSLog("unexpected packet, size=%zu", packet.length)
}
// MARK: utilities
static func displayAddressForAddress(address: NSData) -> String {
var hostStr = [Int8](repeating: 0, count: Int(NI_MAXHOST))
let success = getnameinfo(
address.bytes.assumingMemoryBound(to: sockaddr.self),
//UnsafePointer(address.bytes),
socklen_t(address.length),
&hostStr,
socklen_t(hostStr.count),
nil,
0,
NI_NUMERICHOST
) == 0
let result: String
if success {
result = String(cString: hostStr)
} else {
result = "?"
}
return result
}
/// Returns a short error string for the supplied error.
///
/// - parameter error: The error to render.
///
/// - returns: A short string representing that error.
static func shortErrorFromError(error: NSError) -> String {
if error.domain == kCFErrorDomainCFNetwork as String && error.code == Int(CFNetworkErrors.cfHostErrorUnknown.rawValue) {
if let failureObj = error.userInfo[kCFGetAddrInfoFailureKey] {
if let failureNum = failureObj as? NSNumber {
if failureNum.intValue != 0 {
let f = gai_strerror(Int32(failureNum.intValue))
if f != nil {
return String(cString: f!)
}
}
}
}
}
if let result = error.localizedFailureReason {
return result
}
return error.localizedDescription
}
// MARK: table view delegate callback
@IBOutlet var forceIPv4Cell: UITableViewCell!
@IBOutlet var forceIPv6Cell: UITableViewCell!
@IBOutlet var startStopCell: UITableViewCell!
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let cell = self.tableView.cellForRow(at: indexPath as IndexPath)!
switch cell {
case forceIPv4Cell, forceIPv6Cell:
cell.accessoryType = cell.accessoryType == .none ? .checkmark : .none
case startStopCell:
if self.pinger == nil {
let forceIPv4 = self.forceIPv4Cell.accessoryType != .none
let forceIPv6 = self.forceIPv6Cell.accessoryType != .none
self.start(forceIPv4: forceIPv4, forceIPv6: forceIPv6)
} else {
self.stop()
}
default:
fatalError()
}
self.tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}
func pingerWillStart() {
self.startStopCell.textLabel!.text = "Stop…"
}
func pingerDidStop() {
self.startStopCell.textLabel!.text = "Start…"
}
}
私はスウィフト4構文にそれを変換してきましたが、何もシミュレータや実際のデバイス上で動作しません。私はIPv4またはIPv6をタップしてから起動しますが、何も起こりません。
ファイルをappleからコピーしたか、自分で入力しましたか?リンゴからのアプリは私にはうまく見え、うまくいくはずです。 –
AppleからコピーしてSwift 4に変換しましたが、すべて同じです。 – petesalt