【swift】DropBoxAPIを使用して一覧を取得

概要

DropBoxAPIを使用して、一覧を取得します。

開発環境

  1. Mac OS 13.2
  2. Xcode 14.0

認証画面を表示

  • DropBoxの認証画面を表示して認証します。
@IBAction private func moveSignIn(_ sender: Any) {
    // 認証されているかを判定します。
    guard DropboxClientsManager.authorizedClient != nil else {
        // 認証されていない場合、DropBoxの認証をします。
        signInDropbox()
        return
    }
}

private func signInDropbox() {
    let scopeRequest = ScopeRequest(scopeType: .user,
                                    // 表示する権限です。DropBoxDeveloperConsoleでチェックしたものを指定します。
                                    scopes: ["files.metadata.write",
                                             "files.content.write"],
                                    includeGrantedScopes: false)
    DropboxClientsManager.authorizeFromControllerV2(
        UIApplication.shared,
        controller: self,
        loadingStatusDelegate: nil,
        openURL: { (url: URL) -> Void in UIApplication.shared.open(url) },
        scopeRequest: scopeRequest
    )
}
  • 実行すると認証画面が表示されます。

  • 進めていくとDropBoxを使用するかどうかの画面が表示されます。
  • Allowを押下すると呼び出し画面へ戻ります。


一覧の取得

private func getList() {
    // 認証があるか確認してDropboxClientを取得します。
    guard let dropboxClient = DropboxClientsManager.authorizedClient else {
        return
    }
    // 指定したパスのファイル情報を取得します。
    // この場合は一番上を指定してます。
    let listFolders = dropboxClient.files.listFolder(path: "")
    listFolders.response { response, error in
        guard let result = response else {
            return
        }
        for entry in result.entries {
            // 格納されているFile情報が取れます。
            if let file = entry as? SwiftyDropbox.Files.FileMetadata {
                file.name // ファイル名
                file.size // ファイルサイズ
                file.pathDisplay // ファイルパス
                // その他ファイル情報が取れます。
            } else if let folder = entry as? SwiftyDropbox.Files.FolderMetadata {
                folder.name // フォルダ名
                folder.pathDisplay // フォルダパス
                // その他フォルダ情報が取れます。
            }
        }
    }
}

【swift】DropBoxのAPIを使用する。

概要

swiftでDropBoxAPIを使用するための事前設定です。

開発環境

  1. Mac OS 13.2
  2. Xcode 14.0

DropBoxAPIを使用する準備

  • DropBoxDeveloperでappを作成

以下のページのcreate appボタンからappを開始します。
https://www.dropbox.com/developers/apps

以下の内容を入力しcreate appボタンで作成されます。

作成されたらapp keyをメモしておきましょう。
後で使用します。

Xcode設定

  • Info.plistの編集

赤枠の値を入れてください
app keyもここで設定します。

  • PodsでDoropBoxのライブラリを追加します。

Podfileには以下を設定します。

target 'プロジェクト名' do
  use_frameworks!
  pod 'SwiftyDropbox'
end

pod installをします。
Alamofireも一緒に入りました。

>pod install

Analyzing dependencies
Downloading dependencies
Installing Alamofire (5.4.4)
Installing SwiftyDropbox (9.1.0)
Generating Pods project
Integrating client project
Pod installation complete! There is 1 dependency from the Podfile and 2 total pods installed.

【swift】日付の計算方法

概要

日付の計算をします。

開発環境

  1. Mac OS 13.1
  2. Xcode 14.0
/// 日付のいずれかの要素を加減算する
/// - prameter component: 年月日等何を加減算するのか
/// - prameter value: 加減算量
/// - return 加減算後の日付
private func calculateDate(component: Calendar.Component, value: Int) -> Date? {
    let date = Date()
    let afterDate = Calendar.current.date(byAdding: component, value: value, to: date)

    rreturn afterDate
}
// 現在日付から5日後の日付を取得する。
let afterDate = calculateDate(component: .day, value: 5)

print("現在日付:",Date())
print("計算結果:",afterDate!)
現在日付: 2023-01-24 07:56:03 +0000
計算結果: 2023-01-29 07:56:03 +0000

Calendar.Componentに何を設定したら良いか

Calendar.Component 内容
.year 年の加減算ができる
.month 月の加減算ができる
.day 日の加減算ができる
.weekday .dayと同様の挙動
.weekOfYear 週の加減算ができる。 (valueを1にすると1週間後の日付が戻る)
.weekOfMonth .weekOfYearと同様の挙動
.hour 時の加減算ができる
.minute 分の加減算ができる
.second 秒の加減算ができる

【swift】UIViewにグラデーションを付ける。

概要

UIViewを使ってカラーグラデーションを表現します。
作成したレイヤーをサブレイヤーとして追加します。

開発環境

  1. Mac OS 13.1
  2. Xcode 14.0
private func gradient(view: UIView) {
    // CAGradientLayerのオブジェクトのインスタンスを取得します。
    let layer: CAGradientLayer = CAGradientLayer()
    // グラデーションする。2色を指定します。
    let background1 = UIColor.lightText
    let background2 = UIColor.brown
    // レイヤーの範囲を指定します。
    layer.frame.size = CGSize(width: view.bounds.maxX, height: 100)
    // レイヤーに色を指定します。
    layer.colors = [background1.withAlphaComponent(1.0).cgColor,
                 background2.withAlphaComponent(1.0).cgColor]
    // レイヤーの開始位置を指定します。
    layer.startPoint = CGPoint(x: 0.0, y: 0.0)
    // レイヤーの終了位置を指定します。
    layer.endPoint = CGPoint(x: 1.0, y: 0.0)
    view.layer.addSublayer(layer)
}

