আইওএস জাভাস্ক্রিপ্ট ব্রিজ


101

আমি এমন একটি অ্যাপে কাজ করছি যেখানে আমি ইউআইউইউভিউ ভিউতে এবং নেটিভ আইওএস ফ্রেমওয়ার্ক উভয়ই একসাথে ব্যবহার করতে যাচ্ছি। আমি জানি যে আমি জাভাস্ক্রিপ্ট এবং উদ্দেশ্য-সি এর মধ্যে যোগাযোগ বাস্তবায়ন করতে পারি। এমন কোনও লাইব্রেরি রয়েছে যা এই যোগাযোগটি বাস্তবায়নের সহজতর করে? আমি জানি যে এইচটিএমএল 5 এবং জাভাস্ক্রিপ্টে নেটিভ আইওএস অ্যাপ্লিকেশন তৈরি করার জন্য বেশ কয়েকটি গ্রন্থাগার রয়েছে (উদাহরণস্বরূপ অ্যাপমবি, ফোনগ্যাপ) তবে ভারী জাভাস্ক্রিপ্ট ব্যবহারের সাথে নেটিভ আইওএস অ্যাপ্লিকেশন তৈরি করতে কোনও লাইব্রেরি আছে কিনা তা আমি নিশ্চিত নই। আমার দরকার:

  1. উদ্দেশ্য-সি থেকে জেএস পদ্ধতিগুলি কার্যকর করুন Exec
  2. জেএস থেকে উদ্দেশ্যমূলক-সি পদ্ধতিগুলি কার্যকর করুন
  3. অবজেক্টিভ-সি থেকে নেটিভ জেএস ইভেন্টগুলি শুনুন (উদাহরণস্বরূপ DOM প্রস্তুত ইভেন্ট)

1
আপনি WKWebView ব্যবহার করতে পারেন: জাভাস্ক্রিপ্ট উইন্ডো থেকে কল করুন wewebkit.messageHandlers {{NAME} .পোস্টমেজেজ (বার্তা) এবং তারপরে এটি হ্যান্ডেল করুন [WKUserContentController addScriptMessageHandler: নাম:] JS
Kostyl

উত্তর:


150

কয়েকটি গ্রন্থাগার রয়েছে, তবে আমি বড় প্রকল্পগুলিতে এর কোনও ব্যবহার করি নি, তাই আপনি এগুলি চেষ্টা করে দেখতে পারেন:

-

তবে আমি মনে করি এটি এত সহজ কিছু যা আপনি নিজেই চেষ্টা করে দেখতে পারেন। যখন আমার এটি করার দরকার হয়েছিল তখন আমি ব্যক্তিগতভাবে ঠিক এটি করেছি। আপনি আপনার প্রয়োজন অনুসারে একটি সাধারণ গ্রন্থাগারও তৈরি করতে পারেন।

1. উদ্দেশ্য-সি থেকে জেএস পদ্ধতি কার্যকর করুন

এটি কোডের একমাত্র লাইন।

NSString *returnvalue = [webView stringByEvaluatingJavaScriptFromString:@"your javascript code string here"];

অফিসিয়াল ইউআইউইউভিউ ভিউ ডকুমেন্টেশন সম্পর্কে আরও বিশদ ।

২. জেএস থেকে উদ্দেশ্যমূলক-সি পদ্ধতিগুলি কার্যকর করুন ute

এটি দুর্ভাগ্যক্রমে কিছুটা জটিল, কারণ ম্যাক ওএসএক্স-তে একই উইন্ডো স্ক্রিপ্টঅবজেক্ট সম্পত্তি (এবং শ্রেণি) নেই যা দুজনের মধ্যে সম্পূর্ণ যোগাযোগের অনুমতি দেয়।

তবে, আপনি সহজেই জাভাস্ক্রিপ্ট কাস্টম তৈরি ইউআরএল থেকে কল করতে পারেন:

window.location = yourscheme://callfunction/parameter1/parameter2?parameter3=value

এবং এটির সাথে এটি উদ্দেশ্য-সি থেকে বিরত করুন:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
   NSURL *URL = [request URL]; 
   if ([[URL scheme] isEqualToString:@"yourscheme"]) {
       // parse the rest of the URL object and execute functions
   } 
}

