当前位置: 首页 > 知识库问答 >
问题:

运行JS代码在swift中获取数据

漆雕原
2023-03-14

我需要在CloudKit中获取CkAsset的web url。然而,在swift中,苹果不允许我们获取直接的WebURL,它只下载资产并给我们文件。但是,有了javascript,这是可能的。因此,我编写了一个JS文件来获取CkAsset Weburl。当我在浏览器中运行这个javascript文件时。我试图用下面的代码在swift中运行它,但我不能。我搜索到一个名为“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>
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函数。

共有1个答案

朱硕
2023-03-14

经过艰苦努力后还好。我想解决我的问题。通过这个解决方案,u可以获取CloudKit上的流url(例如资产)。

首先,我创建了一个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()
 类似资料:
  • 问题内容: 我想在Swift中获取UIColor的RGB值: 在Java中,我将按以下方式进行操作: 我应该如何获得这个价值? 问题答案: Java 返回一个表示默认sRGB颜色空间中颜色的整数(位24-31是alpha,16-23是红色,8-15是绿色,0-7是蓝色)。 没有这种方法,但是您可以定义自己的方法: 用法: 请注意,只有在“兼容RGB”的色彩空间(例如RGB,HSB或GrayScal

  • 我有一个代码如下: 当我尝试运行代码时,我得到这样的消息: 我提到了这个链接,但不明白如何修改上面的代码,使其可行:例外:需要mockito,但没有调用,实际上与这个mock没有任何交互 有人能帮忙吗。 通过添加c.getResult(新的A(新的B()),新的F())解决了上述错误;在上面 我错过了什么?我一直在使用的课程:

  • 本节将介绍如何获取本书的代码和安装运行代码所依赖的软件。虽然跳过本节不会影响后面的阅读,但我们还是强烈建议读者按照下面的步骤来动手操作一遍。本书大部分章节的练习都涉及改动代码并观察运行结果。因此,本节是完成这些练习的基础。 获取代码并安装运行环境 本书的内容和代码均可在网上免费获取。我们推荐使用conda来安装运行代码所依赖的软件。conda是一个流行的Python包管理软件。Windows和Li

  • 我正在LiquiBase中运行Java代码变更集。但是我遇到了这个问题,我得到了ClassNotFoundException,我四处搜索了一下,但是没有找到任何有用的东西。在这个环节上的一些研究是有用的。我使用的是Liquibase-Core-2.0.1。

  • 问题内容: 我有下一个html: 是否可以获取以开头的属性,并在下面的 JavaScript 代码中使用它?现在我得到了结果。 问题答案: 您需要访问属性: 结果:

  • 本文向大家介绍JS非行间样式获取函数的实例代码,包括了JS非行间样式获取函数的实例代码的使用技巧和注意事项,需要的朋友参考一下 行间样式:元素内部用style定义的样式,如:<div style="width:200px;"></div> 非行间样式:在<style></style>内通过css定义的样式 先看一段出问题的代码 我在页面放了一个方块,红底黑边,想通过点击该方块让他的宽度变为200p