我试图在我的Nativescript应用程序中在iOS上执行Zeroconf/Bonjour的发现。我正在使用下面的代码,但问题是WillSearch或DidStopSearch或其他回调从不触发:
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我的猜测是,我对代表中“回调”的定义做错了什么,但我不知道是什么原因。
这是打字的有关部分:
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;
};谢谢你的指点!
发布于 2018-02-07 21:02:05
如果有人对此感兴趣,我可以在NativeScript社区的人的帮助下解决这个问题(谢谢!):
/* 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);
}
}然后在提供者中出现这样的情况:
@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');
}
}https://stackoverflow.com/questions/48650170
复制相似问题