20211013のiOSに関する記事は4件です。

iOSアプリからスプレッドシードのデータを読み込む

iOSアプリからスプレッドシートのデータを読み込みたい時が人生にはあります。その方法です。 大まかな流れ iOSからスプレッドシートのデータを読むためには、スプレッドシート側にGAS(Google Apps Script)を実装する必要があります。GASでスプレッドシートをReadするGETを実装し、iOSからそこ目掛けて通信する実装をすれば完成です。 GASの実装 スプレッドシートの「シート1」シートに下記のようなデータがあるものとします。 スプレッドシートメニューのツール>スクリプトエディタを選択します。 するとApps Scriptエディタが開きます。 ここに処理を実装していきます。 Readする スプレッドシートのデータを読み込む方法は以下の通りです。 function myFunction(){ var targetFileID = DriveApp.getFileById("xxxxx") var targetFile = SpreadsheetApp.open(targetFileID) var targetSheet = targetFile.getSheetByName("シート1") var values = targetSheet.getRange(3, 1, 1, 4).getValues() console.log(values) } //出力結果 22:51:30 情報 [ [ '花子', 22, 15, 5 ] ] DriveApp.getFileById("xxxxx")でGoogle Drive内にある対象ファイルのIDを取得します。※1 SpreadsheetApp.open(targetFileID)で対象ファイルを取得します。 targetFile.getSheetByName("シート1")で対象ファイル内の対象シートを取得します。 targetSheet.getRange(3, 1, 1, 4).getValues()で対象シート内の3行目1列目のセルを起点に、1行分4列目まで取得します。 デバッグするにはメニューバーにある▷実行を押します。 スプレッドシートの内容にアクセスする場合、初回はアクセス権限に関する表示が出るので対処します。 ※1:ファイルIDはURLの https://docs.google.com/spreadsheets/d/xxxxx/edit#gid=0 の「xxxxx」にあたる部分です GETを実装する GASでWebAPIを実装できます。GASの中でGETならdoGet(e)を定義し実装します。これをウェブアプリとして公開するとWebAPIが発行され外部からアクセスできるようになります。 doGet(e) スプレッドシートの内容をWebAPI経由で取得する方法は以下の通りです。 function doGet(e){ var targetFileID = DriveApp.getFileById("xxxxx") var targetFile = SpreadsheetApp.open(targetFileID) var targetSheet = targetFile.getSheetByName("シート1") var values = targetSheet.getRange(3, 1, 1, 4).getValues() return ContentService.createTextOutput(JSON.stringify(values)).setMimeType(ContentService.MimeType.JSON) } myFunction()をdoGet(e)に書き換えます。 データの取得まではReadすると同じです。 returnに ContentService.createTextOutput(JSON.stringify(values)).setMimeType(ContentService.MimeType.JSON) を書きます。スプレッドシートの情報をJSON形式で返します。 デプロイを行い、WebAPIを発行します。 こちらの手順を参考にして下さい。 すると、このような形でWebAPIが取得できます。 試しにブラウザにそのURLを入力するとdoGet(e)内で取得された情報が返ってくるのが確認できます。 iOSの実装 ここではiOSからGASのWebAPIへのアクセスを容易にするためにAlamofireとSwiftyJSONを用います。適宜インストールして下さい。 import UIKit import Alamofire import SwiftyJSON class ViewController: UIViewController { @IBOutlet weak var name: UILabel! @IBOutlet weak var count: UILabel! override func viewDidLoad() { super.viewDidLoad() let url = "https://script.google.com/macros/s/xxx/exec" //上記で取得したWebAPI AF.request(url, method: .get).responseJSON{ (response) in switch response.result { case .success(let elm): let json = JSON(elm as Any)// [["花子", 22, 15, 5]] self.name.text = json[0][0].stringValue self.count.text = json[0][2].description case .failure(_): print("failure") } } } } AF.request(_, method: .get)で上で取得したWebAPIへGETで通信を行います response.resultにレスポンスが入るので、Switch文で分岐処理します レスポンスをJSONオブジェクトに変換します JSONオブジェクトインスタンスの各要素にアクセスし、型に応じて変換処理をかけます これをシュミレータで実行するとこうなります。 まとめ iOSアプリからスプレッドシートのデータを読み込む方法をまとめました。 この様な流れでiOSからスプレッドシートのデータを読み込むことができます。 パラメータを付けて何行目のデータを取得する等、動的にすることも可能です。 スプレッドシートにデータを書き込む方法もまとめましたので、よろしければご覧ください。 おまけ doGet()を実装する際、デバッグする度iOS側からアクセスするのは面倒です。 下記のリンクに簡易デバッグの方法を記載しましたのでご参照ください。 GoogleAppsScriptでdoGet()をdebugする
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift】GCDについて

