この記事は2018年06月30日に投稿しました。
この記事は2018年08月04日に更新しました。
目次
詳細! Swift 4 iPhoneアプリ開発 入門ノート Swift 4 + Xcode 9対応
- 作者: 大重美幸
- 出版社/メーカー: ソーテック社
- 発売日: 2017/11/03
- メディア: 単行本
- この商品を含むブログを見る
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
OneDrive APIでファイルを作成してみます。
なぜかOneDrive SDK for iOSでファイル作成のAPIが見つからなかったため、OneDriveのREST APIを使ってファイルを作成することにしました。
2. ファイル作成処理
ファイル作成処理は、REST APIを使ったHTTP通信処理で行っています。
HTTP通信処理自体は、定番の実装です。
ポイントは2つあって
- アクセストークンを取得する。
- キャッシュをOFFにする。
になります。
その他のOneDrive APIの操作は、認証済みクライアントオブジェクトがHTTP通信を行っていますが、その中でHTTPリクエストヘッダにアクセストークンを付加しています。
こうすることにより認証済みのユーザからのアクセスだと認識されます。
今回は自分でHTTP通信するため、このアクセストークンも自分でHTTPリクエストヘッダに付加する必要があります。
2つ目のポイントですが、最初キャッシュを気にせず実装したところ、ファイルが作られたり作られなかったりしました。
よくよく調査してみると、ファイルを作成した後にファイルを削除し、再度同じファイル名でファイルを作成すると、ファイルが作成されないことがわかりました。
いろいろ試した結果、キャッシュをOFFにすることで解決しました。
import OneDriveSDK /** ファイルを作成する。 - Parameter parentId: 親ディレクトリのID - Parameter fileName: ファイル名 */ fileprivate func createFile(_ parentId: String, fileName: String) { // 認証済みクライアントオブジェクトを取得します。 guard let client = ODClient.loadCurrent() else { // 認証済みクライアントオブジェクトが取得できない場合、処理を終了します。 // 念のためのチェックです。 // 必要に応じてエラー処理を行ってください。 return } // ベースURLを取得します。 guard let baseURL = client.baseURL else { // ベースURLが取得できない場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // アカウントセッションを取得します。 guard let accountSession = client.authProvider.accountSession?() else { // アカウントセッションが取得できない場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // アクセストークンを取得します。 guard let accessToken = accountSession.accessToken else { // アクセストークンが取得できない場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // ファイル名をURLエンコードします。 guard let encodedFileName = fileName.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) else { // URLエンコードできない場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // URL文字列を生成します。 let urlString = "\(baseURL)/drive/items/\(parentId)/children/\(encodedFileName)/content" // URLを生成します。 guard let url = URL(string: urlString) else { // URLが生成できない場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // HTTPリクエストを生成します。 let request = NSMutableURLRequest(url: url) // キャッシュをオフにします。 request.cachePolicy = .reloadIgnoringLocalCacheData // HTTPメソッドを設定します。 // 今回は"PUT"を使用します。 request.httpMethod = ”PUT" // Content-Typeを設定します。 request.setValue("text/plain", forHTTPHeaderField: "Content-Type") // Authorizationを設定します。 // ここでアクセストークンを設定します。 let bearer = String(format: "Bearer %@", accessToken) request.setValue(bearer, forHTTPHeaderField: "Authorization") // ファイルデータを設定します。 // 新規作成の場合、データは空とします。 request.httpBody = Data() // 通信タスクを生成します。 let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { (data: Data?, response: URLResponse?, error: Error?) -> Void in if let error = error { // エラーの場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } // HTTPステータスコードを取得します。 guard let httpURLResponse = response as? HTTPURLResponse else { // HTTPステータスコードが取得できない場合、処理を終了します。 // 必要に応じてエラー処理を行ってください。 return } let statusCode = httpURLResponse.statusCode // HTTPステータスコード別に処理を振り分けます。 switch statusCode { case 200, 201: // 正常終了の場合、正常時に行う処理を記述してください。 break default: // 上記以外のHTTPステータスコードはエラーとして、処理を終了します。 // 必要に応じてエラー処理を行ってください。 break } }) // HTTP通信タスクを実行します。 task.resume() }
3. おわりに
最初OneDrive SDKでファイル作成のAPIが見つけられなかったときは焦りました。
PWEditorでは、ローカル、iCloud、GoogleDrive、そしてOneDriveのストレージに対し、同様のファイル操作を提供しようと考えていたためです。
なのでOneDriveだけ"ファイル作成できない"としたくなくて、必死に調べて実装しました。
絶対に挫折しないiPhoneアプリ開発「超」入門 増補第6版【Swift 4 & iOS 11】完全対応 (Informatics&IDEA)
- 作者: 高橋京介
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2017/11/22
- メディア: 単行本
- この商品を含むブログを見る
紹介している一部の記事のコードは[Gitlab]で公開しています。
興味のある方は覗いてみてください。
私が勤務している[ニューラル][ニューラル]では、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS [Bi-OS][Bi-OS]は高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688