এটি যতটা পরিষ্কার হতে পারে তেমন পরিষ্কার নয় (বা উইন্ডোস্ক্রিপ্টঅবজেক্ট ব্যবহার করে) তবে এটি কাজ করে।

৩.উজেক্টিভ-সি থেকে নেটিভ জেএস ইভেন্টগুলি শুনুন (উদাহরণস্বরূপ ডোম প্রস্তুত ইভেন্ট)

উপরের ব্যাখ্যা থেকে, আপনি দেখতে পাচ্ছেন যে আপনি যদি এটি করতে চান তবে আপনাকে কিছু জাভাস্ক্রিপ্ট কোড তৈরি করতে হবে, আপনি যে ইভেন্টটি পর্যবেক্ষণ করতে চান তার সাথে এটি সংযুক্ত করতে হবে এবং সঠিক window.locationকলটিকে বাধা দেওয়ার জন্য কল করতে হবে।

আবার, পরিষ্কার হওয়া উচিত যেমনটি হওয়া উচিত নয়, তবে এটি কাজ করে।


12
ইঙ্গিত: আপনার স্কিমে আন্ডারস্কোর বা অনুরূপ রাখবেন না।
ফেব্ব

4
এবং যখন আপনি
ভাবেন

2
অন্য একটি ইঙ্গিত:
ঝাঁকুনি

@ ফোলিটো হাই, আপনি বলেছিলেন "তবে আমি বড় প্রকল্পগুলিতে এর কোনটিই ব্যবহার করিনি", কেন ?? আপনি কি এই লাইব্রেরিতে বেশ কয়েকটি সমস্যা পেয়েছেন ??? আগাম ধন্যবাদ.
জেআরসি

1
কোন কারণ নাই. আমি কেবল এগুলি ব্যবহার করি নি, তাই বড় প্রকল্পগুলিতে সেগুলি ব্যবহার করার বিষয়ে আমি মন্তব্য করতে পারি না। আমি এটা স্পষ্ট করতে চেয়েছিলাম। :)
ফললেটটো

57

গ্রহণযোগ্য উত্তরে জেএস থেকে উদ্দেশ্য সি কল করার প্রস্তাবিত পদ্ধতিটি প্রস্তাবিত নয়। সমস্যার একটি উদাহরণ: আপনি যদি তাত্ক্ষণিকভাবে দু'বার কল করেন তবে একটি উপেক্ষা করা হবে (আপনি খুব দ্রুত অবস্থান পরিবর্তন করতে পারবেন না)।

আমি নিম্নলিখিত বিকল্প পদ্ধতির সুপারিশ:

function execute(url) 
{
  var iframe = document.createElement("IFRAME");
  iframe.setAttribute("src", url);
  document.documentElement.appendChild(iframe);
  iframe.parentNode.removeChild(iframe);
  iframe = null;
}

আপনি executeবারবার ফাংশনটি কল করেন এবং যেহেতু প্রতিটি কল তার নিজস্ব আইফ্রেমে সঞ্চালিত হয় তাই দ্রুত কল করার সময় সেগুলি এড়ানো হবে না।

এই লোকটির কাছে ক্রেডিট ।


1
আপনি জাভাস্ক্রিপ্টে একটি সারিও ব্যবহার করতে পারেন যা .src থেকে খুব দ্রুত পরিবর্তন হওয়া বার্তাগুলি হারাতে এড়াতে iOS আনতে পারে। উপরের সাথে সংযুক্ত বাস্তবায়ন, github.com/marcuswestin/WebViewJavascriptBridge , একটি সারি পদ্ধতির ব্যবহার করে।
কেভিন্টকফলিন

12

আপডেট: এটি আইওএস 8 এ পরিবর্তিত হয়েছে My আমার উত্তরটি পূর্ববর্তী সংস্করণগুলিতে প্রযোজ্য।

একটি বিকল্প, এটি আপনাকে অ্যাপ স্টোর থেকে প্রত্যাখ্যান করতে পারে, ওয়েবস্ক্রিপ্টঅবজেক্টটি ব্যবহার করা use

এই এপিআইগুলি ওএসএক্সে সর্বজনীন তবে আইওএসে নেই।

আপনাকে অভ্যন্তরীণ ক্লাসগুলিতে ইন্টারফেসগুলি সংজ্ঞায়িত করতে হবে।

@interface WebScriptObject: NSObject
@end

@interface WebView
- (WebScriptObject *)windowScriptObject;
@end

@interface UIWebDocumentView: UIView
- (WebView *)webView;
@end

আপনাকে আপনার অবজেক্টটি এমনভাবে সংজ্ঞায়িত করতে হবে যা আপনার ওয়েবস্ক্রিপ্টঅবজেক্ট হিসাবে পরিবেশন করবে

@interface WebScriptBridge: NSObject
- (void)someEvent: (uint64_t)foo :(NSString *)bar;
- (void)testfoo;
+ (BOOL)isKeyExcludedFromWebScript:(const char *)name;
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector;
+ (WebScriptBridge*)getWebScriptBridge;
@end

static WebScriptBridge *gWebScriptBridge = nil;

@implementation WebScriptBridge
- (void)someEvent: (uint64_t)foo :(NSString *)bar
{
    NSLog(bar);
}

-(void)testfoo {
    NSLog(@"testfoo!");
}

+ (BOOL)isKeyExcludedFromWebScript:(const char *)name;
{
    return NO;
}

+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector;
{
    return NO;
}

+ (NSString *)webScriptNameForSelector:(SEL)sel
{
    // Naming rules can be found at: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/WebKit/Protocols/WebScripting_Protocol/Reference/Reference.html
    if (sel == @selector(testfoo)) return @"testfoo";
    if (sel == @selector(someEvent::)) return @"someEvent";

    return nil;
}
+ (WebScriptBridge*)getWebScriptBridge {
    if (gWebScriptBridge == nil)
        gWebScriptBridge = [WebScriptBridge new];

    return gWebScriptBridge;
}
@end

এখন আপনার ইউআইবিউভিউতে সেই উদাহরণটি সেট করুন

if ([uiWebView.subviews count] > 0) {
    UIView *scrollView = uiWebView.subviews[0];

    for (UIView *childView in scrollView.subviews) {
        if ([childView isKindOfClass:[UIWebDocumentView class]]) {
            UIWebDocumentView *documentView = (UIWebDocumentView *)childView;
            WebScriptObject *wso = documentView.webView.windowScriptObject;

            [wso setValue:[WebScriptBridge getWebScriptBridge] forKey:@"yourBridge"];
        }
    }
}

এখন আপনার জাভাস্ক্রিপ্টের ভিতরে আপনি কল করতে পারেন:

yourBridge.someEvent(100, "hello");
yourBridge.testfoo();

আমার অ্যাপ্লিকেশন স্টোরটিতে প্রত্যাখ্যান করা হয়। : বিষয় আমি পেয়েছি ছিল "UIWebDocumentView অ্যাপ্লিকেশন রয়েছে বা APPNAME অ পাবলিক ক্লাস থেকে উত্তরাধিকারী"
chandru

5

আইওএস 8-এ আপনি ইউআইউইভিউভিউয়ের পরিবর্তে ডব্লিউকেউব ভিউতে দেখতে পারেন । এটিতে নিম্নলিখিত ক্লাসটি রয়েছে: ডব্লিউকেস্ক্রিপ্টমেসেজ হ্যান্ডলার: ওয়েবপৃষ্ঠায় চলমান জাভাস্ক্রিপ্ট থেকে বার্তা প্রাপ্তির জন্য একটি পদ্ধতি সরবরাহ করে।