GCDとは GCD(Dispatch)はGrand Central Dispatch の略で、DipatchQueueに処理を投入することで、コードを同時実行することができます。 DispatchQueueとは GCDのキューはディスパッチキューといいます。キューに行いたい処理をクロージャで渡し実行します。ディスパッチキューの実行方式には以下があります。 直列→他のスレッド終了を待機し、完了後タスク処理を実行します。 並列→他のスレッド処理を待機せず、タスク処理を同時実行します。 キューの取得 GCDには既存のディスパッチキューとして以下の2つがあります。 mainQueue : mainQueueはメインスレッドでタスクを実行する直列キューです。 iOSやmacOSのアプリケーションにおいては、UIの更新処理は常にmainQueueで行われます。なので、他のQueueで実行した処理の結果をUIに反映させるにはmainQueueを呼び出してタスクを渡す必要があります。 globalQueue: システム全体で共有される並列キュー。実行優先度(Qos)を指定して取得。Qosは優先度の高い順に次の5種類があります。 使用例 DispatchQueue.main.sync ⇨ 直列キューなので処理は順番に実行される。またsyncなので、タスク終了まで次の処理に進みません。 DispatchQueue.main.async { for i in 0 ... 5 { print("DispatchQueue.main.async ",i) } } print("finish") --------- DispatchQueue.main.async 0 DispatchQueue.main.async 1 DispatchQueue.main.async 2 DispatchQueue.main.async 3 finish DispatchQueue.main.async ⇨直列キューなので処理は順番に実行される。asyncなので、タスクをキューに追加したら次の処理に進みます。 DispatchQueue.main.async { for i in 0 ... 5 { print("DispatchQueue.main.async ",i) } } print("finish") --------- finish DispatchQueue.main.async 0 DispatchQueue.main.async 1 DispatchQueue.main.async 2 DispatchQueue.main.async 3 DispatchQueue.global.sync ⇨ 並列に実行するので、実行順は保証されません。またsyncなので、タスク終了まで次の処理に進みません。 DispatchQueue.global().sync { for i in 0 ... 3 { print("DispatchQueue.global.async1 ",i) } } print("finish1") DispatchQueue.global().sync { for i in 0 ... 3 { print("DispatchQueue.global.async2 ",i) } } print("finish2") ---- DispatchQueue.global.async1 0 DispatchQueue.global.async1 1 DispatchQueue.global.async1 2 DispatchQueue.global.async1 3 finish1 DispatchQueue.global.async2 0 DispatchQueue.global.async2 1 DispatchQueue.global.async2 2 DispatchQueue.global.async2 3 finish2 DispatchQueue.global.async ⇨並列に実行するので、実行順は保証されません。asyncなので、タスクをキューに追加したら次の処理に進みます。 DispatchQueue.global().async { for i in 0 ... 3 { print("DispatchQueue.global.async1 ",i) } } print("finish1") DispatchQueue.global().async { for i in 0 ... 3 { print("DispatchQueue.global.async2 ",i) } } print("finish2") ---- finish1 finish2 DispatchQueue.global.async1 0 DispatchQueue.global.async2 0 DispatchQueue.global.async1 1 DispatchQueue.global.async2 1 DispatchQueue.global.async1 2 DispatchQueue.global.async2 2 DispatchQueue.global.async1 3 DispatchQueue.global.async2 3 キューの生成 GCDには既存のディスパッチキューだけでなく、新規のディスパッチを生成することができます。このキューは並列、直列どちらでも作成することができます。 終わりに 終わりです。随時更新します
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Xcode13でiOSアプリの代替アイコンを簡単に追加できます(3つの簡単なステップで)

