在 AppDelegate 中从 Objective-C 调用 JavaScript



有没有办法从Objective-C调用设备令牌?

我刚刚创建了一个cordova ios项目,因为我只有Objective-C的基本知识。它将自动生成AppDelegate.m

@implementation AppDelegate
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.viewController = [[MainViewController alloc] init];
NSString * jsCallBack = [NSString stringWithFormat:@"myFunction()"];
[webView stringByEvaluatingJavaScriptFromString:jsCallBack];  
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
@end

如何从 inappbrowser 中加载的索引.html文件中调用 javascript 函数

<!DOCTYPE html>
<html>
<head>
<title>Device Ready Example</title>
<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<script type="text/javascript" charset="utf-8">
// Wait for device API libraries to load
//
myFunction()
{
alert('called');
}
function onLoad() {
document.addEventListener("deviceready", onDeviceReady, false);
}
// device APIs are available
//
function onDeviceReady() {
// Now safe to use device APIs
}
</script>
</head>
<body onload="onLoad()">
</body>
</html>

首先:

确保您的 Web 视图已经加载了 HTML 页面(如果您还需要修改 DOM 中的某些 UI 元素,它可能也应该已经呈现。加载本身是异步执行的。这意味着您不能在一个进程中实现它,而必须等到它准备好进行操作。

当您通过在应用程序的启动方法中注入调用函数时,我认为 Web 视图尚未准备好。

请改用 iOS 应用程序的委托方法: https://developer.apple.com/reference/uikit/uiwebviewdelegate

UIWebViewDelegate 会通知您某些状态(-changes)。 例如:

  • Webiew 开始加载内容
  • 单击了链接
  • 网页视图已完成加载

因此,我建议使用以下委托属性扩展您的 AppDelegate(或创建新委托):

@property (nonatomic) UIWebViewDelegate *webDelegate;

相应地设置 Web 视图的委托:

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.viewController = [[MainViewController alloc] init];
// I just used your very own code for this, I think you will have a separate property for this webView ?
webView.delegate = self;
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

并且还实现 webview 委托方法之一(在本例中,当 Web 视图完成加载时:

@implementation AppDelegate
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
...
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString * jsCallBack = [NSString stringWithFormat:@"myFunction()"];
[webView stringByEvaluatingJavaScriptFromString:jsCallBack];
}
@end

你可以从目标C中的任何位置调用javascript函数:

NSString *str=@"window['function_name'].apply(window,['param1','param2'])";

[webview evaluateJavaScript:str completionHandler:nil];

最新更新