سؤال

أحاول استخدام إحدى ميزات iOS7 الجديدة، وهي JavaScriptCore Framework.يمكنني بنجاح إخراج سلسلة helloWorld من Javascript، ولكن ما يهمني هو إجراء عمليات نشر HTTP في Javascript ثم تمرير الاستجابة إلى Objective-C.لسوء الحظ، عندما أقوم بإنشاء XMLHttpRequest كائن في جافا سكريبت، أحصل عليه EXC_BAD_ACCESS (code=1, address=....).

إليك كود جافا سكريبت (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";
};

إليك رمز Objective-C داخل ملفي 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:@[]];
}

هل يمكن أن تكون وظيفة طلبات HTTP غير متوفرة في JavaScriptCore Framework؟إذا كانت الإجابة بنعم، فهل يمكنني التغلب على هذا باستخدام UIWebView-stringByEvaluatingJavaScriptFromString:؟ماذا لو قمت بتجميع محرك جافا سكريبت آخر وإدراجه في مشروعي (على سبيل المثال:V8)؟

هل كانت مفيدة؟

المحلول

أعتقد أن طلبات HTTP ليست جزءًا من JavaScript Core، لأنها في الواقع جزء من المتصفح، وليست لغة JavaScript.
أفترض أن JavaScript core يتضمن فقط ما هو موجود في تعريف ECMAScript.

إذا كنت تريد AJAX، فإن WebView هو الحل الأمثل.

نصائح أخرى

XMLHttpRequest، كما ذكرنا من قبل، ليس جزءًا من JavaScript، ولكن لا يزال بإمكانك تغليف iOS URLRequest بحيث يكون متاحًا في JS الخاص بك.

في JSUtils.h

   @protocol UtilsExport;

   @interface JSUtils : NSObject <UtilsExport>
   @end

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

في 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]];
        } 
    }];
}

بعد ذلك، قم بربط المثيل بـ JSContext في مكان ما في التعليمات البرمجية الخاصة بك

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

من ملف JS الخاص بك، يمكنك الآن الاتصال

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

يمكنك أيضًا استخدام كتلة وربطها مباشرةً بنص JSContext للحصول على نفس النتيجة.

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;
};

في شبيبة:

var body = request(url);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top