iosshare extension에서javascript 파일을 실행하여 웹 사이트의 임의의 정보를 얻습니다

입문


ios의share extension 기능은 사용자가 공유할 때javascript 파일을 실행하여 기본적으로 얻을 수 없는 각종 정보를 얻고 응용 프로그램에 저장할 수 있도록 합니다.
apple 공식 문서에도 그 방법이 적혀 있지만 Objective-C 코드만 적혀 있고 인터넷에는 오래된 정보도 많아서 최신 환경(Swift5·xcode11)에서 일하는 코드를 적고 있습니다.
※ share extension의 기본 기능이 설치되어 있다고 가정합니다.

프로젝트에 js 파일 추가


이번에는 GetData입니다.js라는 파일을 사용합니다.

info.평면 편집


info.plist의 NSExtensionActivationRule와 같은 차원에서 NSExtensionjavaScriptPreprocessing File과 JS 파일 이름을 추가합니다.

js 파일 편집


먼저 페이지의 URL과 제목을 가져옵니다.또한finalize라는 함수가 없어도 작동할 수 있습니다.
GetData.js
var MyPreprocessor = function() {};

MyPreprocessor.prototype = {
    run: function(arguments) {
        arguments.completionFunction({"url": document.URL, "title": document.title});
    },

    finalize: function(arguments) {
    }
};

var ExtensionPreprocessingJS = new MyPreprocessor;

ShareViewController.swift 편집


ShareViewController.swift
override func isContentValid() -> Bool {
    return true
}

override func didSelectPost() {
  for item: Any in self.extensionContext!.inputItems {
    let inputItem = item as! NSExtensionItem

    for itemProvider : NSItemProvider in inputItem.attachments! {
        if itemProvider.hasItemConformingToTypeIdentifier("public.data") {
          itemProvider.loadItem(forTypeIdentifier: "public.data", options: nil, completionHandler: {
                  (item, error) in

            if let dictionary = item as? NSDictionary {
              DispatchQueue.main.async(execute: { () -> Void in
                let results = dictionary[NSExtensionJavaScriptPreprocessingResultsKey] as! NSDictionary

                print(results["url"])//取得したURL
                print(results["title"])//取得したページのタイトル

                //このデータをUserDefaultsやCoreDataでアプリと共有する
              })
             }
          })
        }
     }
  }
  self.extensionContext?.completeRequest(returningItems: nil, completionHandler: nil)
}

override func configurationItems() -> [Any]! {
    return []
}

기타 각종 데이터의 취득 예


GetData.js
var MyPreprocessor = function() {};

MyPreprocessor.prototype = {
    run: function(arguments) {
        //現在のスクロール位置を取得  
        var positionTop = String(Math.max(window.pageYOffset, document.documentElement.scrollTop, document.body.scrollTop));

        //動画の現時点での再生時間を取得
        var htmlVideoPlayer = document.getElementsByTagName('video')[0];
        var currentTimeAtThisVideo = String(parseInt(htmlVideoPlayer.currentTime));

        arguments.completionFunction({"positionTop": positionTop, "currentTimeAtThisVideo": currentTimeAtThisVideo});
    },

    finalize: function(arguments) {
    }
};

var ExtensionPreprocessingJS = new MyPreprocessor;

끝내다


상기 방법을 이용하여 Shiori(인터넷 책갈피에 끼워진 응용 프로그램)라는 응용 프로그램을 개발하였다.이것은 읽고 있는 기사와 보고 있는 동영상을 그대로 기록해 언제든지 다시 시작할 수 있는 응용 프로그램이다.꼭 사용하세요.

참고 자료


  • 응용 프로그램 문서
  • https://stackoverflow.com/questions/33205158/access-webpage-properties-in-share-extension )
  • http://swift-salaryman.com/appextensions5.php
  • 좋은 웹페이지 즐겨찾기