self.nflWebView = [[WKWebView alloc] initWithFrame:self.view.bounds];
self.nflWebView.backgroundColor = [UIColor clearColor];
self.nflWebView.opaque = NO;
[[self nflWebView] setDelegateViews: self];
self.nflWebView.tag = 10000;
[self.nflWebView loadHTMLString:html baseURL:[NSBundle mainBundle].bundleURL];
[self.view addSubview:self.nflWebView];
I have also try the another things:
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script
{
NSLog(#"stringByEvaluatingJavaScriptFromString");
NSLog(#"script :%#",script);
__block NSString *resultString = nil;
__block BOOL finished = NO;
WKWebView *obj_wkwebview=[[WKWebView alloc]init];
[obj_wkwebview evaluateJavaScript:script completionHandler:^(id result, NSError *error) {
if (error == nil) {
if (result != nil) {
resultString = [NSString stringWithFormat:#"%#", result];
}
} else {
NSLog(#"evaluateJavaScript error : %#", error);
}
finished = YES;
}];
while (!finished)
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}
return resultString;
}
its give the error.
Error Domain=WKErrorDomain Code=4 "A JavaScript exception occurred" UserInfo=0x170c788c0 {NSLocalizedDescription=A JavaScript exception occurred}
simple html content is loading successfull but html with javascript is not loading.
I have done a lot of Googling but not success. Please Suggest me if u have any another approach to do this thing.
Thanks in advance.
Related
I have a macOS project using objective-c. Basically I new to creating application for macOS. I don't not objective-c or swift but I have a nodejs file that I need to run and not sure how to.
#import <Cocoa/Cocoa.h>
int main(int argc, const char *argv[]) {
- (NSString *)runCommand:(NSString *)commandToRun
{
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:#"/nodefile.js"];
NSArray *arguments = [NSArray arrayWithObjects:
#"-c" ,
[NSString stringWithFormat:#"%#", commandToRun],
nil];
NSLog(#"run command:%#", commandToRun);
[task setArguments:arguments];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
NSFileHandle *file = [pipe fileHandleForReading];
[task launch];
NSData *data = [file readDataToEndOfFile];
NSString *output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return output;
}
return NSApplicationMain(argc, argv);
}
I have a finished application. I can not implement the closure of VKWebView from registration at the end of registration. Since I have not encountered this in the lens - p.
WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:theConfiguration];
webView.navigationDelegate = self;
webView.customUserAgent = "Cron";
[self.view addSubview:webView];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:#"https://myUrl"]];
[webView loadRequest:request];
in order to interact with the WKWebView, you can use the javascript functions for them.
After the WKWebView has finished loading (via delegate for example), yo can use the evaluateJavascript functions, to trigger any event in the web or in your iOS code.
For example:
[self.webview evaluateJavaScript:#"var foo = 1; foo + 1;" completionHandler:^(id result, NSError *error) {
if (error == nil)
{
if (result != nil)
{
NSInteger integerResult = [result integerValue]; // 2
NSLog(#"result: %d", integerResult);
}
}
else
{
NSLog(#"evaluateJavaScript error : %#", error.localizedDescription);
}
}];
The javascript function is:
var foo = 1; foo + 1;
There you can set any javascript function from objective-c side, or call any function in the web side.
For example, if you have a javascript function in your web site called:
func closeWeb()
You have to set the function like this:
[self.webview evaluateJavaScript:#"closeWeb();" completionHandler:^(id result, NSError *error) {
if (error == nil)
// Code for success
} else {
NSLog(#"evaluateJavaScript error : %#", error.localizedDescription);
}
}];
I have a web app which i am using as Web-view app for android and IOS app.I need to pass user data to the web-view app which i achieved for android but i have no knowledge on how to do it for IOS web-view.
I have my IOS code in x-code which is in objective-c and i need to send data from frontend javascript to Objective-c, which can access it.
below is my javascript code
var myAppName = 'myfakeappname';
var myActionType = 'myJavascriptActionType';
var myActionParameters = {}; // put extra info into a dict if you need it
// (separating the actionType from parameters makes it easier to parse in ObjC.)
var jsonString = (JSON.stringify(myActionParameters));
var escapedJsonParameters = escape(jsonString);
var url = myAppName + '://' + myActionType + "#" + escapedJsonParameters;
document.location.href = url;
below is my code from Viewcontroller.m
#import "ViewController.h"
#import <WebKit/WebKit.h>
#interface ViewController ()<WKNavigationDelegate>
#property (weak, nonatomic) IBOutlet WKWebView *vwWeb;
#property (weak, nonatomic) IBOutlet UIView *vwLoading;
#end
#implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.vwWeb.navigationDelegate = self;
NSURL *nsurl=[NSURL URLWithString:#"http://localhost:3000"];
NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl];
[self.vwWeb loadRequest:nsrequest];
// Do any additional setup after loading the view, typically from a nib.
}
-(void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
self.vwLoading.hidden = YES;
}
//below is the code i copy pasted from various resourses i found from forums
- (BOOL)webView:( WKWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
// these need to match the values defined in your JavaScript
NSString *myAppScheme = #"myfakeappname";
NSString *myActionType = #"myJavascriptActionType";
// ignore legit webview requests so they load normally
if (![request.URL.scheme isEqualToString:myAppScheme]) {
return YES;
}
// get the action from the path
NSString *actionType = request.URL.host;
// deserialize the request JSON
NSString *jsonDictString = [request.URL.fragment stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
NSLog(#"Hello, World!");
// look at the actionType and do whatever you want here
if ([actionType isEqualToString:myActionType]) {
NSLog(#"Missing function name");
// do something in response to your javascript action
// if you used an action parameters dict, deserialize and inspect it here
}
// make sure to return NO so that your webview doesn't try to load your made-up URL
return NO;
}
#end
Any help or suggestion will be greatly appreciated.
If your parameters is in the url, extract it by this property navigationAction.request.url in this function to get the params:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: #escaping (WKNavigationActionPolicy) -> Void)
Exactly like you started:
In JavaScript the buttons/links that need to trigger something on iOS app should do: window.location="myappname://func1";
Javascript should also have a accessible method (ie should be accessible from browser console for example) myobject.jsfunc()
On iOS WebView you intercept requests with myappname:// URL, something like:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSURL *URL = [request URL];
NSString *requestStr = [[request URL] absoluteString]; //Get the URL
//NSLog(#"Native method call '%#'", requestStr);
if ([requestStr hasPrefix:#"openpanzer"]) {
//The [URL host] is the next part of the link so we can use that like a selector
NSString *selectorName = [URL host];
id data = nil;
NSMutableArray *parameters = [NSMutableArray array];
if ( ![[URL path] isEqualToString:#""] )
{
selectorName = [NSString stringWithFormat:#"%#:", selectorName];
parameters = [NSMutableArray arrayWithArray: [[URL path] componentsSeparatedByString:#"/"] ];
[parameters removeObjectAtIndex:0]; //first object is just a slash "/"
if ( [parameters count] == 0 ) {
data = nil;
NSLog(#"NIL parameter call");
}
else if ( [parameters count] == 1 ) {
data = [parameters objectAtIndex:0];
NSLog(#"Single parameter call %#", data);
}
else {
data = parameters;
}
}
SEL method = NSSelectorFromString( selectorName );
if ([nativeGlue respondsToSelector:method]) {
if (data == nil)
[nativeGlue performSelector:method];
else
[nativeGlue performSelector:method withObject:data];
}
else {
NSLog(#"Can't find native method '%#' with param '%#'", selectorName, data);
}
return NO;
}
return YES;
}
On iOS (WebViewDelegate or AppDelegate) define your func1 ie: - (void) func1
If you need to send back results to your javascript app use:
[webView callJSFunction: jsFunc];
I'm trying to use the following javascript library with JavasScriptCode in iOS: javascript library
I'm reading it with the following code and everything looks great!
self.jsContext = [[JSContext alloc] init];
NSURL *scriptURL = [NSURL URLWithString:#"https://cdn.rawgit.com/Ambisafe/client-javascript/master/dist/ambisafe.js"];
NSError *error = nil;
NSString *script = [NSString stringWithContentsOfURL:scriptURL encoding:NSUTF8StringEncoding error:&error];
[self.jsContext evaluateScript:script];
When I run the following code, I have the expected results:
NSString *script = [NSString stringWithFormat:#"Ambisafe.generateRandomValue"];
NSString *value = [[self.jsContext evaluateScript:script] toString];
Results:
function (length) {
var randomBytes;
if (!length) {
length = 256 / 16;
}
randomBytes = crypto.randomBytes(Math.ceil(length));
return randomBytes.toString('hex');
}
When I try to run the indicated function, I have an "undefined" result:
NSString *script = [NSString stringWithFormat:#"Ambisafe.generateRandomValue(30)"];
NSString *value = [[self.jsContext evaluateScript:script] toString];
I executed the following code, and I have an "undefined" result too:
NSString *script = [NSString stringWithFormat:#"crypto"];
NSString *value = [[self.jsContext evaluateScript:script] toString];
If I test the indicated javascript library on a browser, it works fine!
Please check the Fiddle link.
Any idea?
I found the origin of the problem.
The indicated library uses the "window.crypto.getRandomValues" and it doesn't work in older browsers.
https://developer.mozilla.org/en-US/docs/Web/API/window.crypto.getRandomValues
Getting alert message when app is open in background.When I close the app from background when I launch the app it don't give me alert message. handleOpenURL not able to invoke in JavaScript when app is first time launch. Following are code
didFinishLaunchingWithOptions Code
NSURL* url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
NSString* invokeString = nil;
if (url) {
invokeString = [url absoluteString];
NSLog(#"iPaperReeder launchOptions = %#", url);
}
self.viewController.invokeString = invokeString;
AppDelgate.m
if (!url) { return NO; }
NSString* jsString = [NSString stringWithFormat:#"window.setTimeout(function(){ handleOpenURL(\"%#\"); }, 1)", url];
[self.viewController.webView stringByEvaluatingJavaScriptFromString:jsString];
// all plugins will get the notification, and their handlers will be called
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPluginHandleOpenURLNotification object:url]];
return YES;
It should output to this javascript function:
function handleOpenURL(url) {
alert('invoke: ' + url);
}
Please help me.
I think you are not doing right, Please follow my code as below:
You can easily sort out this problem.
In "CDVHandleOpenURL.m" file you need to change code as below :
NSString* jsString = [NSString stringWithFormat:#"document.addEventListener('deviceready',function(){if (typeof handleOpenURL === 'function') { handleOpenURL(\"%#\");}});", url];
To
NSString* jsString = [NSString stringWithFormat:#"if (typeof handleOpenURL === 'function') { handleOpenURL(\"%#\");} else { window._savedOpenURL = \"%#\"; }", url, url];
this will work perfectly.
Best of luck