しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

Invalid Document Configuration. という警告が出たときの対処法

Xcodeで下のような警告が出たので調べてみました。

WARNING ITMS-90737: "Invalid Document Configuration. Document Based Apps should support either the Document Browser (UISupportsDocumentBrowser = YES) or implement Open In Place (LSSupportsOpeningDocumentsInPlace = YES/NO). Visit https://developer.apple.com/document-based-apps/ for more information."

対処法

警告に書いてあるとおり、Info.plistにUISupportsDocumentBrowserかLSSupportsOpeningDocumentsInPlaceをセットすれば解決します。

f:id:llcc:20181011184521p:plain

UISupportsDocumentBrowserは他アプリがこのアプリのファイルを操作するためのものです。
LSSupportsOpeningDocumentsInPlaceは他アプリから渡されるファイルに関するキーで、コピーではなく元ファイルを取得できるようになります。

警告が出る原因

Info.plistにDocument typesをセットすると発生します。
Document typesは他アプリからこのアプリを呼び出すときに使うキーです。

f:id:llcc:20181011184604p:plain

iOS12のショートカット アプリを使ってみる

iOS12のショートカットというアプリを使ってみました。

ショートカットとは

様々なiPhone上の行動を自動化できるアプリです。
「特定ワードをTwitterでつぶやく」「クリップボードの内容をメモ帳に入力する」など色々なことができます。

もともとはWorkflowという名前の有料アプリだったんですが、アップルが買収して無料で使えるようになりました。

ショートカットの使い方

ショートカットの使い方は下のとおりです。
まず自分でショートカットを作ってそれを呼び出すという流れになります。

  1. ショートカットを作る
  2. 作成したショートカットを呼び出す

ショートカットを作って実行する

アプリを開くと下のような画面になっています。
ここの「ショートカットを作成」からショートカットを作ります。

f:id:llcc:20180924163701p:plain

作成ボタンを押すと下のような画面になります。
画面下のアクション一覧からアクションを選んでショートカットを作っていきます。

試しに特定のテキストをメモに記入するというアクションを作ってみます。

f:id:llcc:20180924163746p:plain

まずはメモに入力する内容を設定します。
テキストというアクションを探して好きな文字を入力します。

f:id:llcc:20180924164217p:plain

次に「メモを作成する」アクションを設定します。
下のようにメモを作成を探してタップします。

f:id:llcc:20180924164247p:plain

これでテキストの内容をメモに書き出すショートカットができました。
画面上部の再生ボタンを押すことで実行されます。

f:id:llcc:20180924164347p:plain

保存を押すとメモ帳に実際に書き込まれます。

f:id:llcc:20180924164434p:plain

ウィジェットに設定しておくといつでも呼び出せて便利です。

f:id:llcc:20180924164625p:plain

大手アプリは結構対応しているので、自分なりに色々試すと楽しそうです。

f:id:llcc:20180924165124p:plain

Xcode10のStoryboardでUILabelやUIButtonを配置する方法とショートカット

Xcode10からオブジェクトを選ぶ場所が大きく変わってたのでメモ。

オブジェクトを選ぶ場合、Xcode上部の丸いアイコンをクリックします。

f:id:llcc:20180924160452p:plain

クリックするとオブジェクト一覧が出てくるので、ここからオブジェクトを選択します。

f:id:llcc:20180924160639p:plain

メニューから選択することもできます。

f:id:llcc:20180924160727p:plain

ショートカットキーは Command + Shift + L です。

ロゴ生成サービス、Free Logo Generator Onlineを試してみる

こちらの記事で紹介されていたサービスを試してみました。

note.mu

今回は自分の運営している「体重管理アプリ」のロゴを作ってみます。

体重管理Fittで人気の体重管理ダイエットを

体重管理Fittで人気の体重管理ダイエットを

  • hiroki sugimoto
  • ヘルスケア/フィットネス
  • 無料

使い方

TOPページは下の通り。
会員登録なしで始める事ができます。

f:id:llcc:20180828193206p:plain

次はカテゴリー選択です。
健康系のアプリなのでHealth and beautyにしました。

f:id:llcc:20180828193348p:plain

次にデザインのスタイルを選びます。
ここでは3つまで選ぶことができます。

f:id:llcc:20180828193947p:plain

サービス名の入力をします。

f:id:llcc:20180828194013p:plain

最後にロゴをどこで使うかを選択します。

f:id:llcc:20180828194128p:plain

以上で選択は終了です。
下のようにロゴを何パターンも生成してくれます。

f:id:llcc:20180828194156p:plain

ロゴを押すと色やフォントを変更できる画面に移動します。

f:id:llcc:20180828194321p:plain

Nextボタンを押すとダウンロードページに遷移します。

f:id:llcc:20180828194351p:plain

メールアドレスを入れるとロゴデータを送ってくれます。
データ形式はpngです。

f:id:llcc:20180828194658p:plain

【Swift】VoiceOver対応について調べてみる

VoiceOverについて調べてまとめてみました。

VoiceOver(ボイスオーバー)とは

VoiceOverとはiPhoneの視覚障害者の方向けの機能です。
画面を音声で読み上げることで画面が見えなくてもiPhoneを使うことができます。

f:id:llcc:20180821154214p:plain

