目标 C 科尔多瓦回调与实例方法的静态无效



我正在构建一个可以执行DNS查询的Cordova插件。由于操作是异步的,我需要使用回调来返回值。

我有

#import <dns_sd.h>
....
- (void)dnsQuery:(CDVInvokedUrlCommand*)command
{
    id domain = [command.arguments objectAtIndex:0];
    DNSServiceRef serviceRef;
    DNSServiceQueryRecord(&serviceRef, 0, 0, "hmspl.de", kDNSServiceType_TXT,
                      kDNSServiceClass_IN, queryCallback, command);
    DNSServiceProcessResult(serviceRef);
    DNSServiceRefDeallocate(serviceRef);
}

然后是回调,这是一个static void

static void queryCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex,
                      DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype,
                      uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context) {
if (errorCode == kDNSServiceErr_NoError && rdlen > 1) {
    NSMutableData *txtData = [NSMutableData dataWithCapacity:rdlen];
    for (uint16_t i = 1; i < rdlen; i += 256) {
        [txtData appendBytes:rdata + i length:MIN(rdlen - i, 255)];
    }
    NSString *theTXT = [[NSString alloc] initWithBytes:txtData.bytes length:txtData.length encoding:NSASCIIStringEncoding];
    NSLog(@"%@",    
    //PROBLEM HERE
    [self.commandDelegate sendPluginResult:theTXT callbackId:context.callbackId]; 
   }
}
@end

我需要使用初始方法返回回调:

[self.commandDelegate sendPluginResult:theTXT callbackId:command.callbackId];

但是我不能在static void方法中使用self

如何将值theTXT返回给 cordova 并将command.callbackId从原始方法传递到回调?

DNSServiceQueryRecord的最后一个参数是应用程序上下文,而不是传递 cordova 的命令,而是将 self 作为参数传递

在您的 .h 中

@property (strong, nonatomic) NSString * callbackId;

在你的.m中

- (void)dnsQuery:(CDVInvokedUrlCommand*)command
{
    self.callbackId = command.callbackId;
    id domain = [command.arguments objectAtIndex:0];
    DNSServiceRef serviceRef;
    DNSServiceQueryRecord(&serviceRef, 0, 0, "hmspl.de", kDNSServiceType_TXT,
                          kDNSServiceClass_IN, queryCallback, (__bridge void*)self);
    DNSServiceProcessResult(serviceRef);
    DNSServiceRefDeallocate(serviceRef);
}

所以你现在可以在 queryCallback 中使用它

static void queryCallback(DNSServiceRef sdRef, DNSServiceFlags flags, uint32_t interfaceIndex,
                      DNSServiceErrorType errorCode, const char *fullname, uint16_t rrtype,
                      uint16_t rrclass, uint16_t rdlen, const void *rdata, uint32_t ttl, void *context) {
if (errorCode == kDNSServiceErr_NoError && rdlen > 1) {
    NSMutableData *txtData = [NSMutableData dataWithCapacity:rdlen];
    for (uint16_t i = 1; i < rdlen; i += 256) {
        [txtData appendBytes:rdata + i length:MIN(rdlen - i, 255)];
    }
    NSString *theTXT = [[NSString alloc] initWithBytes:txtData.bytes length:txtData.length encoding:NSASCIIStringEncoding];
    NSLog(@"%@",    
    [context.commandDelegate sendPluginResult:theTXT callbackId:context.callbackId]; 
   }
}

最新更新