Question

J'essaie d'utiliser l'une des nouvelles fonctionnalités d'iOS7, le JavaScriptCore Framework.Je peux réussir à générer une chaîne helloWorld à partir de Javascript, mais ce qui m'intéresse, c'est de faire des HTTP POST en Javascript, puis de transmettre la réponse à Objective-C.Malheureusement, lorsque je crée un XMLHttpRequest objet en Javascript, j'obtiens EXC_BAD_ACCESS (code=1, address=....).

Voici le code Javascript (hello.js):

var sendSamplePost = function () {
    // when the following line is commented, everything works,
    // if not, I get EXC_BAD_ACCESS (code=1, address=....)
    var xmlHttp = new XMLHttpRequest();
};

var sayHello = function (name) {
    return "Hello " + name + " from Javascript";
};

Voici le code Objective-C dans mon ViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    JSContext *context = [[JSContext alloc] initWithVirtualMachine:[[JSVirtualMachine alloc] init]];

    NSString *scriptPath = [[NSBundle mainBundle] pathForResource:@"hello" ofType:@"js"];
    NSLog(@"scriptPath: %@", scriptPath);
    NSString *script = [NSString stringWithContentsOfFile:scriptPath encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"script: %@", script);

    [context evaluateScript:script];

    JSValue *sayHelloFunction = context[@"sayHello"];
    JSValue *returnedValue = [sayHelloFunction callWithArguments:@[@"iOS"]];

    // this works!
    self.label.text = [returnedValue toString];


    JSValue *sendSamplePostFunction = context[@"sendSamplePost"];

    // this doesn't work :(
    [sendSamplePostFunction callWithArguments:@[]];
}

Se pourrait-il que la fonctionnalité des requêtes HTTP ne soit pas fournie dans JavaScriptCore Framework ?Si oui, puis-je surmonter ce problème en utilisant UIWebViewc'est -stringByEvaluatingJavaScriptFromString:?Et si je compilais et incluais dans mon projet un autre moteur Javascript (par ex.V8) ?

Était-ce utile?

La solution

Je suppose que les requêtes HTTP ne font pas partie de JavaScript Core, car elles font vraiment partie du navigateur, pas du langage JavaScript.
Je suppose que le noyau JavaScript inclut uniquement ce qui est dans la définition ECMAScript.

Si vous voulez AJAX, alors WebView est la voie à suivre.

Autres conseils

XMLHttpRequest ne fait pas partie, comme indiqué précédemment, de JavaScript, mais vous pouvez toujours envelopper l'URLRequest iOS afin qu'il soit disponible dans votre JS.

dans JSUtils.h

   @protocol UtilsExport;

   @interface JSUtils : NSObject <UtilsExport>
   @end

   @protocol UtilsExport <JSExport>
   - (void)get:(NSString *)url then:(JSValue *)jsCallback;
   @end

dans JSUtils.m

#import "JSUtils.h"

- (void)get:(NSString *)url then:(JSValue *)callback {
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
                                                           cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                                                       timeoutInterval:10];
    [request setHTTPMethod:@"GET"];
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
        if ([data length] > 0 && error == nil) {
            [callback callWithArguments:@[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding], @YES]];
        } 
    }];
}

Ensuite, liez l'instance au JSContext quelque part dans votre code

JSContext *context = [[JSContext alloc] init];
context[@"utils"] = [[JSUtils alloc] init];

depuis votre fichier JS, vous pouvez maintenant appeler

utils.getThen('http://localhost/api/dashboard', function(resultString){
  console.log(resultString)
}

Vous pouvez également utiliser un bloc et le lier directement au JSContext pour obtenir le même résultat.

JSContext *context = [[JSContext alloc] init];

context[@"request"] = ^(NSString *url) {
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]
                                                       cachePolicy:NSURLRequestReloadIgnoringCacheData
                                                   timeoutInterval:10];

    NSURLResponse *response = nil;

    [request setHTTPMethod:@"GET"];
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
    NSString *body = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    return body;
};

En JS :

var body = request(url);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top