ios swift 分享图片的应用扩展
ios swift app extension to share image
我正在尝试遵循 Vandad Nahavandipoor 的书 iOS 8 Swift 编程指南 O'REILLY 2014 年 11 月第一版中的 2.2。
我理解并已经纠正了文本中的一些错误,但是这个让我难住了。
我正在尝试为我的应用程序创建共享扩展,以便人们可以将图片上传到我的网站。
扩展的工作原理是它出现在最后,当您单击它时,它会为您提供放置标题和显示图像的位置,但是,POST 未激活但已禁用。我是 iOS 的新手,所以我不太确定该怎么做。
在他继续添加我跳过的观众选择器的部分中,我感觉可能是其中的一部分,但我没有那个选项,所以我没有把它放进去。
这是我的分享扩展的代码
import UIKit
import Social
import MobileCoreServices
class ShareViewController: SLComposeServiceViewController, NSURLSessionDelegate {
var imageData: NSData?
override func isContentValid() -> Bool {
if let data = imageData {
if countElements(contentText) > 0 {
return true
}
}
return false
}
override func presentationAnimationDidFinish() {
super.presentationAnimationDidFinish()
placeholder = "Title"
let content = extensionContext!.inputItems[0] as NSExtensionItem
let contentType = kUTTypeImage as NSString
for attachment in content.attachments as [NSItemProvider]{
if attachment.hasItemConformingToTypeIdentifier(contentType){
let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(dispatchQueue, {[weak self] in
let strongSelf = self!
attachment.loadItemForTypeIdentifier(contentType, options: nil, completionHandler: {(content: NSSecureCoding!, error: NSError!) in
if let data = content as? NSData {
dispatch_async(dispatch_get_main_queue(), {
strongSelf.imageData = data
strongSelf.validateContent()
})
}
})
})
}
break
}
}
override func didSelectPost() {
//TODO if no FBSession - then don't do it
let token = FBSession.activeSession().accessTokenData.accessToken
let identifier = NSBundle.mainBundle().bundleIdentifier! + "." + NSUUID().UUIDString
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(identifier)
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
let url = NSURL(string: "http://...&text="+self.contentText)
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"
request.HTTPBody = imageData!
let task = session.uploadTaskWithRequest(request, fromData: request.HTTPBody)
task.resume()
extensionContext!.completeRequestReturningItems([], completionHandler: nil)
}
// override func configurationItems() -> [AnyObject]! {
// To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
// return NSArray()
//}
}
我只想在共享弹出窗口中启用 POST 操作。提前致谢
EDIT
继续,我发现问题是所选图像的 imageData 为零。内容包含值
file:///var/mobile/Media/DCIM/100APPLE/IMG_0001.JPG
在第
行
if let data = content as? NSData{ ...}
失败。我如何以 NSData 形式读取此图像?
您需要使用 NSData.dataWithContentsOfFile(content)
。
解决方案是
image = UIImage(data: NSData(contentsOfURL: content as NSURL)!)
感谢
Unable to cast UIImage in swift iOS 8 Extension
我正在尝试遵循 Vandad Nahavandipoor 的书 iOS 8 Swift 编程指南 O'REILLY 2014 年 11 月第一版中的 2.2。
我理解并已经纠正了文本中的一些错误,但是这个让我难住了。
我正在尝试为我的应用程序创建共享扩展,以便人们可以将图片上传到我的网站。
扩展的工作原理是它出现在最后,当您单击它时,它会为您提供放置标题和显示图像的位置,但是,POST 未激活但已禁用。我是 iOS 的新手,所以我不太确定该怎么做。
在他继续添加我跳过的观众选择器的部分中,我感觉可能是其中的一部分,但我没有那个选项,所以我没有把它放进去。
这是我的分享扩展的代码
import UIKit
import Social
import MobileCoreServices
class ShareViewController: SLComposeServiceViewController, NSURLSessionDelegate {
var imageData: NSData?
override func isContentValid() -> Bool {
if let data = imageData {
if countElements(contentText) > 0 {
return true
}
}
return false
}
override func presentationAnimationDidFinish() {
super.presentationAnimationDidFinish()
placeholder = "Title"
let content = extensionContext!.inputItems[0] as NSExtensionItem
let contentType = kUTTypeImage as NSString
for attachment in content.attachments as [NSItemProvider]{
if attachment.hasItemConformingToTypeIdentifier(contentType){
let dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(dispatchQueue, {[weak self] in
let strongSelf = self!
attachment.loadItemForTypeIdentifier(contentType, options: nil, completionHandler: {(content: NSSecureCoding!, error: NSError!) in
if let data = content as? NSData {
dispatch_async(dispatch_get_main_queue(), {
strongSelf.imageData = data
strongSelf.validateContent()
})
}
})
})
}
break
}
}
override func didSelectPost() {
//TODO if no FBSession - then don't do it
let token = FBSession.activeSession().accessTokenData.accessToken
let identifier = NSBundle.mainBundle().bundleIdentifier! + "." + NSUUID().UUIDString
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(identifier)
let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)
let url = NSURL(string: "http://...&text="+self.contentText)
let request = NSMutableURLRequest(URL: url!)
request.HTTPMethod = "POST"
request.HTTPBody = imageData!
let task = session.uploadTaskWithRequest(request, fromData: request.HTTPBody)
task.resume()
extensionContext!.completeRequestReturningItems([], completionHandler: nil)
}
// override func configurationItems() -> [AnyObject]! {
// To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
// return NSArray()
//}
}
我只想在共享弹出窗口中启用 POST 操作。提前致谢
EDIT
继续,我发现问题是所选图像的 imageData 为零。内容包含值
file:///var/mobile/Media/DCIM/100APPLE/IMG_0001.JPG
在第
行if let data = content as? NSData{ ...}
失败。我如何以 NSData 形式读取此图像?
您需要使用 NSData.dataWithContentsOfFile(content)
。
解决方案是
image = UIImage(data: NSData(contentsOfURL: content as NSURL)!)
感谢
Unable to cast UIImage in swift iOS 8 Extension