2016-05-26 15 views
1

私のアプリケーションの共有拡張を実装しようとしています。 SafariブラウザとYouTubeアプリ(つまり、これらのアプリから共有しているとき)にうまくいけば、共有するURLであるpublic.urlが得られます。ios共有拡張はChromeから共有URLを取得できません

私はクロムで同じことを試みたとき、それは拡張子を表示していませんでした。私がNSExtensionActivationSupportsTextをNSExtensionActivationRuleの下に追加したところ、それは本当にその表示を開始しました。しかし、コンテンツを共有しようとすると、共有されるURL文字列を取得できません。私はcontentTextだけを取得します。

私はこのリンクに示されているアプローチに従っていますhttps://stackoverflow.com/a/31942744/6199038

は、私はまた、以下に示すように、サファリのための

、データを取得しようとしています私のShareViewController.miで

SLComposeServiceViewController私はを使用していますdemoProcessor.jsに

var MyPreprocessor = function() {}; 
MyPreprocessor.prototype = { 
run: function(arguments) { 
    arguments.completionFunction({"URL": document.URL, "pageSource": document.documentElement.outerHTML, "title": document.title, "selection": window.getSelection().toString()}); 
} 
}; 
var ExtensionPreprocessingJS = new MyPreprocessor; 

を追加しました私はこれをうまく使っています。

NSExtensionItem *item = self.extensionContext.inputItems.firstObject; 
NSItemProvider *itemProvider = [[item.userInfo valueForKey:NSExtensionItemAttachmentsKey] objectAtIndex:0]; 
if ([itemProvider hasItemConformingToTypeIdentifier:@"public.url"]) { 
    [itemProvider loadItemForTypeIdentifier:@"public.url" options:nil completionHandler:^(NSURL *url, NSError *error) { 
     urlString = url.absoluteString; 
     NSLog(@"urlString %@",urlString); 
    }]; 
} 

次に、クロムからURLを取得するために自分のコードを変更しましたが、これは動作しません。

for (NSExtensionItem *item in self.extensionContext.inputItems) { 
    for (NSItemProvider *itemProvider in item.attachments) { 
     if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypePropertyList]) { 
      [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypePropertyList options:nil completionHandler:^(NSDictionary *jsDict, NSError *error) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        NSDictionary *jsPreprocessingResults = jsDict[NSExtensionJavaScriptPreprocessingResultsKey]; 

        NSString *selectedText = jsPreprocessingResults[@"selection"]; 
        NSString *pageTitle = jsPreprocessingResults[@"title"]; 
        NSString *URL = jsPreprocessingResults[@"URL"]; 

        NSLog(@"selectedText %@",selectedText); 
        NSLog(@"pageTitle %@",pageTitle); 
        NSLog(@"URL %@",URL); 
       }); 
      }]; 

      break; 
     } 
    } 

} 

私はそれを自分で解決した

答えて

2

アドバイスをしてください。それは "loadItemForTypeIdentifier"メソッドの内部に入っていないためです。だから私は、以下のコード

for (NSExtensionItem *item in self.extensionContext.inputItems) { 
     for (NSItemProvider *itemProvider in item.attachments) { 

      NSString *URLinPlainText = [item.attributedContentText string]; 
      if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeURL]) { 
       [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeURL options:nil completionHandler:^(NSURL *url, NSError *error) { 

        urlString = url.absoluteString; 
        NSLog(@"<<URL>> %@",urlString); 
        return; 
       }]; 
      } 
      else if (URLinPlainText) { 
       // In Some app i got the URL in a Plain text mode 
       if([URLinPlainText containsString:@"http"]){ 
        urlString = [sharedPlainText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
        NSLog(@"<<URL>> %@",urlString); 
        return; 
       } 
      } 
     } 
    } 

に私の方法を変更していたし、また、私はdemoProcessor.jsを削除しました。 私はほとんどすべてのニュースアプリ、ブラウザ(Chrome、Firefox、Safari)のようなURLを取得することができます。アプリの一部では共有URLを平文の形式で取得しています空のスペースとそれをNSStringに変換します。

私が理解しているように、ユーザーがex(title、baseURL、og:image、og:descriptionなど)のurlページプロパティにアクセスしたい場合、demoprocessor.jsが使用されます。

+0

あなたの現在のテストがURL「ftp:// httpsomethingelse.com」に対して有効であるため、 'if([URLinPlainText hasPrefix:@" http:// "]){' –

関連する問題