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

App Extension iOS9: How can I send a string / URL from the share view to my the app?

不幸的是,目前在 iOS 9 上缺少有关 App Extension / Share Sheets 的示例代码或正确信息。(即使是 Apples Dev Support 在这方面也非常令人失望。就在今天我得到了答案 "We don’t have an action extension sample either unfortunately"。他们不会发送给我。

无论如何,也许有人愿意分享他对这个话题的了解。 因此,在 xcode 中添加共享扩展是比较容易的部分,但我在

中遇到了困难
  1. 发送和接收字符串:我希望共享 Sheet 在 Safari 中以当前 URL 打开(甚至可能像 WWDC 2015 视频中那样使用字符计数器 "App Extension Best Practices") 并通过点击 "Post" 将其发送到应用程序。真的有必要开一个NSURLSession吗?

  2. 无法在/General/"App Icons and Launch Images"/App Icons Source 下添加Share-icon。一些来源建议使用 Asset Catalog - 但在我这样做之前,是否没有其他方法可以简单地添加一个图像?

我发现的其他来源包括:

今日延期: 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 上的共享 Sheet 添加标题:

- (void)loadView
{
    [super loadView];
    self.title = @"Title of the Share Sheet";
}

I want the Share Sheet to open in Safari with the current URL (maybe even with the Character Counter like in the WWDC 2015 Video "App Extension Best Practices")

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

and send it to the app by tapping "Post"

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

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

adding an Share-icon under / General / "App Icons and Launch Images" / App Icons Source is not possible. Some Sources suggest to use Asset Catalog - but before I do, is there no other way to simply add ONE image?

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

要提取 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")
    }