- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我无法让我的插件在使用 Cocoa 异步套接字库的 Phonegap 3.3 上正常运行。问题出现在下面代码中的 didReadData 方法中。当我将响应数据输出到控制台时,响应数据是正确的,但是,我无法使 javascript 代码的回调正常工作。我能说的最好的是 [self writeJavascript:[pluginResult toErrorCallbackString:callbackId]] 中使用的 callbackId 与 sendMessage 方法中计算的 callbackId 不同。非常感谢任何帮助!
/********* TCPSockets.m Cordova Plugin Implementation *******/
#import "TCPSockets.h"
#import "GCDAsyncSocket.h"
@implementation TCPSockets
#define ENABLE_BACKGROUNDING 1
#pragma mark Plugin Start
- (void)sendMessage:(CDVInvokedUrlCommand*)command;
{
NSString* sendMessage = [command.arguments objectAtIndex:0];
NSString* myCallbackId = command.callbackId;
NSLog(@"Callback Id is %@", myCallbackId);
if (sendMessage == nil) {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR
messageAsString: @"Error: No parameters for plugin"];
[self.commandDelegate sendPluginResult:pluginResult callbackId:myCallbackId];
}
else
{
port = [[command.arguments objectAtIndex:0] retain];
host = [[command.arguments objectAtIndex:1] retain];
message = [[command.arguments objectAtIndex:2] retain];
connectionTimeout = [[command.arguments objectAtIndex:3] retain];
secureConnection = [[command.arguments objectAtIndex:4] retain];
response = @"";
error = nil;
dispatch_queue_t mainQueue = dispatch_get_main_queue();
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:mainQueue];
if ([secureConnection boolValue])
{
NSLog(@"Connecting (SSL) to \"%@\" on port %i...", host, [port intValue]);
if (![asyncSocket connectToHost:host onPort:[port intValue] withTimeout: ([connectionTimeout intValue] / 1000) error:&error])
{
NSLog(@"Error connecting: %@", error);
response = error.localizedDescription;
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
[self.commandDelegate sendPluginResult:pluginResult callbackId:myCallbackId];
}
}
else
{
NSLog(@"Connecting to \"%@\" on port %i...", host, [port intValue]);
if (![asyncSocket connectToHost:host onPort:[port intValue] withTimeout:([connectionTimeout intValue] / 1000) error:&error])
{
NSLog(@"Error connecting: %@", error);
response = error.localizedDescription;
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR];
[pluginResult setKeepCallback:[NSNumber numberWithBool:YES]];
[self.commandDelegate sendPluginResult:pluginResult callbackId:myCallbackId];
}
}
}
}
- (id)init
{
if ((self = [super init]))
{
// Setup logging framework
//[DDLog addLogger:[DDTTYLogger sharedInstance]];
}
return self;
}
#pragma mark Socket Delegate
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port
{
NSLog(@"socket:%p didConnectToHost:%@ port:%hu", sock, self->host, (UInt16)self->port);
if ([secureConnection boolValue])
{
// SSL connection
#if ENABLE_BACKGROUNDING && !TARGET_IPHONE_SIMULATOR
{
// Backgrounding doesn't seem to be supported on the simulator yet
[sock performBlock:^{
if ([sock enableBackgroundingOnSocket])
{
NSLog(@"Enabled backgrounding on socket");
}
else
{
NSLog(@"Enabling backgrounding failed!");
}
}];
}
#endif
// Configure SSL/TLS settings (see documentation for the startTLS method in GCDAsyncSocket.h)
NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:3];
// To connect to a test server, with a self-signed certificate, use settings similar to this:
// Allow expired certificates
[settings setObject:[NSNumber numberWithBool:YES]
forKey:(NSString *)kCFStreamSSLAllowsExpiredCertificates];
// Allow self-signed certificates
[settings setObject:[NSNumber numberWithBool:YES]
forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
// Don't validate the certificate chain
[settings setObject:[NSNumber numberWithBool:NO]
forKey:(NSString *)kCFStreamSSLValidatesCertificateChain];
NSLog(@"Starting SSL with settings:\n%@", settings);
[sock startTLS:settings];
}
else
{
#if ENABLE_BACKGROUNDING && !TARGET_IPHONE_SIMULATOR
{
// Backgrounding doesn't seem to be supported on the simulator yet
[sock performBlock:^{
if ([sock enableBackgroundingOnSocket])
{
NSLog(@"Enabled backgrounding on socket");
}
else
{
NSLog(@"Enabling backgrounding failed!");
}
}];
}
#endif
NSData *requestData = [[message dataUsingEncoding:NSUTF8StringEncoding] retain];
NSLog(@"Sending:%@", message);
[sock writeData:requestData withTimeout:([connectionTimeout intValue] / 1000) tag:0];
[sock readDataToData:[GCDAsyncSocket LFData] withTimeout:([connectionTimeout intValue] / 1000) tag:0];
}
}
- (void)socketDidSecure:(GCDAsyncSocket *)sock
{
NSLog(@"socketDidSecure:%p", sock);
NSData *requestData = [[message dataUsingEncoding:NSUTF8StringEncoding] retain];
NSLog(@"Sending:%@", message);
[sock writeData:requestData withTimeout:([connectionTimeout intValue] / 1000) tag:0];
[sock readDataToData:[GCDAsyncSocket LFData] withTimeout:([connectionTimeout intValue] / 1000) tag:0];
}
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
NSLog(@"socket:%p didWriteDataWithTag:%ld", sock, tag);
}
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
NSLog(@"socket:%p didReadData:WithTag:%ld", sock, tag);
response = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] retain];
response = [[response stringByReplacingOccurrencesOfString:@"\n" withString:@""] retain];
NSLog(@"Resposne data: %@", response);
pluginResult = [[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:response] retain];
[self writeJavascript:[pluginResult toErrorCallbackString:callbackId]];
// Release instance of GCDAsyncSocket
[asyncSocket setDelegate:nil delegateQueue:NULL];
[asyncSocket disconnect];
[asyncSocket release];
}
- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(NSError *)err
{
NSLog(@"socketDidDisconnect:%p withError: %@", sock, err);
if (err != nil) {
response = [err.localizedDescription retain];
pluginResult = [[CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:response] retain];
[self writeJavascript:[pluginResult toErrorCallbackString:callbackId]];
} else {
response = [[response stringByReplacingOccurrencesOfString:@"\n" withString:@""] retain];
pluginResult = [[CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:response] retain];
[self writeJavascript:[pluginResult toSuccessCallbackString:callbackId]];
}
}
@end
最佳答案
在你的 .h 上创建一个属性
@property (nonatomic, strong) NSString* myCallbackId;
在 sendData 上改变
NSString* myCallbackId = command.callbackId;
到
self.myCallbackId = command.callbackId;
在 didReadData 上改变
[self writeJavascript:[pluginResult toErrorCallbackString:callbackId]];
到
[self writeJavascript:[pluginResult toErrorCallbackString:self.callbackId]];
关于ios - 在委托(delegate)方法返回时使用 Cocoa 异步库的 Phonegap 插件中缺少回调 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21615195/
Example image 如何在 Phonegap 中添加像这张图片这样的 float 气泡通知。 最佳答案 没有您正在寻找的“开箱即用”插件。但是,您可以创建自己的插件或简单地使用 phonega
我正在使用 HTML 和 JS、JQuery Mobile 构建一个应用程序,并使用 PhoneGap Build 进行打包。客户想知道是否可以添加打印功能...有人知道吗?没有 PG Build 打
我已经安装了 Phonegap 使用 $ npm install -g PhoneGap 我也创建了项目。之后我做了 $ PhoneGap build android 它给出了 [phonegap]
我尝试创建 Phonegap 项目,其中需要集成 ASIHTTPRequest 和 JASON 引用, 并出现以下错误 ld: duplicate symbol _SBJSONErrorDomain
我有一个 Phonegap 应用程序,我从早期版本的 Phonegap 开始,我想升级到最新版本。我需要采取哪些步骤来升级它? 我正在寻求一般性答案,但我的具体情况是 Phonegap 1.1.0 -
我已在我的 MAC 电脑(IOS 10.5.8,SDK 3.1.2)上成功安装 PhoneGap。尝试创建一个新的基于 PhoneGap 的应用程序,包含 PhoneGap 框架并将所需的文件复制到
我正在 phonegap 中为三个不同的平台构建一个应用程序:Android、iOS 和 Blackberry。这样做时,我必须检测设备类型,以便我可以在不同平台和不同设备(如 Android Pho
开始在Mac上使用phonegap(Xcode 4,构建iPhone应用程序)我已经阅读了很多有关名为phonegap.plist的文件的内容,包括外部URL的白名单和其他内容。 这是我的问题,我在
所以我有一个运行 Phonegap 1.4.0 的应用程序(不要问),我决定升级到 1.8.1,这样做时 Phonegap 全局变量不再存在,将被替换为实用程序。 所以我转换了每一次出现: var t
我尝试了什么: 我正在开发一个安卓应用程序。在我的应用程序中,我必须打开 -> 向用户显示 Microsoft Office 文档(doc、docx、xls、xlsx、ppt、pptx)内容。为此,我
使用phonegap制作iOS应用时,ChildBrowser插件可以打开一个可以使用phonegap功能的远程页面吗? 例如:在phonegap应用程序中的index.html,调用childbro
我有一个带有 angularjs 的网络应用程序。我想使用 phonegap 将它变成一个移动应用程序 (android)。 我使用了 phonegap 构建:https://build.phoneg
我正在使用 Phonegap build 为每个平台生成可执行文件。每次更改代码时,我都必须在 phonegap build 上上传代码并生成新的 Apk 文件(适用于 android)。我不想在真实
我很生气,这是毫无疑问的,除了明显的可见差异之外,有人报告高度为: $('body').outerHeight(); //1780 与在我的本地 Windows 8 机器上使用 phonegap
我最近使用 phonegap 完成了我的第一个混合应用程序项目。当谈到公开测试时,我有点害怕签名过程。我从这里以及网上的其他地方阅读了许多不同的建议 fragment 来完成这项工作。 以下是如何为
我是 phonegap 的新手,我尝试创建一个简单的 phonegap 应用程序。 使用命令行安装phonegap后:--- 我已经成功创建了项目,但是当我尝试运行 phonegap build io
我正在为 Android 平台制作一个 phonegap 应用程序。在这个应用程序中,我想在多个 html 页面中滑动导航。请告诉我该怎么做。要么在单个 html 页面中完成,要么我必须为此滑动导航创
是否有任何插件可用于 Juce我可以添加哪些库可以同时适用于 IOS 和 android?如果没有,我如何集成 Juce我的电话间隙应用程序中的库? 最佳答案 没有插件。但您可以使用介绍榨汁机来创建不
Phonegap 刚刚推出了一种方法,可以使用以下命令使用本地服务器立即查看您对 phonegap 应用程序的更改: phonegap serve 然后通过下载 PhoneGap Developer
我们对如何集成phonegap插件,然后使用phonegap build构建我们的移动应用程序有一些疑问,这可能吗? 当您使用 Phonegapbuild 构建您的应用程序时,它会为所有受支持的设备构
我是一名优秀的程序员,十分优秀!