アイコンのカスタマイズは、新しい機能ではありません。 しかし、Xcode 13のリリース前は、その作業は一筋縄ではいきませんでした。 Xcode 13では、簡単にアプリアイコンを追加し、ユーザーがその中から選択して使用できるようにしています。 まず、追加となるアイコンカタログを追加します 以前と同様に、アセットフォルダー内のAppIconフォルダーにアプリアイコンを追加します。 デフォルトのアプリアイコンを追加したら、下のバーにある「+」アイコンをクリックし、iOSを選択し、iOS App Iconを選んで、新しいiOSアイコンパックを作成します。 そして、新しいアイコンをアプリのバンドルに入れてください。 次に、新たに作成したアイコンパックにアイコンを追加する必要があります。 1つのiOSアプリに複数のアイコンを追加できます。 上記の画像では、5つのアイコンが追加されたことがお分かりいただけると思います。 そして、新しいアイコンをアプリのバンドルに入れてください。 次に、Xcodeに新しいアイコンを知らせる必要があります。 まずプロジェクトのターゲットページに移動し、Build Settingsをクリックしてください。次にAlternate App Icon Sets(配列)を検索し、項目をダブルクリックして、カスタムアイコンパックの名前を入力します。 ユーザーがお気に入りのアイコンを選択できるようにしましょう UIApplication.shared.setAlternateIconName(iconBundleName) { error in print(error) } アイコンバンドルの名称(上記の例では、可能な1つの値としてNekoIconが挙げられます)をsetAlternateIconName引数に指定する必要があります。 アプリアイコンをデフォルトのものに復元したければ、nilを引数に指定する必要があります。 UIApplication.shared.setAlternateIconName(nil) { error in print(error) } Twitter @MszPro 私の公開されているQiita記事のリストをカテゴリー別にご覧いただけます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Xcode13でiOSアプリの複数のアイコンを簡単に追加できます(3つの簡単なステップで)

アイコンのカスタマイズは、新しい機能ではありません。 しかし、Xcode 13のリリース前は、その作業は一筋縄ではいきませんでした。 Xcode 13では、簡単にアプリアイコンを追加し、ユーザーがその中から選択して使用できるようにしています。 まず、追加となるアイコンカタログを追加します 以前と同様に、アセットフォルダー内のAppIconフォルダーにアプリアイコンを追加します。 デフォルトのアプリアイコンを追加したら、下のバーにある「+」アイコンをクリックし、iOSを選択し、iOS App Iconを選んで、新しいiOSアイコンパックを作成します。 そして、新しいアイコンをアプリのバンドルに入れてください。 次に、新たに作成したアイコンパックにアイコンを追加する必要があります。 1つのiOSアプリに複数のアイコンを追加できます。 上記の画像では、5つのアイコンが追加されたことがお分かりいただけると思います。 そして、新しいアイコンをアプリのバンドルに入れてください。 次に、Xcodeに新しいアイコンを知らせる必要があります。 まずプロジェクトのターゲットページに移動し、Build Settingsをクリックしてください。次にAlternate App Icon Sets(配列)を検索し、項目をダブルクリックして、カスタムアイコンパックの名前を入力します。 ユーザーがお気に入りのアイコンを選択できるようにしましょう UIApplication.shared.setAlternateIconName(iconBundleName) { error in print(error) } アイコンバンドルの名称(上記の例では、可能な1つの値としてNekoIconが挙げられます)をsetAlternateIconName引数に指定する必要があります。 アプリアイコンをデフォルトのものに復元したければ、nilを引数に指定する必要があります。 UIApplication.shared.setAlternateIconName(nil) { error in print(error) } Twitter @MszPro 私の公開されているQiita記事のリストをカテゴリー別にご覧いただけます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む