pCloud Swift SDK

用于 iOS 和 macOS 的官方 pCloud Swift SDK,用于与 pCloud API 集成。您可以在此处找到完整文档。


目录


迁移到 v3

有关如何迁移到 SDK v3 的说明,请参阅源存储库中 v3.0.0 的发行说明。


系统要求


开始使用

注册您的应用程序

为了使用此 SDK,您必须在 pCloud 应用程序控制台中注册您的应用程序。创建应用程序后,请记下应用程序主页中的应用程序密钥。

设置您的应用程序

SDK 使用 OAuth 2.0 访问令牌来授权对 pCloud API 的请求。您可以使用 SDK 的授权流程获取令牌。为了允许 SDK 执行此操作,请在您的应用程序配置页面中找到“重定向 URI”部分,并添加一个具有以下格式的 URI:pclsdk-w-YOUR_APP_KEY://oauth2redirect,其中 YOUR_APP_KEY 是来自您的应用程序控制台的应用程序密钥。


安装 SDK

您可以使用以下任何一种方法将 SDK 集成到您的项目中

CocoaPods

CocoaPods 是 Swift 和 Objective-C Cocoa 项目的依赖项管理器。如果您尚未使用 CocoaPods,您可以查看此处了解如何开始使用它。

首先,您应该安装 CocoaPods

$ gem install cocoapods

然后导航到您的项目根目录并运行 pod init。这将创建一个名为 Podfile 的文件。打开它并将 pod 'PCloudSDKSwift' 添加到您的目标。您的 Podfile 应如下所示。

use_frameworks!

target 'YOUR_TARGET_NAME' do
    pod 'PCloudSDKSwift'
end

然后运行以下命令以安装 SDK 并将其集成到您的项目中

pod install

将 SDK 集成到您的项目后,您可以使用以下命令拉取 SDK 更新

pod update

Carthage

Carthage 是一个简单、去中心化的 Cocoa 依赖项管理器。如果您尚未使用 Carthage,您可以查看此处了解如何安装它。

要通过 Carthage 安装 pCloud Swift SDK,您需要在您的项目中创建一个 Cartfile(此文件列出了您想要在项目中使用的框架),内容如下

github "https://github.com/pcloud/pcloud-sdk-swift"

然后,运行以下命令(这将把依赖项提取到 Carthage/Checkouts 文件夹中并构建每个依赖项)

iOS
carthage update --platform iOS

在 Xcode 的项目导航器中,选择您的项目,然后选择您的目标,然后导航到General > Linked Frameworks and Libraries,并将 PCloudSDKSwift.frameworkCarthage/Build/iOS 拖放到此处。

然后,在您的应用程序目标的 Build Phases 设置选项卡上,单击 + 按钮并选择 New Run Script Phase。在新建的 Run Script 部分中,将以下代码添加到脚本正文区域

/usr/local/bin/carthage copy-frameworks

然后导航到 Input Files 部分并添加框架的路径

$(SRCROOT)/Carthage/Build/iOS/PCloudSDKSwift.framework
macOS
carthage update --platform Mac

在 Xcode 的项目导航器中,选择您的项目,然后导航到 General > Linked Frameworks and Libraries,然后将 PCloudSDKSwift.frameworkCarthage/Build/Mac 拖放到此处。

然后,在您的应用程序目标的 Build Phases 设置选项卡上,单击 + 图标并选择 New Copy Files Phase。在新建的 Copy Files 部分中,单击 Destination 下拉菜单并选择 Products Director,然后将 PCloudSDKSwift.framework.dSYMCarthage/Build/Mac 拖放到此处。

Swift Package Manager

pCloud SDK 可以使用 Swift Package Manager 集成到您的项目中。目前,SPM 支持仅添加到 iOS 平台。要将 SDK 集成到您的项目中,您需要指定存储库的 URL

https://github.com/pCloud/pcloud-sdk-swift

有关更多信息,请参阅官方文档


初始化 SDK

集成到您的项目后,SDK 需要验证用户身份才能进行 API 调用。

使用授权流程

SDK 具有用于获取用户的预定义流程。如果当前操作系统版本允许,它会尝试通过 ASWebAuthenticationSession 验证用户身份。否则,它会在您的应用程序内打开一个 web 视图,并加载 pCloud 授权页面,用户可以在其中登录并授权您的应用程序。要使用授权流程

初始化 PCloud 实例

在 app delegate 中

iOS
import PCloudSDKSwift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    PCloud.setUp(withAppKey: "YOUR_APP_KEY")
}
macOS
import PCloudSDKSwift

func applicationDidFinishLaunching(_ notification: Notification) {
    PCloud.setUp(withAppKey: "YOUR_APP_KEY")
}

执行授权流程

要启动授权流程,请调用 PCloud.authorize(with:_:) 并提供一个视图控制器和一个在授权完成或被用户取消时调用的代码块。视图控制器会在调用完成块之前自动关闭。

从您的视图控制器

iOS
import PCloudSDKSwift

// Inside a UIViewController subclass.

func logInButtonTapped(_ sender: UIButton) {
    PCloud.authorize(with: self) { result in
        if case .success(_) = result {
            // You can make calls via the SDK.   
        }
    }
}

