应用程序扩展 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 中添加共享扩展是比较容易的部分,但我在
中遇到了困难
发送和接收字符串:我希望共享 Sheet 在 Safari 中以当前 URL 打开(甚至可能像 WWDC 2015 视频中那样使用字符计数器 "App Extension Best Practices") 并通过点击 "Post" 将其发送到应用程序。真的有必要开一个NSURLSession吗?
无法在/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 方案用于从扩展程序到应用程序的通信,或者使用文档中描述的其他数据共享方法之一:
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")
}
不幸的是,目前在 iOS 9 上缺少有关 App Extension / Share Sheets 的示例代码或正确信息。(即使是 Apples Dev Support 在这方面也非常令人失望。就在今天我得到了答案 "We don’t have an action extension sample either unfortunately"。他们不会发送给我。
无论如何,也许有人愿意分享他对这个话题的了解。 因此,在 xcode 中添加共享扩展是比较容易的部分,但我在
中遇到了困难发送和接收字符串:我希望共享 Sheet 在 Safari 中以当前 URL 打开(甚至可能像 WWDC 2015 视频中那样使用字符计数器 "App Extension Best Practices") 并通过点击 "Post" 将其发送到应用程序。真的有必要开一个NSURLSession吗?
无法在/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 方案用于从扩展程序到应用程序的通信,或者使用文档中描述的其他数据共享方法之一:
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")
}