【swift】UIViewを使って破線を表示する。

概要

UIViewを使って破線を表現します。
作成した破線レイヤーをサブレイヤーとして追加します。

開発環境

  1. Mac OS 13.1
  2. Xcode 14.0
func drawDottedLine(view: UIView) {
  // CAShapeLayerのオブジェクトのインスタンスを取得します。
  let sharpeLayer: CAShapeLayer = CAShapeLayer()
  // 波線に色を付けます。
  sharpeLayer.strokeColor = UIColor.lightGray.cgColor
  // 厚さを設定します。
  sharpeLayer.lineWidth = 1
  // 波線のピッチを設定します。
  sharpeLayer.lineDashPattern = [4, 4]

  // 追加するレイヤーの範囲を設定します。
  let path: CGMutablePath = CGMutablePath()
  path.addLines(between: [CGPoint(x: view.bounds.minX, y: view.bounds.minY) ,
     CGPoint(x: view.bounds.maxX, y: view.bounds.maxY)])
  sharpeLayer.path = path

  view.layer.addSublayer(sharpeLayer)
}

【swift】iOSシェア機能でファイルを受信する実装

概要

Gmail等に添付されているファイルをシェア機能と使って受取る実装です。

開発環境

  1. Mac OS 11.6.2
  2. Xcode 13.1

事前準備

  • Gmail等シェアできるアプリが必要です。

Info.plistの設定

  • TARGETのInfoから設定するとわかりやすいでしょう

直接設定しても反映されます。
f:id:develop-imonari:20220106142539p:plain

  • nameに適当な名前、Typesにファイルタイプを入れます。

ファイルタイプは受取りたいファイルの種別です。System-Declared Uniform Type Identifiersを参照してくださいIdentifier列の値を入れます。
developer.apple.com

  • 例:テキストファイルはpublic.text、画像ファイル(png)はpublic.png等、複数設定することも可能です。
  • またpublic.dataを設定することで全てのTypeを受けることが出来ます。

f:id:develop-imonari:20220106144920p:plain

  • 他のアプリからのシェア機能で現れました。

受信したファイルのURLの取得

  • iOS13からはSceneDelegateで受け取ります。
  • アプリが起動している時
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    // アプリが起動している場合はこのメソッドで受ける
    // URLContextsにはいているURLが受信したファイルのURL
    let content = urlContexts.first
    let url = content?.url
}
  • アプリが起動していない
var urlContexts: Set<UIOpenURLContext>?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
    // アプリが起動していない時は起動時にここでシェアするファイルのURL取得する。
    urlContexts = connectionOptions.urlContexts
    guard (scene as? UIWindowScene) != nil else {
        return
    }
}

【swift】iOSでPush通知に画像表示する実装

開発環境

  1. Mac OS 11.6.2
  2. Xcode 13.1

事前準備

  • Push通知を受け取る実装をしておいてください

develop-imonari.hatenablog.com

TARGETにNotification Service Extensionを追加

f:id:develop-imonari:20211228140929p:plain
f:id:develop-imonari:20211228140944p:plain
f:id:develop-imonari:20211228140956p:plain

f:id:develop-imonari:20211228163400p:plain

NotificationServiceの実装

  • TargetにNotification Service Extensionを追加するとデフォルトでNotificationService.swiftが出来上がります。
  • NotificationService.swiftのdidReceiveに画像ダウンロードと設定を行うことで、受取ったPush通知に画像が表示されます。
  • 取り出す要素名はJSONと同じにしなければならないので後述を参照してください
// プッシュ通知が届いたらこのメソッドにコールバックされます。
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
    self.contentHandler = contentHandler
    bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
    // プッシュ通知のペイロードからUserInfo部分を取り出す
    if let attachment = request.content.userInfo["rpr_attachment"] as? [String: String] {
        // ペイロードに要素があれば取得
        if let urlString = attachment["url"], let fileURL = URL(string: urlString), let type = attachment["type"] {
            // urlはファイルパス。typeは拡張子
            // ペイロードのrpr_attachmentのurlからファイルをダウンロードする
            URLSession.shared.downloadTask(with: fileURL) { (location, response, error) in
                if let location = location {
                    let fileName = UUID().uuidString + "." + type
                    let tmpFile = "file://".appending(NSTemporaryDirectory()).appending(fileName)
                    let tmpUrl = URL(string: tmpFile)!
                    try? FileManager.default.moveItem(at: location, to: tmpUrl)
                    if let attachment = try? UNNotificationAttachment(identifier: "IDENTIFIER", url: tmpUrl, options: nil) {
                        self.bestAttemptContent?.attachments = [attachment]
                    }
                }
                contentHandler(self.bestAttemptContent!)
            }.resume()
        }
    } else {
        contentHandler(self.bestAttemptContent!)
    }
}

Push通知を試す。

  • テストツール(こちらを使ってみました。)

github.com

  • 各種設定値とカスタムJSONを設定してPushボタンで送信です。

最初は時間がかかるので少し待ってください
f:id:develop-imonari:20211228162237p:plain

  • 受取った通知に画像が出ました。

  • 通知を下にドラッグすると画像を大きくすることが出来ます。