2017-05-27 31 views
12

私は、次のユーザーの流れを達成しようとしているiOSのシェア拡張子:Safariでコンテキストメニューを経由して共有するときに、ページのURLを取得

欲しい:

  1. ユーザーがWebページを閲覧しているがiOS Safari。
  2. ユーザーがコンテンツ(テキストと画像)を選択し、コンテキストメニューが表示されるまで待ちます。
  3. ユーザーは[共有...]項目を選択します。
  4. ユーザーは、共有メニューの下にある自分のApp Extensionを選択します。
  5. 選択したコンテンツとWebページのURLは、HTTコール経由でリモートサーバーに共有されます。
  6. 私はXcodeのを経由して共有拡張を作っ

    を試してみました何

。ここに私のinfo.plistNSExtensionセクションがあります:

<key>NSExtension</key> 
<dict> 
    <key>NSExtensionAttributes</key> 
    <dict> 
     <key>NSExtensionActivationRule</key> 
     <dict> 
      <key>NSExtensionActivationSupportsWebPageWithMaxCount</key> 
      <integer>1</integer> 
      <key>NSExtensionActivationSupportsText</key> 
      <true/> 
      <key>NSExtensionActivationSupportsWebURLWithMaxCount</key> 
      <integer>1</integer> 
     </dict> 
     <key>NSExtensionJavaScriptPreprocessingFile</key> 
     <string>test</string> 
    </dict> 
    <key>NSExtensionMainStoryboard</key> 
    <string>MainInterface</string> 
    <key>NSExtensionPointIdentifier</key> 
    <string>com.apple.share-services</string> 
</dict> 

ここtest.jsファイルです:

var GetURL = function() {}; 
GetURL.prototype = { 
run: function(arguments) { 
    arguments.completionFunction({"URL": document.URL}); 
} 
}; 
var ExtensionPreprocessingJS = new GetURL; 

は、私は次のような結果が予想される:私は次のようになり、それを通して、いくつかの入力項目、と私を提供するextensionContext?.inputItemsviewDidLoad方法で選択したコンテンツとウェブURLを取得することができます。選択したコンテンツのプレインテキスト表現(私は同時に、画像やテキストを選択した場合でも) - 一つのアイテムだけで私を提供extensionContext?.inputItemsviewDidLoad方法で

うまくいかない何

。プレーンテキストで暮らすことができますが、ウェブページのURLが必要です。

私の質問

どのようにiOSのSafariでコンテキストメニューから選択したコンテンツを共有する共有の拡張機能を使用しているとき、私は開かれたWebページのURLを取得できますか?

答えて

1

から輸入kUTTypeURL文字列に置き換えることができます午後にこれについての文書を読んで、拡張機能の異なる順列を試してみようと思っていました。 gする。

私はこの正確なフローはiOSのに達成することはできないと結論づけました。ユーザーがテキストを選択してコンテキストメニュー(「コピー」、「ルックアップ」、「共有」など)を使用すると、エクステンションで受け取る唯一のものはNSItemProviderです。プリプロセッサのjavascriptの結果をplistします。そのメニューから[共有]を選択すると、NSExtensionActivationSupportsTextYESに設定されている場合に限り、内線番号のInfo.plistファイルが表示されます。

前処理のJavaScriptを実行するには、docsごとに、NSExtensionActivationSupportsWebPageWithMaxCountに0より大きい値を設定する必要があります。拡張機能が選択されたテキストコンテキストメニューから呼び出されると、そのjavascriptファイルは決して実行されません。

しかし、それは所望の流れにかなり近い取得することが可能です。ユーザーがSafariにいてテキストを選択した後、コンテキストメニューの[共有]をタップする代わりに、Safari UIの一番下にあるShareアイコンをタップするとNSItemProviderがplistとして返され、NSExtensionJavaScriptPreprocessingFile gets走る私のjavascriptのファイルには、次のようになります。

var Share = function() {}; 

Share.prototype = { 
    run: function(arguments) { 
    arguments.completionFunction({"URL": document.URL, "selectedText": document.getSelection().toString()}); 
    }, 
    finalize: function(arguments) { 
    // alert shared! 
    } 
}; 

var ExtensionPreprocessingJS = new Share 

plistのオブジェクトが拡張ページのURLとselectedTextの両方を持っているに戻ったことを意味しています。

拡張子の唯一の目的は、共有のURLで、URLのないプレーンテキストは無意味なユースケースではない場合、あなたはおそらくYESNSExtensionActivationSupportsTextセットを持つべきではありません。例えば、ポケットのようなアプリは、それが有効になっているが、ユーザーはSafariでテキストを選択し、コンテキストメニューから共有しようとすると、ポケットはちょうど平文なしページURLと有意義な何もできないので、それだけでポップかなり謎めいたエラーメッセージを出します。

あなたが見たい場合は私もpublished the code for my extensionです。

2

スウィフト3

の線に沿って何かしてみてください。

override func didSelectPost() { 
    if let item = extensionContext?.inputItems.first as? NSExtensionItem, 
     let itemProvider = item.attachments?.first as? NSItemProvider, 
     itemProvider.hasItemConformingToTypeIdentifier("public.url") { 
     itemProvider.loadItem(forTypeIdentifier: "public.url", options: nil) { (url, error) in 
      if let shareURL = url as? URL { 
       // do what you want to do with shareURL 
      } 
      self.extensionContext?.completeRequest(returningItems: [], completionHandler:nil) 
     } 
    } 
} 

"public.url"は私があきれるほどの大部分を費やしてきたMobileCoreServices

+0

Swfit3の構文を適用した後、私のために働いています:itemProvider.loadItem(forTypeIdentifier: "public.url"、options:nil、completionHandler:{(url、error) - > Void in –

+0

@先端のためのYunCHENのおかげであなたは歓迎されているSWIFT 3 –

+0

に更新答え、;。) –

関連する問題