2017-02-13 16 views
0

我需要獲取CloudKit中CkAsset的Web網址。但是,迅速,Apple不允許我們取得直接的WebURL,它只下載資產並給我們fileURL。但是,使用JavaScript是可能的。因此,我寫了一個JS文件,用於獲取CkAsset WebURL。當我在瀏覽器中運行這個JavaScript文件。我試圖用下面的代碼快速運行它,但我不能。當我搜索有一個名爲「stringByEvaluatingJavaScriptFromString」的函數,但我無法弄清楚如何運行它。運行JS代碼以快速獲取數據

的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); 
     }); 
    // }; 
}); 

斯威夫特文件:

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函數。

+0

評估js的方法是WK/UIWebView中的公共方法,你需要先加載到webview他們運行你的js – Injectios

+0

它說「沒有初始化器」。我需要實現委託或什麼? –

回答

0

努力嘗試後的安全。我想解決我的問題。通過這個解決方案,你可以獲取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()