Расширение общего доступа iOS не может получить общий URL-адрес из Chrome

Я пытаюсь реализовать расширение общего доступа для своего приложения. Он хорошо работает в браузере Safari и приложении YouTube (т.е.), когда я делюсь этими приложениями, я получаю public.url, который является URL-адресом для совместного использования.

Когда я попробовал то же самое в Chrome, расширение не показывалось. Когда я добавил NSExtensionActivationSupportsText под NSExtensionActivationRule в значение true, он начал отображаться. Но когда я пытаюсь поделиться содержимым, я не могу получить строку URL, которой нужно поделиться. Я получаю только contentText.

Я следовал подходу, показанному в этой ссылке https://stackoverflow.com/a/31942744/6199038.

Я также добавил 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;

Я использую SLComposeServiceViewController.

В моем ShareViewController.m я пытаюсь получить данные, как показано ниже,

для сафари я использовал это, которое отлично работает

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-адрес из Chrome, который не работает.

 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;
        }
    }

}

ПОЖАЛУЙСТА, СОВЕТУЙТЕ


person Ravindra    schedule 26.05.2016    source источник


Ответы (1)


Я решил это сам. Поскольку он не входил в метод «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. Теперь я могу получить URL-адрес почти из всех новостных приложений, таких браузеров, как (Chrome, firefox, safari), а в некоторых приложениях я получаю общий URL-адрес в виде обычного текста, поэтому мне пришлось удалить пустые места и преобразовать его в NSString.

Насколько я понимаю, demoprocessor.js используется, если пользователь хочет получить доступ к свойствам URL-адреса страницы для ex (название, baseURL, og: изображение, og: описание и т. д.), который работает только для браузера Safari.

person Ravindra    schedule 01.06.2016
comment
Безопаснее использовать if ([URLinPlainText hasPrefix:@"http://"]){, поскольку текущий тест будет действителен для URL-адреса ftp://httpsomethingelse.com. - person ecnepsnai; 05.10.2016