这将尝试使用 ASWebAuthenticationSession 进行身份验证,或者从传递给该方法的视图控制器中显示带有 web 视图的视图控制器。

macOS
import PCloudSDKSwift

// Inside an NSViewController subclass.

func logInButtonTapped(_ sender: NSButton) {
    PCloud.authorize(with: self) { result in
        if case .success(_) = result {
            // You can make calls via the SDK.   
        }
    }
}

这将尝试使用 ASWebAuthenticationSession 进行身份验证,或者从传递给该方法的视图控制器中显示带有 web 视图的视图控制器作为 sheet。


一旦 PCloud.authorize(with:_:) 成功完成,您就可以开始通过可通过 PCloud.sharedClient 访问的全局 PCloudClient 实例进行 API 调用。此外,您的访问令牌存储在设备的钥匙串中,因此下次您的应用程序启动时,共享客户端实例将在 PCloud.setUp(withAppKey:) 调用中初始化。

手动创建客户端

这是一种更灵活的 SDK 使用方法。但是,它需要您做更多的工作。使用这种方法还将访问令牌的管理委托给您。您可以手动使用访问令牌创建 PCloudClient 实例。在某些情况下,手动管理此实例的生命周期可能对您来说更方便。要在不自动初始化共享客户端实例的情况下请求访问令牌

OAuth.performAuthorizationFlow(with: anchor, appKey: "YOUR_APP_KEY") { result in
    if case .success(let user) = result {
        let client = PCloud.createClient(with: user)
        // Use the client.
    }
}

其中 anchor 将是 iOS 上的 UIWindow 或 macOS 上的 NSWindow 的实例。此方法将尝试通过 ASWebAuthenticationSession 进行身份验证,这是推荐的身份验证方式。但是,它需要 iOS 13 / macOS 10.15。另一种选择是使用

OAuth.performAuthorizationFlow(with: view, appKey: "YOUR_APP_KEY") { result in
    if case .success(let user) = result {
        let client = PCloud.createClient(with: user)
        // Use the client.
    }
}

其中 view 将是 iOS 上的 WebViewControllerPresenterMobile 或 macOS 上的 WebViewControllerPresenterDesktop 的实例。


发起 API 请求

一旦您拥有授权的客户端,您就可以尝试使用 SDK 进行一些 API 请求。首先,创建对您的 PCloudClient 实例的引用

let client = PCloud.sharedClient // When using the authorization flow

处理网络任务

SDK 预定义了最常见的 API 请求,并通过 PCloudClient 实例作为方法公开了它们。每个方法都返回一个表示 API 请求的非运行任务对象。获得任务后,您可以为其分配回调块并启动它。任务完成后,它会生成一个 Result 值。

有三种类型的任务

CallTask

执行 RPC 请求。成功时,生成请求的预解析响应。失败时,生成 CallError 值。

import PCloudSDKSwift

client.createFolder(named: "Movies", inFolder: Folder.root)
    .addCompletionBlock { result in
        // Handle result
    }
    .start()
UploadTask

执行上传。成功时,生成上传文件的元数据。失败时,生成 CallError 值。

import PCloudSDKSwift

client.upload(fromFileAt: "file:///path/to/file", toFolder: Folder.root, asFileNamed: "song.mp3")
    .addProgressBlock { uploaded, total in
        // Handle progress
    }
    .addCompletionBlock { result in
        // Handle result
    }
    .start()
DownloadTask

下载文件。成功时,生成下载文件的 URL。失败时,生成 NetworkOperationError 值。

import PCloudSDKSwift

let link: FileLink.Metadata

client.downloadFile(from: link.address, downloadTag: link.downloadTag, to: { path in
    // Move the file
})
.addCompletionBlock { result in
    // Handle completion
}
.addProgressBlock { written, total in
    // Handle progress
}
.start()

一旦启动,任务可能会在成功、失败或取消时停止。由于任务不可重用,一旦任务以任何方式停止运行,就无法再次启动。只有当任务失败或成功时才会调用任务的完成块,而不是在任务被取消时。此外,任务的所有回调块都在主队列上调用。任务将在内存中保留在运行时,因此无需手动保留对其的引用,前提是您在创建时启动任务。

处理 API 错误

上传和 RPC 调用任务失败时会返回 CallError。此枚举组合了来自网络层和 PCloud API 层的可能错误。可能的错误之一是 CallError<T>.methodError(T),那里的子错误将取决于任务执行的 API 方法。所有 API 方法都在 PCloudAPI.swift 中定义,并且每个方法都在其命名空间中定义了一个 Error 枚举。因此,例如,如果您正在执行 ListFolder API 方法,则任务错误将定义为 CallError<ListFolder.Error>。某些 API 方法(例如 UserInfo)除了通用 API 错误之外不会失败,因此它们会将其错误定义为 NullError。此类任务永远不会因 CallError<T>.methodError(T) 而失败。


示例

示例应用程序可以在 Example_iOS 文件夹中找到。示例应用程序演示了如何验证用户身份以及如何列出用户的文件和文件夹。


文档