2017-02-13 3 views
0

CloudKit에서 CkAsset의 웹 URL을 가져와야했습니다. 그러나 신속하게 Apple은 직접 WebURL을 가져올 수 없으며 자산을 다운로드하고 fileURL 만 제공합니다. 그러나, 자바 스크립트로 가능합니다. 따라서 CkAsset WebURL을 가져 오는 JS 파일을 작성했습니다. 브라우저에서이 자바 스크립트 파일을 실행할 때. 신속하게 코드 아래에서 실행하려고하지만 할 수 없습니다. 내가 검색 한 것처럼 "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> 

자바 스크립트 파일 :

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에게 평가 JS 파일에서 함수 아래에 변수를 만드는 데 필요한 , 당신은 먼저 webview에로드해야합니다 그들은 당신의 js를 실행합니다 – Injectios

+0

그것은 "이니셜 라이저가 없습니다"라고 말합니다. 델리게이트 또는 뭔가를 구현해야합니까? –

답변

0

힘든 시도 후 Okey. 나는 내 문제를 해결하려고 생각했다. 이 솔루션을 통해 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 파일에 변수를 가져 오기 (나는 방법은 WK /있는 UIWebView의 공개 방법이다

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()