应用程序扩展 iOS9:如何将字符串 / URL 从共享视图发送到我的应用程序?

Posted

技术标签:

【中文标题】应用程序扩展 iOS9:如何将字符串 / URL 从共享视图发送到我的应用程序?【英文标题】:App Extension iOS9: How can I send a string / URL from the share view to my the app? 【发布时间】:2015-10-02 11:47:18 【问题描述】:

不幸的是,目前缺少有关 ios 9 上的 App Extension / Share Sheets 的示例代码或正确信息。(即使是 Apples Dev Support 在这方面也非常令人失望。就在今天,我得到了答案“我们没有不幸的是,操作扩展示例“。他们不会寄给我的。

不管怎样,也许有人愿意分享他在这个话题上的知识。 所以,在 xcode 中添加一个共享扩展是很容易的部分,但我很难

    发送和接收字符串:我希望使用当前 URL 在 Safari 中打开共享表(甚至可能使用 WWDC 2015 视频“应用程序扩展最佳实践”中的字符计数器)并将其发送到应用程序通过点击“发布”。真的有必要打开一个 NSURLSession 吗?

    无法在/General/“App Icons and Launch Images”/App Icons Source 下添加共享图标。一些来源建议使用资产目录 - 但在我这样做之前,是否没有其他方法可以简单地添加一张图片?

我发现的其他来源包括:

今日扩展: raywenderlich.com/83809/ios-8-today-extension-tutorial

如何构建一个简单的操作扩展: http://code.tutsplus.com/tutorials/ios-8-how-to-build-a-simple-action-extension--cms-22794

iOS 8 上带有数据共享的基本共享扩展: http://www.andypierz.com/blog/2014/9/19/basic-share-extensions-with-data-sharing-on-ios-8

到目前为止,我能够完成的是在 shareViewController.m 上的 Share Sheet 中添加标题:

- (void)loadView

    [super loadView];
    self.title = @"Title of the Share Sheet";

【问题讨论】:

没有 ShareViewController 这样的东西,你到底在说什么?你是在问写一个分享扩展吗? 是的,我想在我的应用程序中添加一个共享扩展。当我选择“文件 > 新建 > 目标 > iOS 应用程序扩展 > 共享扩展”时,我得到 4 个文件:一个 shareViewController.h/.m、一个 Storyboard 和一个 Info.plist。我对您的回复“没有 ShareViewController 这样的东西”感到有些困惑? 嗯,它只是一个普通的 SLComposeServiceViewController 子类。这才是最重要的。 “ShareViewController”只是他们在模板中提供的任意名称;你还没有结婚。 所以,现在我们已经确定您要编写共享扩展,并且您正在询问有关 SLComposeServiceViewController 的问题。那么现在,你的问题是什么?恐怕我看不到它,隐藏在你周围的所有徘徊中...... 我想通过 SLComposeServiceViewController 向我的应用程序发送一个 URL。首先我需要一个应用组,对吗?我已经为我的共享目标和我的应用程序(在功能下)做到了这一点。我的理解是字符串存储在共享的 NSUserDefaults 中? 【参考方案1】:

我希望使用当前 URL 在 Safari 中打开共享表(甚至可能使用 WWDC 2015 视频“应用程序扩展最佳实践”中的字符计数器)

用户在哪个应用中使用您的共享扩展程序并不取决于您,也不取决于您应用程序向共享扩展程序提供哪些数据。该应用程序将共享该应用程序想要共享的内容。 所能做的就是定义你愿意接受什么样的数据。

点击“发布”将其发送到应用程序

当用户点击“发布”时,会调用您的 didSelectPost 覆盖。你做什么取决于你。这里的“应用程序”是什么意思?你的意思是,你的应用程序提供共享扩展?然后设计一个自定义 URL 方案,用于从扩展程序到应用程序的通信,或使用文档中描述的其他数据共享方法之一:

https://developer.apple.com/library/ios/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html

无法在/General/“App Icons and Launch Images”/App Icons Source 下添加共享图标。一些来源建议使用资产目录 - 但在我这样做之前,是否没有其他方法可以简单地添加一张图片?

共享扩展的图标自动成为提供共享扩展的应用程序的图标。

【讨论】:

好吧 - 至于应用程序图标:safari 中的共享表显示我的应用程序(提供共享扩展的应用程序),但是一个空白图标,而不是我的图标的单色版本(我想要设置并知道在哪里放置资源?任何命名约定?)“然后设计一个自定义 URL 方案,用于从扩展程序到应用程序的通信,或使用文档中描述的其他数据共享方法之一”这正是我正在努力解决的问题。 你看我说的了吗?共享扩展的图标是not“我的图标的单色版本”。它是您的应用程序的图标。您无法替换其他图标。 “这正是我正在努力解决的问题”听起来不错,但“我正在努力”不是问题。我已经向您指出了这方面的资源。如果您有特定的新问题,请提出新问题!我想我已经回答了你提出的问题(在某种程度上我什至可以弄清楚它是什么)。 似乎共享表中的共享应用程序图标是彩色的,因为我的应用程序出现在第一行彩色图标中(带有占位符图标)。原因,为什么我没有看到任何图标艺术品,但应用程序本身就在其他地方。 我愿意接受这部分作为答案,但我的帖子的标题仍未得到答复。我知道didSelectPost被触发了,我也有一个模糊的想法didSelectCancel发生了什么,问题是HOW(代码) 问题是如何what?如何从扩展程序与应用程序通信?好吧,我已经告诉过你可以做的一件事,并且我已经发布了示例代码来展示如何做到这一点(使用自定义 URL 方案);我已经引导您使用两种 Apple 文档,包括书面文档和视频文档。我不会亲自到你家为你写代码。【参考方案2】:

要提取 URL,您必须先启用 ExtensionPreprocessingJS 部分

以下内容由AppCode iOS8 action extension tutorial稍作修改

将新文件 GetURL.js 添加到您的共享扩展文件夹

var GetURL = function() ;

GetURL.prototype = 

   run: function(arguments) 
       arguments.completionFunction( "currentUrl" : document.URL );
       
;

var ExtensionPreprocessingJS = new GetURL;

接下来,您必须编辑 Info.plist 以便宿主应用程序调用 JS。有关如何执行此操作,请参阅 AppCode 教程。

然后在您的 ShareViewController viewDidLoad 中包含以下函数

    //swift code
    let extensionItem = extensionContext?.inputItems.first as! NSExtensionItem
    let itemProvider = extensionItem.attachments?.first as! NSItemProvider

    let propertyList = String(kUTTypePropertyList)
    if itemProvider.hasItemConformingToTypeIdentifier(propertyList) 
        itemProvider.loadItemForTypeIdentifier(propertyList, options: nil, completionHandler:  (item, error) -> Void in
            let dictionary = item as! NSDictionary
            NSOperationQueue.mainQueue().addOperationWithBlock 
                let results = dictionary[NSExtensionjavascriptPreprocessingResultsKey] as! NSDictionary
                let url = NSURL(string: (results["currentURL"] as! String))                                        
                //now you can do what you like with this url
            
        )
     else 
        print("error")
    

【讨论】:

必须为 kUTTypePropertyList 导入 MobileCoreServices

以上是关于应用程序扩展 iOS9:如何将字符串 / URL 从共享视图发送到我的应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配可以以查询字符串结尾的 url 中的文件扩展名?

AVPlayer 不会在 iOS9 中播放来自 url 的视频

iOS9适配 之 关于info.plist 第三方登录 添加URL Schemes白名单

iOS9适配 之 关于info.plist 第三方登录 添加URL Schemes白名单

IOS 应用跳转 (IOS9白名单)

iOS9 URL Schme 白名单