如何从 iOS 推送插件调用 JavaScript 函数?
Posted
技术标签:
【中文标题】如何从 iOS 推送插件调用 JavaScript 函数?【英文标题】:How can I call JavaScript function from iOS push Plugin? 【发布时间】:2013-09-10 11:41:50 【问题描述】:我正在开发一个 Phonegap 应用程序。为了实现推送通知,我使用了一个 ios 插件(来自 github 的 AppDelegate+Notification 和 PushNotification 文件),并且成功地在 APNs 上注册设备并能够使用我的 MAC 机器的终端发送推送通知(使用 .php 文件)。
当我的应用程序处于活动模式时,我可以在“didReceiveRemoteNotification”块内接收通知。当我点击通知中心的任何通知时,也会执行此方法。
我面临的问题是:
-
当我的应用通过通知点击激活(处于后台状态)时,如何从“didReceiveRemoteNotification”获取 Notification.js 函数调用?
因为应用程序能够调用该函数:
1. AppDelegate+Notification.m
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
NSLog(@"didReceiveRemoteNotification AppDelegate+Notification.h :%@", userInfo);
PushNotification* pushHandler = [self.viewController getCommandInstance:@"PushNotification"];
NSMutableDictionary* mutableUserInfo = [userInfo mutableCopy];
// Get application state for iOS4.x+ devices, otherwise assume active
UIApplicationState appState = UIApplicationStateActive;
if([application respondsToSelector:@selector(applicationState)])
appState = application.applicationState;
if(appState == UIApplicationStateActive) //Active state
NSLog(@"UIApplicationStateActive");
[mutableUserInfo setValue:@"1" forKey:@"applicationStateActive"];
[pushHandler didReceiveRemoteNotification:mutableUserInfo];
else // BG state
NSLog(@"UIApplicationStateBackground");
[mutableUserInfo setValue:@"0" forKey:@"applicationStateActive"];
[mutableUserInfo setValue:[NSNumber numberWithDouble: [[NSDate date] timeIntervalSince1970]] forKey:@"timestamp"];
[pushHandler.pendingNotifications addObject:mutableUserInfo];
[[UIApplication sharedApplication] cancelAllLocalNotifications];
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
2. PushNotification.m
- (void)didReceiveRemoteNotification:(NSDictionary*)userInfo
NSLog(@"didReceiveRemoteNotification : %@", userInfo);
// Converting Dict to NSString in JSON format using NSJSONSerialization as per Cordova 2.4.0
NSError* error = nil;
NSString *jsStatement = nil;
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:userInfo options:0 error: &error];
if (error != nil)
jsStatement = [NSString stringWithFormat:@"window.plugins.pushNotification.notificationCallback(error: %@);",[error localizedDescription]];
else
jsStatement = [NSString stringWithFormat:@"window.plugins.pushNotification.notificationCallback(%@);", [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]];
[self writejavascript:jsStatement];
3. PushNotification.js
PushNotification.prototype.notificationCallback = function(notification)
alert ('JS notificationCallback');
当它已经处于活动状态并且通知到来时。最后一步的警报被触发(JS notificationCallback)
或者简单来说,如何从我的 ios 插件中调用 java 脚本函数?
【问题讨论】:
谁能帮我解决这个问题??? 【参考方案1】:在我看来你正在使用这个插件:https://github.com/mgcrea/cordova-push-notification(如果这不正确,请向我们提供正确插件的链接)
如果我上面引用的插件是正确的,我认为你错过了更新 AppDelegate.m 的步骤:
为了支持启动通知(应用程序从远程通知启动),您必须在返回 YES 之前添加以下块 - (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions ;
[self.window addSubview:self.viewController.view];
[self.window makeKeyAndVisible];
/* START BLOCK */
// PushNotification - Handle launch from a push notification
NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(userInfo)
PushNotification *pushHandler = [self.viewController getCommandInstance:@"PushNotification"];
NSMutableDictionary* mutableUserInfo = [userInfo mutableCopy];
[mutableUserInfo setValue:@"1" forKey:@"applicationLaunchNotification"];
[mutableUserInfo setValue:@"0" forKey:@"applicationStateActive"];
[pushHandler.pendingNotifications addObject:mutableUserInfo];
/* STOP BLOCK */
return YES;
我似乎记得,去年,我在处理 Urban Airship 版本插件的文档时遇到了问题……我不记得是否只需要添加前两行,或者整个块是否估计要加了。
无论如何,我认为问题出在 AppDelegate.m 中的 didFinishLaunchingWithOptions 方法上。
【讨论】:
抱歉,我忘了说我已经将这段代码写入了 didFinishLaunchingWithOptions 并且只有当应用程序不在后台运行时才会触发(我从活动的后台应用程序列表中删除了应用程序)。但我的情况是应用程序在后台应用程序列表中,并且通知来了,应用程序从通知点击激活。那么如何调用java脚本函数呢? 您是否想弄清楚当您“触摸”推送通知时应用程序激活时如何执行 PushNotification.prototype.notificationCallback? 是的,我希望它被执行以响应触摸推送通知。或者我想从 AppDelegate+Notification.m 中的本机函数“didReceiveRemoteNotification”调用任何 java 脚本函数。 您应该能够通过执行类似于 PushNotification.m 中的 didReceiveRemoteNotification 方法中所做的操作来从 Objective-C 端与您的 javascript 插件进行交互:` jsStatement = [NSString stringWithFormat:@" window.plugins.pushNotification.notificationCallback(error: %@);",[错误本地化描述]]; [self writeJavascript:jsStatement];` 它没有被调用。你能提供我完整的工作代码吗?【参考方案2】:我想你要找的是[webView stringByEvaluatingJavaScriptFromString]
。
你可以像这样调用你的javascript回调:
NSString *jsCallback = [NSString stringWithFormat:@"%@(%@);", @"window.plugins.pushNotification.notificationCallback", @"your notification message"];
[self.webView stringByEvaluatingJavaScriptFromString:jsCallback];
【讨论】:
webview
说 not found on object of type "appdelegate"
时出现错误。另外我使用的插件是org.apache.cordova.pushplugin
,有没有经验?我想根据通知打开 index.html 中的特定页面。以上是关于如何从 iOS 推送插件调用 JavaScript 函数?的主要内容,如果未能解决你的问题,请参考以下文章