首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nativescript: Zeroconf/Bonjour发现iOS回调不起作用

Nativescript: Zeroconf/Bonjour发现iOS回调不起作用
EN

Stack Overflow用户
提问于 2018-02-06 19:04:50
回答 1查看 156关注 0票数 1

我试图在我的Nativescript应用程序中在iOS上执行Zeroconf/Bonjour的发现。我正在使用下面的代码,但问题是WillSearchDidStopSearch或其他回调从不触发:

代码语言:javascript
复制
this.netServiceBrowser = NSNetServiceBrowser.new();

this.netServiceBrowser.delegate = <NSNetServiceBrowserDelegate> {
  netServiceBrowserDidFindDomainMoreComing: (browser: NSNetServiceBrowser, domainString: string, moreComing: boolean) => {
    console.log(`netServiceBrowserDidFindDomainMoreComing: ${domainString}`);
  },
  netServiceBrowserWillSearch: (browser:NSNetServiceBrowser) => {
    console.log(`netServiceBrowserWillSearch`);
  },
  netServiceBrowserDidStopSearch: (browser:NSNetServiceBrowser) => {
    console.log(`netServiceBrowserDidStopSearch`);
  },
  netServiceBrowserDidFindServiceMoreComing: (browser:NSNetServiceBrowser, service:NSNetService, moreComing:boolean) => {
    console.log(`netServiceBrowserDidFindServiceMoreComing, found service ${service.name}`);
    console.log(`moreComing: ${moreComing}`);
  }
}

this.netServiceBrowser.searchForRegistrationDomains(); // start searching for domains
this.netServiceBrowser.searchForServicesOfTypeInDomain(this.config.bonjour.serviceType, this.config.bonjour.serviceDomain);
setTimeout(() => { this.netServiceBrowser.stop(); },30000); // stop discovery after 30 secs

我的猜测是,我对代表中“回调”的定义做错了什么,但我不知道是什么原因。

这是打字的有关部分:

代码语言:javascript
复制
declare class NSNetServiceBrowser extends NSObject {
  static alloc(): NSNetServiceBrowser; // inherited from NSObject
  static new(): NSNetServiceBrowser; // inherited from NSObject
  delegate: NSNetServiceBrowserDelegate;
  includesPeerToPeer: boolean;
  removeFromRunLoopForMode(aRunLoop: NSRunLoop, mode: string): void;
  scheduleInRunLoopForMode(aRunLoop: NSRunLoop, mode: string): void;
  searchForBrowsableDomains(): void;
  searchForRegistrationDomains(): void;
  searchForServicesOfTypeInDomain(type: string, domainString: string): void;
  stop(): void;
}

interface NSNetServiceBrowserDelegate extends NSObjectProtocol {
  netServiceBrowserDidFindDomainMoreComing?(browser: NSNetServiceBrowser, domainString: string, moreComing: boolean): void;
  netServiceBrowserDidFindServiceMoreComing?(browser: NSNetServiceBrowser, service: NSNetService, moreComing: boolean): void;
  netServiceBrowserDidNotSearch?(browser: NSNetServiceBrowser, errorDict: NSDictionary<string, number>): void;
  netServiceBrowserDidRemoveDomainMoreComing?(browser: NSNetServiceBrowser, domainString: string, moreComing: boolean): void;
  netServiceBrowserDidRemoveServiceMoreComing?(browser: NSNetServiceBrowser, service: NSNetService, moreComing: boolean): void;
  netServiceBrowserDidStopSearch?(browser: NSNetServiceBrowser): void;
  netServiceBrowserWillSearch?(browser: NSNetServiceBrowser): void;
}
declare var NSNetServiceBrowserDelegate: {
  prototype: NSNetServiceBrowserDelegate;
};

谢谢你的指点!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-07 21:02:05

如果有人对此感兴趣,我可以在NativeScript社区的人的帮助下解决这个问题(谢谢!):

代码语言:javascript
复制
/* Define NSNetServiceBrowserDelegate implementation class */

class MyNSNetServiceBrowserDelegate extends NSObject implements NSNetServiceBrowserDelegate {
  public static ObjCProtocols = [NSNetServiceBrowserDelegate];

  static new(): MyNSNetServiceBrowserDelegate {
    return <MyNSNetServiceBrowserDelegate>super.new();
  }

  private _callback: (result: string) => void;

  public initWithCallback(callback: (result: string) => void): MyNSNetServiceBrowserDelegate {
    this._callback = callback;
    return this;
  }

  public netServiceBrowserDidFindDomainMoreComing(browser: NSNetServiceBrowser, domainString: string, moreComing: boolean) {
    console.log(`netServiceBrowserDidFindDomainMoreComing: ${domainString}`);
    this._callback(domainString);
  }

  public netServiceBrowserWillSearch(browser:NSNetServiceBrowser) {
    console.log(`netServiceBrowserWillSearch`);
  }

  public netServiceBrowserDidStopSearch(browser:NSNetServiceBrowser) {
    console.log(`netServiceBrowserDidStopSearch`);
  }

  public netServiceBrowserDidFindServiceMoreComing(browser:NSNetServiceBrowser, service:NSNetService, moreComing:boolean) {
    console.log(`netServiceBrowserDidFindServiceMoreComing, found service ${service.name}`);
    console.log(`moreComing: ${moreComing}`);
    this._callback(service.name);
  }
}

然后在提供者中出现这样的情况:

代码语言:javascript
复制
@Injectable()
export class BonjourProvider {
  private netServiceBrowser:NSNetServiceBrowser;

  constructor(private config:ConfigProvider) {
    this.netServiceBrowser = NSNetServiceBrowser.new();
  }

  public startDeviceDiscovery() {
    this.netServiceBrowser.delegate = MyNSNetServiceBrowserDelegate.new().initWithCallback(result => console.log(`MyNSNetServiceBrowserDelegate callback: ${result}`));

    // this.netServiceBrowser.searchForRegistrationDomains();
    this.netServiceBrowser.searchForServicesOfTypeInDomain('_http._tcp', 'local');
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48650170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档