VoiceOverをONにするとタップしたボタンやCellを読み上げてくれるようになります。
読み上げ中のオブジェクトは上画像のように黒く選択します。

VoiceOverの使い方

f:id:llcc:20180821154509p:plain

VoiceOverはiPhoneの設定アプリ → 一般 → アクセシビリティ → VoiceOverでONにすることができます。
ONにすると下のようにタップやスワイプといったジェスチャーの役目が大幅に変わります。

  • ボタンやCellをタップすると音声読み上げをする
  • 今までのシングルタップを実現したい時はボタンを2回タップ
  • スクロールしたい時は3本指でスクロール
  • 2本指でスクロールすると読み上げ可能なボタンやCellを順番に読み上げる

アプリのVoiceOver対応方法

f:id:llcc:20180821162342p:plain

VoiceOverですが、ボタンやラベルはデフォルトで読み上げ対象になっています。
上画像のようにラベル・ボタン・Viewだけを配置したアプリを作ったところ、ラベルとボタンはタップすると読み上げてくれるようになっていました。

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var myView: UIView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        myView.isAccessibilityElement = true
        myView.accessibilityLabel = "My view"
    }
}

UIViewも読み上げ対象にしたい場合はisAccessibilityElementをtrueにします。
読み上げ内容はaccessibilityLabelで設定をします。

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var myButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        myButton.isAccessibilityElement = false
    }
}

逆に読み上げたくない場合はisAccessibilityElementをfalseにします。

iPhoneシミュレータでVoiceOverの検証をする方法

iPhoneシミュレータではVoiceOverをONにすることができません。
代わりにAccessibility Inspectorというツールを使います。

f:id:llcc:20180821162837p:plain

Accessibility InspectorはXcodeのメニューバーのXcode → Open Developer Toolから開きます。

f:id:llcc:20180821163126p:plain

シミュレータの画面をタップすることで、読み上げテキストの内容などを確認することができます。

RailsとCarrierWaveで画像アップロードを実装する

CarrierWaveというGemを使って画像のアップロードを実装しました。
今回はUserモデルのimageというプロパティーに画像をセットする実装をします。

github.com

CarrierWaveのインストール

CarrierWaveを入れる前にImageMagickをインストールします。
Macの場合は下コマンドでインストールします。

brew install imagemagick@6
brew install pkg-config
export PKG_CONFIG_PATH=/usr/local/opt/imagemagick@6/lib/pkgconfig

ImageMagickを入れたらBundlerでcarrierwaveとrmagickを入れます。

gem 'carrierwave'
gem 'rmagick'

CarrierWaveでファイルアップロード

最初にファイルのアップローダーを追加します。
追加は下コマンドで行います。

rails g uploader image

コマンドを打つと下のようなファイルが生成されます。(余計なコメントなどは削除)
画像のパスやサムネイル生成の有無などを変更したい時はこのファイルに設定を書きます。

class ImageUploader < CarrierWave::Uploader::Base
  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end

次にUserモデルを作成します。
scaffoldで一気に作ってしまいます。

rails g scaffold user image:string

usersテーブルのimageカラムはStringのままで構いません。
ここにはファイルのパスが入ります。

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :image

      t.timestamps null: false
    end
  end
end

次はUserモデルにファイルアップロード用の処理を記述します。
user.rbに下のように1行追加します。

class User < ActiveRecord::Base
  mount_uploader :image, ImageUploader
end

次はファイルのアップロード画面を実装します。
views/users/_form.html.erbのフォーム周りの実装を修正します。

<%= form_for(@user) do |f| %>
  <% if @user.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>

      <ul>
      <% @user.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :image %><br>
    <!-- 下2行を変更 -->
    <%#= f.text_field :image %>
    <%= f.file_field :image %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

これでファイルアップロード用画面ができました。

f:id:llcc:20180726232255p:plain

アップロードしたファイルは、ImageUploaderの設定に従ってpublic/uploads/user/image以下に保存されます。

f:id:llcc:20180726232551p:plain

CarrierWaveで画像の表示

最後にアップロードしたファイルの表示を実装します。
views/users/show.html.erbを下のように修正してください。

<p id="notice"><%= notice %></p>

<p>
  <strong>Image:</strong>
  <!-- 下2行を変更 -->
  <%#= @user.image %>
  <%= image_tag @user.image.url %>
</p>

<%= link_to 'Edit', edit_user_path(@user) %> |
<%= link_to 'Back', users_path %>

ブラウザで確認すると正しくファイルが表示されています。

f:id:llcc:20180726232822p:plain

参考URL

macOS に RMagick をインストールする
Rails 超お手軽な画像アップローダー CarrierWave の使い方 | Workabroad.jp

【iOS11】設定アプリ内にある自分のアプリの設定画面へ遷移する

iPhoneの設定アプリには、下のように自分のアプリの設定ページが用意されています。
今回はここへ直接遷移する方法について調べました。

f:id:llcc:20180720173134p:plain

自分のアプリの設定画面への遷移方法

遷移方法は下の通りです。

if let url = URL(string: UIApplicationOpenSettingsURLString) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

UIApplicationOpenSettingsURLStringは文字列型で、自分の設定ページへの遷移URLが入っています。

print(UIApplicationOpenSettingsURLString) // → app-settings: