【问题标题】:Run JS Code to fetch data in swift运行 JS 代码以快速获取数据
【发布时间】:2017-02-13 10:26:35
【问题描述】:

我需要在 CloudKit 中获取 CkAsset 的网址。然而,在 swift 中,Apple 不允许我们获取直接的 WebURL,它只下载资产并给我们文件 URL。但是,使用 javascript 是可能的。因此,我编写了一个获取 CkAsset WebURL 的 JS 文件。当我在浏览器中运行这个 javascript 文件时。我正在尝试使用以下代码快速运行它,但我不能。当我搜索时,有一个名为“stringByEvaluatingJavaScriptFromString”的函数,但我不知道如何运行它。

index.html

        <meta charset="utf-8">
  <title>TIL - Today I Learned</title>
  <script src="https://cdn.apple-cloudkit.com/ck/1/cloudkit.js" async></script>
  <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script>
  <script type="text/javascript" src="TIL.js"></script>

javascript 文件:

window.addEventListener('cloudkitloaded', function() {
  console.log("listening for cloudkitloaded");
  CloudKit.configure({
    containers: [{
      // To use your own container, replace containerIdentifier and apiToken
      containerIdentifier: 'iCloud.com.emreonder.ogun-dalka-music',
      apiToken: '42ba168168dbf3a8c9562904ebf311864258f8dd3638a241d2372057ea0e8a55',
      environment: 'development'
    }]
  });
  console.log("cloudkitloaded");

    var self = this;
    console.log("get default container");
    var container = CloudKit.getDefaultContainer();

    console.log("set publicDB");
    var publicDB = container.publicCloudDatabase;
    self.items = ko.observableArray();

    // Fetch public records
  //  self.fetchRecords = function() {
      console.log("fetching records from " + publicDB);
      var query = { recordType: 'Musics'};

      // Execute the query.
      return publicDB.performQuery(query).then(function(response) {
        if(response.hasErrors) {
          console.error(response.errors[0]);
          return;
        }
        var records = response.records;
        var numberOfRecords = records.length;
        if (numberOfRecords === 0) {
          console.error('No matching items');
          return;
        }

        console.log(records.length + " records")
        console.log(records);
        self.items(records);
      });
  //  };
});

Swift 文件:

 let url = Bundle.main.url(forResource: "index", withExtension: "html")
    let myRequest = NSURLRequest(url: url!);
    webView.loadRequest(myRequest as URLRequest);
    print(webView.pageCount)
    let test_string = webView.stringByEvaluatingJavaScript(from: "function();")
    print(test_string)

编辑:我也放了 html 文件,但现在我不知道如何调用 javascript 函数。

【问题讨论】:

  • 评估 js 方法是 WK/UIWebview 的公共方法,您需要先将其加载到运行您的 js 的 webview 中
  • 它说“没有初始化程序”。我需要实现委托还是什么?

标签: javascript ios swift javascriptcore


【解决方案1】:

经过努力,好吧。我想解决我的问题。通过此解决方案,您可以获取 CloudKit 上的流 url(例如 assets)。

首先我创建了一个 webView(实际上,它只是在代码中,在 GUI 中没有任何内容)。

  let url = Bundle.main.url(forResource: "index", withExtension: "html")
    let myRequest = NSURLRequest(url: url!);
    webView.loadRequest(myRequest as URLRequest);
    webView.delegate = self

然后我通过 stringByEvaluatingJavaScript 函数在我的 js 文件中获取变量(我需要在 js 文件中的函数下方创建一个变量

 let a = webView.stringByEvaluatingJavaScript(from: "myVar")
    print(a!)
    let url : NSString = a! as NSString
    let urlStr : NSString = url.addingPercentEscapes(using: String.Encoding.utf8.rawValue)! as NSString
    let searchURL : NSURL = NSURL(string: urlStr as String)!
    print(searchURL)
    /*https://cvws.icloud-content.com/B/AVHgxc_-X3u9H5xK684KmUQrzDqp/$%7Bf%7D?o=Apgif1Giyg-lwRiNre2KJYl-5EhUAiL1m1OgE3-osxpxexWD7YGjCAOFCoQLRv8sGUglywu2tGr-OgfGtDZ15k0&v=1&x=3&a=BbLB0UptOX3bA-k6OQ&e=1487341935&k=_&fl=&r=0f83571c-d168-4743-b38b-0e808baa0a1a-1&ckc=iCloud.com.emreonder.ogun-dalka-music&ckz=_defaultZone&p=61&s=OuE127GKlo_0EIZ6y5t49gMv0qM 
     */
    let playerItem = AVPlayerItem(url: searchURL as URL)
    player = AVPlayer(playerItem: playerItem)
    let playerLayer:AVPlayerLayer = AVPlayerLayer(player: player)
    self.view.layer.addSublayer(playerLayer)
    self.player.play()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2017-09-28
    相关资源
    最近更新 更多