ImgurAnonymousAPI 1.0

ImgurAnonymousAPI 1.0

Nolan Waite 维护。



  • Nolan Waite

ImgurAnonymousAPI

使用 Imgur API 的第 3 版匿名上传图像(即不与账户关联)。

此项目专注于从应用程序中获取图像并将其上传到 Imgur。它不提供完整的 Imgur API 客户端功能。由于范围非常狭窄,我们可以将提供的功能做得尽可能舒适

  • 我们接受您可能已经在使用的图像类型。
  • 我们使从图像选择器直接上传图像变得简单。
  • 我们愉快地调整那个巨大的图像,直到它低于 Imgur 文件大小限制。
  • 我们调整那个巨大的图像而不会让您因为消耗设备全部内存而被终止。
  • 我们仅依赖于 Foundation 和 ImageIO(并且可选地依赖 Photos 和/或 UIKit,如果可用)。

开始使用

您需要将应用程序注册到 Imgur 并遵守其条款。请阅读《Imgur API 文档》的《简介》部分。请阅读 Imgur API 文档的简介部分。截至写作时,Imgur API 可免费用于非商业用途。此项目不支持商业用途(尽管接受贡献!)。一旦您注册了您的应用程序,记录 Imgur 给您的客户端 ID。您将需要它来使用此库!

下一步是获取此库的副本。我们支持 Carthage,CocoaPods,Swift Package Manager,以及直接将副本放入您的项目中。

检查包含的测试应用程序以查看此库是否可以与您的图像一起使用。要运行此应用程序,请打开 ImgurAnonymousAPI.xcodeproj 并运行 "iOSTestApp" 计划。 (如果您遇到代码签名问题,请务必在“通用”选项卡下的“签名”部分设置“iOSTestApp”目标的开发团队。)

这是一个基于图像选择器的示例,假设您已经将图像选择器显示出来

import ImgurAnonymousAPI

class ViewController: UIImagePickerControllerDelegate {

    private let imgur = ImgurUploader(clientID: "my-client-id")
    
    // Somehow an image picker appears…

    func imagePickerController(_ picker: UIImagePickerController,
                               didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {
                               
        dismiss(animated: true)

        imgur.upload(info, completion: { result in
            switch result {
            case .success(let response):
                print("Image can be seen at \(response.link)")

            case .failure(let error):
                print("Upload failed: \(error)")
            }
        })
    }
}

注意事项和警告

  • Imgur API 有各种速率限制。这个库允许您跟踪这些速率限制,您可能至少需要关注“客户端”限制,因为过于频繁地超过这些限制可能会导致您的 API 密钥在本月被禁止使用。
  • 动画图像不完全受支持。我们将尝试上传它们,但不会将它们调整大小以符合最大文件大小限制。
  • 要使用图像选择器上传动画图像,必须在显示图像选择器之前向您的用户请求相册库权限。(此库不会为您提示用户。)
  • 此库永远不会在没有用户已授权其使用的情况下尝试使用相册库。此库永远不会触发相册库授权提示,并且此库永远不会因为缺少键为 NSPhotoLibraryUsageDescriptionInfo.plist 值而崩溃(请记住,截至 iOS 11,您可以在无需授权的情况下让用户选择照片)。
  • 继续匿名图像上传的主题,我们使用我们自己的 URL 会话,并使用临时的配置。

开发

打开 Xcode 项目,深入探索!

WriteMultipartFormData 中有一些可能有趣的 DispatchIO 代码,用于使用内存和磁盘数据组合写入 multipart/form-data 请求,而无需一次性加载所有内容。(将整个请求写入文件似乎比使用流更好,因为除非您自己编写,否则重新启动流可能会很棘手,自己编写 InputStream 实现似乎也不是一个好主意。)