অবশ্যই, তবে পদ্ধতিটি ধারাবাহিকতা কার্যকর করছে না .. এটি ফ্রেমওয়ার্কে একটি বাগ যা আপেল সরবরাহ করেছে
জোশ কেথেপল্লি

WKWebViewকুকিজ সঠিকভাবে পরিচালনা না করা সহ প্রচুর সমস্যা রয়েছে। এখানে আসা প্রত্যেকের জন্য কেবল একটি সতর্কবার্তা এটি ভেবে আপনার সমস্ত সমস্যার সমাধান করবে - গুগল এটিকে গ্রহণ করার আগে কিছুটা প্রায়।
কাপউনটাই

3

এটি iOS7 এর মাধ্যমে সম্ভব, চেকআউট http://blog.bignerdranch.com/3784- জাভাস্ক্রিপ্টकोर- এবং- ios-7/


3
সত্যই নয়: জাভাস্ক্রিপ্টকোর ইউআইবিউবভিউগুলির সাথে ইন্টারঅ্যাক্ট করে না। এটি দুর্দান্ত সরঞ্জাম, তবে বিভিন্ন শ্রেণীর সমস্যার জন্য। ;)
ফললেটটো

1
হ্যাঁ এটি করে: জেএস কনটেক্সট * প্রসঙ্গ = [_webView মান forKeyPath: @ "ডকুমেন্টভিউ.ওয়েবভিউ.মাইনফ্রেম.জভা স্ক্রিপ্ট কনটেক্সট"]; তবে জাভাস্ক্রিপ্টকোর কোনও বাস্তব ব্যবহারের জন্য এই মুহূর্তে খুব বগিযুক্ত।
ম্যালহাল

0

আপনার সেরা বাজি অ্যাপ্লিলারেটর টাইটানিয়াম অফার। তারা ইতিমধ্যে ওয়েবকিট দ্বারা ব্যবহৃত ভি 8 ইঞ্জিন জাভাস্ক্রিপ্ট কোর ইঞ্জিন ব্যবহার করে একটি ওজ-সি জাভাস্ক্রিপ্ট ব্রিজ তৈরি করেছে । এটি ওপেন সোর্স, সুতরাং আপনি এটি ডাউনলোড করতে এবং আপনার পছন্দ মতো ওবজে-সি-তে টিঙ্কার করতে সক্ষম হবেন।


@ হোভা, ওবজ-সি ভি 8 ব্রিজ নয়। ভি 8 কেবলমাত্র অ্যান্ড্রয়েডের জন্যই লিভারেজ করা হয়।
রস

0

কিরিনজেএস প্রকল্পটি দেখুন: কিরিন জেএস যা প্ল্যাটফর্মটিতে চালিত পর্যাপ্ত অ্যাপ্লিকেশন যুক্তি এবং নেটিভ ইউআইয়ের জন্য জাভাস্ক্রিপ্ট ব্যবহার করতে দেয়।


কেউ কি এখনও কিরিনে অবদান রাখে? আমি গত কয়েক মাসে কোনও কার্যকলাপ দেখছি না ...
স্যাম

0

আমি ওয়েবভিউজভাস্ক্রিপ্টব্রিজের মতো একটি লাইব্রেরি তৈরি করেছি, তবে এটি আরও জিকুয়ের মতো, সেটআপ করা সহজ এবং ব্যবহার করা সহজ। JQuery এর উপর নির্ভর করে না (যদিও এর কৃতিত্বের সাথে আমি জানতাম যে, ওয়েবভিউজভাস্ক্রিপ্টব্রিজটি লেখার আগেই এটি উপস্থিত ছিল আমি ডুব দেওয়ার আগে কিছুটা পিছনে থাকতে পারলাম)। আমার সম্পর্কে আপনি কী মনে করেন জানি! jockeyjs


0

আপনি iOS 8 WKWebView ব্যবহার করে থাকেন, কটাক্ষপাত XWebView যা স্বয়ংক্রিয়ভাবে জাভাস্ক্রিপ্ট নেটিভ ইন্টারফেস প্রকাশ করতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.