20201108のiOSに関する記事は9件です。

【Swift】ミュージックライブラリから曲を再生する方法

ミュージックライブラリを使用する方法

ミュージックライブラリを使用する場合、ミュージックライブラリへのアクセスを許可させる必要があります。

info.plist
Privacy - Media Library Usage Description

曲の再生は、MediaPlayerを使用してミュージックライブラリから曲を取得し、
MPMediaItemCollectionに分けることで、再生させるようにできます。

import MediaPlayer

ミュージックライブラリから曲の一覧を取得する方法

ミュージックライブラリからの取得は曲以外に、アルバム、アーティストから一覧を取得することもできます。

// 曲の一覧を取得
let mPMediaQuery = MPMediaQuery.songs()

// アルバムの一覧を取得
let mPMediaQuery = MPMediaQuery.albums()

// アーティストの一覧を取得
let mPMediaQuery = MPMediaQuery.artists()

曲を取得した後は、再生させるため曲ごとに分ける必要があります。

let mPMediaQuery = MPMediaQuery.songs()
if let collections = mPMediaQuery.collections {
     for collection in collections {
          // タイトル
          print(collection.items[0].title!)
     }
}

再生する曲をセット

setQueue(with: MPMediaItemCollection)でミュージックにある曲を指定して再生することができます。

var player = MPMusicPlayerController.applicationMusicPlayer

// 曲をセット
player.setQueue(with: MPMediaItemCollection)

// 曲を再生できるようにする
player.prepareToPlay()

再生 

player.play()

一時停止

player.pause()

停止

player.stop()

リピート

設定値によって、リピート方法を変更することができます。

// ユーザ好みのリピート
player.repeatMode = .default

// リピートしない
player.repeatMode = .none

// 現在の曲をリピート
player.repeatMode = .one

// 現在のプレイリストをリピート
player.repeatMode = .one

シャッフル

設定値によって、シャッフル方法を変更できます。

// シャッフルしない
player.shuffleMode = .off

// ユーザ好みのシャッフル
player.shuffleMode = .default

// 曲ごとにシャッフル
player.shuffleMode = .songs

// アルバムごとにシャッフル
player.shuffleMode = .albums

参考

https://developer.apple.com/documentation/mediaplayer/mpmusicplayercontroller

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift5】画面遷移の方法

はじめに

学習でのアプリ開発で、1 Storyboard — 1 ViewControllerで設計しているのですが、画面遷移についての方法をいつもネットで検索していると気づきましたので、備忘録として投稿します。

上記の方法で設計している理由としまして、1つのViewControllerにつき1つのStoryBoardを用意する作り方は共同開発におけるコンフリクトが少なくなるとのことです。

動作環境

【Xcode】Version 12.0.1
【Swift】Version 5.3

実装方法 ( navigationController を使う)

// 遷移先のView(NextViewController)を取得
let storyboard = UIStoryboard(name: "Next", bundle: nil)
let nextVC = storyboard.instantiateViewController(withIdentifier: "NextVC") as! NextViewController
// NextViewControllerへ画面遷移
self.navigationController?.pushViewController(nextVC, animated: true)

実装方法 ( navigationController を使わない)

// 遷移先のView(NextViewController)を取得
let storyboard = UIStoryboard(name: "Next", bundle: nil)
let nextVC = storyboard.instantiateViewController(withIdentifier: "NextVC") as! NextViewController
// NextViewControllerへ画面遷移
self.present(nextVC, animated: true, completion: nil)

実装方法 ( storyboard の設定)

  • Storyboardの画面をインスタンス化するので、Storyboard IDをつけておく必要があります。Use Storyboard IDにチェックをつけるのを忘れないように注意してください。

スクリーンショット 2020-11-08 20.16.46(2).png

まとめ

画面遷移の方法はまだまだありますので、随時更新できればなと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Swift5】TabBarControllerを用いたXLPagerTabStripの実装

はじめに

XLPagerTabStripというSwift製のiOSライブラリを使った際に、TabBarControllerと絡めた実装をしました。storyboardでの設定等で少し詰まったりもしましたので、備忘録として投稿します。

動作環境

【Xcode】Version 12.0.1
【Swift】Version 5.3
【CocoaPods】version 1.9.3

実装後の画面

output.gif

実装手順

1. TabBarControllerの用意

  1. Main.storyboardの元々あるViewControllerを削除して、TabBarControllerを追加します。付属のViewControllerも消しておいてください。(storyboard1つに対してViewController1つとする理由です。)
    スクリーンショット 2020-11-08 1.45.48(2).png

  2. Is Initial View Controllerにチェックを入れます。
    スクリーンショット 2020-11-08 1.46.33(2).png

  3. MainTabBarController.swiftを作成し、Main.storyboardClassに割り当ててください。

MainTabBarController.swift
class MainTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // 各画面となるViewControllerを格納する変数を用意
        var viewControllers = [UIViewController]()

        // それぞれの画面の設定(tabの画像など)
        let tab1VC = UIStoryboard(name: "Bookmarks", bundle: nil).instantiateInitialViewController()
        tab1VC?.tabBarItem = UITabBarItem(tabBarSystemItem: .bookmarks, tag: 0)
        viewControllers.append(tab1VC!)

        let tab2VC = UIStoryboard(name: "Favorites", bundle: nil).instantiateInitialViewController()
        tab2VC?.tabBarItem = UITabBarItem(tabBarSystemItem: .favorites, tag: 0)
        viewControllers.append(tab2VC!)

        self.setViewControllers(viewControllers, animated: false)
    }
}

2. 各画面となるViewControllerの用意

  • 上記のtab1VCBookmarks.storyboardtab2VCFavorites.storyboardとして用意します。それぞれUINavigationControllerを設定し、見分けがつくようにタイトルを付けます。 スクリーンショット 2020-11-08 2.12.25(2).png

3. XLPagerTabStripを導入

  • CocoaPodsを利用します。
  1. ターミナルを開いてcd 対象ファイルで移動します。
  2. pod initpodfile作成
  3. podfileに下記を追加し保存して、pod installにて完了です。
podfile.rb
pod 'XLPagerTabStrip'

4. 管理元クラスButtonBarPagerTabStripViewControllerの用意

  • ViewControllerたちを管理するButtonBarPagerTabStripViewControllerを継承したクラスを用意します。今回はBookmarksを管理元とします。BookmarksViewController.swiftを作成します。
BookmarksViewController.swift
import UIKit
import XLPagerTabStrip

// 継承元を書き換える ( UIViewController → ButtonBarPagerTabStripViewController )
class BookmarksViewController: ButtonBarPagerTabStripViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] {
        //管理されるViewControllerを返す処理
        let firstVC = UIStoryboard(name: "First", bundle: nil).instantiateViewController(withIdentifier: "First")
        let secondVC = UIStoryboard(name: "Second", bundle: nil).instantiateViewController(withIdentifier: "Second")
        let thirdVC = UIStoryboard(name: "Third", bundle: nil).instantiateViewController(withIdentifier: "Third")
        let childViewControllers:[UIViewController] = [firstVC, secondVC, thirdVC]
        return childViewControllers
    }

}

1. ボタン部分になるCollection Viewの設置

  • ボタン部分になるCollection Viewを配置し、下記画像のようにAutoLayoutを設定します。Cellは消しておきましょう。
  • Collection ViewのクラスをButtonBarViewと結びつけ、ModuleをXLPagerTabStripとします。
    スクリーンショット 2020-11-08 2.33.16(2).png

  • Collection Viewを右クリックします。Referencing OutletsNew Referencing OutletViewControllerにドラッグし、ButtonBarViewを選択します。
    スクリーンショット 2020-11-08 3.15.15(2).png

2. 切り替え部分になるScrollViewの設置

  • 切り替え部分になるScrollViewを配置し、下記画像のようにAutoLayoutを設定します。
  • あいまいなレイアウトと警告がでるのでContent Layout Guidesのチェックを外しましょう。

スクリーンショット 2020-11-08 2.35.37(2).png

  • ScrollViewを右クリックします。Referencing OutletsNew Referencing OutletViewControllerにドラッグし、containerViewを選択します。
    スクリーンショット 2020-11-08 2.54.55(2).png

  • 正しく繋ぐことができると、ScrollViewの表示がContainerViewに変わります。

5. 管理されるViewControllerたちの用意

  • スワイプやボタンを押されて遷移するViewControllerになります。
  • IndicatorInfoProviderプロトコルを実装したUIViewControllerを下記3つそれぞれ用意します。
  1. First.storyboardFirstViewControllerを用意。( storyboardの背景色は赤色
  2. Second.storyboardSecondViewControllerを用意。( storyboardの背景色は青色
  3. Third.storyboardThirdViewControllerを用意。( storyboardの背景色は緑色
FirstViewController.swift
import UIKit
import XLPagerTabStrip

class FirstViewController: UIViewController {

    //ここがボタンのタイトルに利用されます
    var itemInfo: IndicatorInfo = "First"

    override func viewDidLoad() {
        super.viewDidLoad()
    }

}

extension FirstViewController: IndicatorInfoProvider {
    func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo {
        return itemInfo
    }
}
  • Labelを配置し、TextFirstFont24AutoLayoutの設定をします。
    スクリーンショット 2020-11-08 2.59.11(2).png

  • Classの割り当てと、Storyboard IDを設定します。
    スクリーンショット 2020-11-08 3.13.26(2).png

6. buttonBarの見た目と振る舞いを追加

MainTabBarController.swift
import UIKit
import XLPagerTabStrip

class BookmarksViewController: ButtonBarPagerTabStripViewController {

    override func viewDidLoad() {
        // 画面UIについての処理
        setupUI()
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // 強制的に再選択し、changeCurrentIndexProgressiveを動作させる( 0番目 → 1番目 → 0番目 )
        moveToViewController(at: 1, animated: false)
        moveToViewController(at: 0, animated: false)
    }

    func setupUI() {
        // ButtonBar全体の背景色
        settings.style.buttonBarBackgroundColor = UIColor.white
        // ButtonBarItemの背景色
        settings.style.buttonBarItemBackgroundColor = UIColor.white
        // ButtonBarItemの文字色
        settings.style.buttonBarItemTitleColor = UIColor.lightGray
        // ButtonBarItemのフォントサイズ
        settings.style.buttonBarItemFont = .boldSystemFont(ofSize: 14)
        // 選択中のButtonBarインジケーターの色
        settings.style.selectedBarBackgroundColor = UIColor.black
        // 選択中のButtonBarインジケーターの太さ
        settings.style.selectedBarHeight = 2.0
        // ButtonBarの左端の余白
        settings.style.buttonBarLeftContentInset = 8
        // ButtonBarの右端の余白
        settings.style.buttonBarRightContentInset = 8
        // Button内の余白
        settings.style.buttonBarItemLeftRightMargin = 32
        // スワイプやButtonBarItemタップ等でページを切り替えた時の動作
        changeCurrentIndexProgressive = { oldCell, newCell, progressPercentage, changeCurrentIndex, animated in
            // 変更されたか、選択前後のCellをアンラップ
            guard changeCurrentIndex, let oldCell = oldCell, let newCell = newCell else { return }
            // 選択前のセルの状態を指定
            oldCell.label.textColor = UIColor.lightGray
            // 選択後のセルの状態を指定する
            newCell.label.textColor = UIColor.black
        }
    }

    override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] {
        //管理されるViewControllerを返す処理
        let firstVC = UIStoryboard(name: "First", bundle: nil).instantiateViewController(withIdentifier: "First")
        let secondVC = UIStoryboard(name: "Second", bundle: nil).instantiateViewController(withIdentifier: "Second")
        let thirdVC = UIStoryboard(name: "Third", bundle: nil).instantiateViewController(withIdentifier: "Third")
        let childViewControllers:[UIViewController] = [firstVC, secondVC, thirdVC]
        return childViewControllers
    }

}

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

新規に開発する iOS アプリで対応すべき OS のバージョンを検討した結果

はじめに

今後、新規に開発する iOS アプリで対応すべき OS のバージョンを検討する機会があったので、その結果を共有します。

結論

  • 現在の最新の OS バージョンとそれの一つ前のメジャーバージョンを対応までを対応するのがコスパがいい
  • ただし、iOS 13,14 以上を対象とするアプリであったとしても iPhone SE(第一世代) の考慮は必要

検討するのに用いた情報

以下の情報を用いました。

  • iOS/Android のシェア率
  • iOS(Android)の中 OS のシェア率
  • iOS(Android)の中のデバイスのシェア率
  • デバイスと対応する iOS の対応表
  • デバイスと解像度の対応表

それぞれの情報の引用元は、以下の表の参照先のサイトになります。

必要な情報 参照先
iOS/Android のシェア率 StatCounter
iOS(Android)の中 OS のシェア率 スマタブ info
iOS(Android)の中のデバイスのシェア率 DeviceAtlas
デバイスと対応する iOS の対応表 iOSデバイス一覧表
デバイスと解像度の対応表 iOSデバイス一覧表

また、存在するデータがあるのかはわかりませんが、作るアプリによっては以下のような情報もあると対応するOS/デバイスの選定に役に立つかもしれません。

  • 年代別のOS/デバイスのシェア率
  • 男女別のOS/デバイスのシェア率

デバイスと対応する iOS の対応表

あとで考察するのに使用します。

【参照元】
iOSデバイス一覧表

対応可能な iOS デバイス 備考
〜10 iPhone 5、iPhone 5c -
〜11,12 iPhone 5s、iPhone 6、iPhone 6 Plus iOS 11 に対応しているデバイスはすべて iOS 12 に対応している
〜13,14 iPhone SE(第一世代)、iPhone 6s 以降のデバイス iOS 13 に対応しているデバイスはすべて iOS 14 に対応している

【悲報】iPhone SE(第一世代)が iOS 14 に対応している件

解像度 と デバイス の対応表

あとで考察するのに使用します。

【参照元】
iOSデバイス一覧表

解像度 デバイス
640 x 1136 iPhone 5、iPhone 5c、iPhone 5s、iPhone SE(第一世代)
750 x 1334 iPhone 6、iPhone 6s、iPhone 7、iPhone 8、iPhone SE (第二世代)
それ以上 その他(xxx Plus や iPhone X 以上)

どのバージョンまで対応するべき?

すでにリリースされているアプリの調査

まず、2020年11月現在、リリースされているアプリの対応しているアプリを調べてみました。

iPhone で「App Store」>「適当なアプリ選択」>「情報」>「互換性 - この iPhone に対応」から対応している OS を確認できます。

(YouTube アプリの例)

10 分ほど個人的によく使っているアプリの対応されているバージョンを調べてみた結果が以下になります。(2020年11月調べ)
※感覚のデータになります

バージョン 対応されているアプリ
iOS 9 以上対応 超安定思考のアプリ(金融系)
iOS 10 以上対応 安定思考のアプリ(クーポン系)
iOS 11 以上対応 普通のアプリ(一般系)
iOS 12 以上対応 攻めてるアプリ(SNS系)
iOS 13 以上対応 見つかりませんでした。

数の多い順にならべると iOS 11 以上対応 > iOS 10 以上対応 > iOS 12 以上対応 = iOS 9 以上対応 という感覚でした。

初期リリースの時期によるのでしょうけど、思ったより iOS 12 以上対応 というアプリはリリースされていないみたいです。

iPhone SE (第一世代) について

iPhone SE(第一世代)が iOS 13,14 まで対応していることが確定しており、iOS 13,14 対応のアプリでは解像度 640 x 1136 のデバイスサイズでの動きを考慮しなければなりません。

解像度の低い端末では1行に入りきる文字数が少ないため、iPhone SE(第一世代) だけで文字が入りきらない場合、(1) 文末を「...」にする or (2) 改行をする or (3) 文字サイズを変更する など、開発時に考慮が必要になります。

ちなみに解像度 640 x 1136 で iOS 13,14 に対応しているのは iPhone SE(第一世代)のみです。

DeviceAtlas調べでは日本での 2019 年の iPhone SE(第一世代)のシェア率は 3.54%(前年比 -0.73%)であり、2020 年ではこれよりも低いことが予想されます。
(※ このシェア率は Android 含めた全端末のシェア率)

もし、今後、iPhone SE(第一世代)のシェア率が極端に低くなれば、iOS 14 対応のアプリでも iPhone SE(第一世代)での挙動をどこまで保証するのかは検討する必要があると思います。

iPhone SE(第一世代)のデバイスシェア率に今後も注意が必要ですね。

今後、新規に開発するアプリで対応すべきバージョンは?

個人的には、攻めるなら iOS 13 以上、安定をとると iOS 12 以上だと思います。

理由は iOS 13 以上に対応すれば約 93 %、iOS 12 以上では約 98 % のユーザーに対応できるからです。(2020/09/30 時点でのスマタブ info 調べ )

ちなみに、iOS 11 以上対応しても救えるユーザーは 1.2% ほどしかいないようです。

また、iOS も1年に1度のペースでアップデートするので、早めに低いバージョンの OS を切っておかないと、どんどん開発対象の OS が増えていき、開発・運用の負荷がどんどん増えていきます。

古い OS 依存のバグの対応や、古い OS のテスト用の端末の維持や、古い OS でのテストのコストは馬鹿にならないです。

極端なイメージですが、対応する OS バージョンが1つ増えると、テストと開発のメンバーがそれぞれ 0.5〜1 人増えるイメージです。

もろもろ考えると、現在の最新のOSバージョンとそれの一つ前のメジャーバージョンを対応するのがコスパがいいのではないかと思います。

意外にも、日本のユーザーは頻繁に iOS のアップデートをしているみたいです。

技術的な観点

今回の検討では勉強不足で技術的な観点を持ち合わせておりません。

技術的な観点で iOS xx 以上の対応だと開発時に 楽 or 大変 などありましたら、ご教授いただけると助かります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UINibでDI

要約

UINib.OptionsKey.externalObjects を使ってDIします。

やり方

  • External Object用のクラスを用意する
  • External Object付きのXibファイルを作成する
  • instantiate(withOwner:options:)時にexternalObjectsキーでExternal Objectにオブジェクトを割り当てる

External Object用のクラスを用意する

今回は計算をさせたいので計算用オブジェクトを用意します。
これらのクラスは後ほど使います。

class CalcObject: NSObject {
    func calc(num1: Int, num2: Int) -> Int {
        fatalError()
    }

    var operaterText: String {
        fatalError()
    }
}

class AdditionObject: CalcObject {
    override func calc(num1: Int, num2: Int) -> Int {
        num1 + num2
    }

    override var operaterText: String {
        "+"
    }
}

class MultiplicationObject: CalcObject {
    override func calc(num1: Int, num2: Int) -> Int {
        num1 * num2
    }

    override var operaterText: String {
        "×"
    }
}

External Object付きのXibファイルを作成する

まず、xibファイルを作成し、Interface Builderを開き、Object Libraryより External Object を追加します。
スクリーンショット 2020-11-08 14.38.59.png

追加したらExternal Objectのインスペクタより設定を行います。
- Identifier → 今回はCalcObjectにします
- Class → 先ほど作成したクラスCalcObjectにします

スクリーンショット 2020-11-08 15.12.26.png

ついでにFile's Ownerも実装しておきます。
File's Ownerは、先ほどのExternal Objectと計算結果を表示するラベル、ボタンのアクションが認識できるよう、IBOutletやIBActionを設定しておきます。

class NibOwner: NSObject {
    @IBOutlet var calcObject: CalcObject!
    @IBOutlet weak var label: UILabel!
    @IBInspectable var num1: Int = 0
    @IBInspectable var num2: Int = 0

    @IBAction func calc() {
        label.text = "\(num1) \(calcObject.operaterText) \(num2) = \(calcObject.calc(num1: num1, num2: num2))"
    }
}

instantiate(withOwner:options:)時にexternalObjectsキーでExternal Objectにオブジェクトを割り当てる

先ほど作成したxibファイルをコードから使います。
xibを使うときに、instantiate(withOwner:options:)でインスタンス化しますが、その時のoptionsに. externalObjectsを付与します。
External ObjectのIdentifierをキーにして、実際にExternal Objectとして割り当てたいオブジェクトをvalueとします。
CalcObject() の部分をAdditionObjectMultiplicationObjectに差し替えると動作を変えることができます。
以下は画面にxibの内容を反映させるコードの例です。

class ViewController: UIViewController {
    @IBOutlet weak var stackView: UIStackView!
    let nibOwner = NibOwner()

    override func viewDidLoad() {
        super.viewDidLoad()
        let nib = UINib(nibName: "View", bundle: nil)
        let externalObjects = ["CalcObject" : CalcObject()] // ここのオブジェクトを差し替える
        let instance = nib.instantiate(withOwner: nibOwner,
                                       options: [.externalObjects : externalObjects])
        instance.compactMap { $0 as? UIView }.forEach {
            self.stackView.addArrangedSubview($0)
        }
    }
}

実際の動作

AdditionObjectの場合

Simulator Screen Shot - iPod touch (7th generation) - 2020-11-08 at 15.28.25.png

MultiplicationObjectの場合

Simulator Screen Shot - iPod touch (7th generation) - 2020-11-08 at 15.28.45.png

まとめ

つかおう!DI!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【React Native】生成したreact-nativeプロジェクトがiOSで起動できなかった件

はじめに

React Nativeを試してみようとインストールしてみたものの、生成したreact-nativeプロジェクトがiOSで正しく動かなかったので、その対処メモ。

実行環境

  • Xcode 12.1
  • Android Sudio 3.2.1
  • macOS Catalina(10.15.7)

React Nativeのインストール

環境設定は、記事に日付も新しいのでこちらのサイトを参考にしながら行いました。

※私の環境には、Homebrew、Nodejs、Xcode、Cocoapods、Android Studioは導入済みなのでインストールしていません。

1.Watchmanのインストール

brew install watchman

2.React Native CLIのインストール

npm install -g react-native-cli

3.JDK(Java Development Kit)のインストール

brew tap AdoptOpenJDK/openjdk
brew cask install adoptopenjdk8

iOSシミュレーターで正しくアプリが起動しない

セットアップが終わったので、iOSアプリを起動してみます。

cd SampleApp
npm run ios

simulatorが起動し、アプリがロードされて。。。
と、参考サイトとは違い、こちらのサイトのような赤い画面にエラーが。メッセージはURL以降は違っててこんな感じ。

Simulator Screen Shot - iPhone 11 - 2020-11-08 at 12.24.58.png

で、アプリ起動時のコンソールを見てみると、watchmanで以下のようなメッセージが出てました。

020-11-01T21:54:49,874: [0x11ce00dc0] while computing sockname: failed to create /usr/local/var/run/watchman/c_geru-state: No such file or directory

Watchman:  watchman --no-pretty get-sockname returned with exit code=1, signal=null, stderr= 2020-11-01T21:54:49,874: [0x11ce00dc0] while computing sockname: failed to create /usr/local/var/run/watchman/c_geru-state: No such file or directory

色々調べてみると、こちらのサイトによれば、High Sierraから/usr/local の権限変更が出来なくなったらしい。試してみると、確かにターミナルでも、Finderでも権限がないと怒られて変更できない。

遡ってインストール時のログを確認すると、Watchmanのインストール時に同じ「No such file or directory」のログが表示されていました。おそらくWatchmanインストール/起動時に必要なディレクトリが生成できず、アプリが正常に起動できなかったようです。

同じサイトによれば「/usrl/local/以下のディレクトリでは権限変更、作成が出来る」と書かれていたので、/usr/local/var/ のadminの権限を読み/書きに変更しました。

スクリーンショット 2020-11-08 12.30.59.png

無事プロジェクトが表示されました!

Simulator Screen Shot - iPhone 11 - 2020-11-08 at 12.23.24.png

Androidでの起動

Androidは、事前にシミュレーターを起動する必要があるとのことで、「Android Studioの起動画面右下の「Configure」>「AVD Manager」を選択して...」と書かれているんだけど、AVD Managerが見当たらない。

スクリーンショット 2020-11-08 12.14.13.png
スクリーンショット 2020-11-08 12.14.06.png

いろいろ調べてみたけど、なぜ表示されていないのかわからず...。

起動画面の「Start a new Android Studio project」 から新規プロジェクトを生成してみると、AVD Manager自体はインストールされていたので、ここから起動してシミュレーターを立ち上げてから

npm run android

で無事起動しました。

まとめ

/usr/local の権限は意外な落とし穴でした。同じようなトラブルが出てる方の参考になれば。

以下、参考リンクです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iOS/Android の OS のシェア率を比較するのに StatCounter がめちゃくちゃく便利な件

はじめに

StatCounter
Tracks the Usage Share of Search Engines, Browsers and Operating Systems including Mobile from over 10 billion monthly page views.

StatCounter は モバイルを含む、検索エンジン、ブラウザ、OSの使用シェアの統計データを集計するサイトのことです。

iOS/Android の OS のシェア率の比較などを確認するときに、操作が直感的でとても役にたったので共有します。

よく使いそうなグラフをサンプルとして添付します。(2020-11-08現在)

使い方

「Edit Chart Date」 をクリックする。

スクリーンショット 2020-11-08 11.43.25.png

「Statistic」、「Region」、「Chart Type」、「Period」を設定して、「View Chart」をクリックする。

スクリーンショット 2020-11-08 11.46.57.png

グラフが表示される。

スクリーンショット 2020-11-08 12.01.11.png

以上。

サンプル

現在の iOS/Android のシェア率 棒グラフ (日本)

ivsA_Japan.png

現在の iOS/Android のシェア率 棒グラフ (世界)

ivsA_World.png

現在の iOS/Android のシェア率 世界地図

ivsA_World_map.png

過去10年の iOS/Android のシェア率 棒グラフ (日本)

ivsA_World_Japan_line.png

現在の iOS のシェア率 棒グラフ (日本)

iOS_bar.png

過去1年間の iOS のシェア率 線グラフ (日本)

iOS_line.png

グラフからわかること

  • iOS VS Android
    • iOS の方がシェア率が高いのは日本、オーストラリア、アメリカ、カナダ、ヨーロッパの一部ぐらい。
    • 世界の平均に比べて日本の iOS 支持率が異常に高い
    • しかし、2019年から日本の Android 支持率が上がってきている傾向
  • iOS の中の OS シェア率
    • 日本では月単位でグラフが上下するほど iOS は頻繁にアップデートされている

ちょっとおしいところ

  • メジャーバージョン単位での iOS シェア率がわからない
    • マイナーバージョン含めてのシェア率はわかるが、 iOS 12 vs iOS 13 vs iOS 14 のようなシェア率はわからない
  • 細かいデバイス別のシェア率がわからない
    • 例えば Apple vs Samsung vs Huawei ようなシェア率はわかるが、Apple の中の iPhone SE vs iPhone 8 のようなシェア率はわからない
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iOS/Android の OS のシェア率を比較するのに StatCounter というサイトがかなり便利な件

はじめに

StatCounter
Tracks the Usage Share of Search Engines, Browsers and Operating Systems including Mobile from over 10 billion monthly page views.

StatCounter は モバイルを含む、検索エンジン、ブラウザ、OSの使用シェアの統計データを集計するサイトのことです。

iOS/Android の OS のシェア率の比較などを確認するときに、操作が直感的でとても役にたったので共有します。

よく使いそうなグラフをサンプルとして添付します。(2020/11/08のデータ)

使い方

「Edit Chart Date」 をクリックする。

スクリーンショット 2020-11-08 11.43.25.png

「Statistic」、「Region」、「Chart Type」、「Period」を設定して、「View Chart」をクリックする。

スクリーンショット 2020-11-08 11.46.57.png

グラフが表示される。

スクリーンショット 2020-11-08 12.01.11.png

以上。

サンプル (2020/11/08)

現在の iOS/Android のシェア率 棒グラフ (日本)

ivsA_Japan.png

現在の iOS/Android のシェア率 棒グラフ (世界)

ivsA_World.png

現在の iOS/Android のシェア率 世界地図

ivsA_World_map.png

過去10年の iOS/Android のシェア率 棒グラフ (日本)

ivsA_World_Japan_line.png

現在の iOS のシェア率 棒グラフ (日本)

iOS_bar.png

過去1年間の iOS のシェア率 線グラフ (日本)

iOS_line.png

グラフからわかること

  • iOS VS Android
    • iOS の方がシェア率が高いのは日本、オーストラリア、アメリカ、カナダ、ヨーロッパの一部ぐらい。
    • 世界の平均に比べて日本の iOS 支持率が異常に高い
    • しかし、2019年から日本の Android 支持率が上がってきている傾向
  • iOS の中の OS シェア率
    • 日本では月単位でグラフが上下するほど iOS は頻繁にアップデートされている

ちょっとおしいところ

  • メジャーバージョン単位での iOS シェア率がわからない
    • マイナーバージョンでの iOS シェア率はわかるが、 iOS 12 vs iOS 13 vs iOS 14 のようなメジャーバージョンでのシェア率はわからない
  • デバイス別のシェア率がわからない
    • 例えば Apple vs Samsung vs Huawei ようなシェア率はわかるが、Apple の中の iPhone SE vs iPhone 8 のようなシェア率はわからない

足りないデータを補うサイト

上記のおしいところを補うサイトを探しました。

メジャーバージョン単位での iOS シェア率 (by スマタブinfo)

日本のメジャーバージョンごとの iOS のシェア率は以下のサイトで確認できます。2ヶ月に一回ほど更新されているそうです。
「Home > OS」 - スマタブinfo
スクリーンショット 2020-11-08 13.48.39.png

デバイス別のシェア率 (by DeciceAtlas)

以下のサイトで日本での2019年のデバイスシェア率が確認できます。
残念ながら、データが古く(2019年)、また、ここで表すシェア率は Android 端末含めたすべてのデバイスの中でのシェア率のため、iPhone 端末のみの比較には使用できなので注意が必要です。

「The most popular smartphones in 2019」 - DeviceAtlas

スクリーンショット 2020-11-08 13.49.17.png

他にも探してみましたが、最新の iPhone 端末のシェア率のデータは見つけられませんでした。
もし、ご存知の方がいましたら、ご教授のほどよろしくお願いいたします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Swift5]"lottie-ios"を使ってアニメーションを実装する方法

lottie-iosとは?

Lottie(ロッティー)は、Airbnbから登場したiOS、Android、React Native対応のアニメーションライブラリです。Adobe After Effectsで表示できるアニメーションをリアルタイムでレンダリングし、ネイティブアプリで静的なコンテンツを作るのと同じくらい簡単に面白い動きをするアニメーションを作成することができます。

▼詳しくはこちら
https://ferret-plus.com/6214

▼公式ページはこちら
https://airbnb.design/lottie/

実装環境

macOS Catalina 10.15.7
Xcode 12.1
Apple Swift version 5.3

今回はTestAppというプロジェクトで実装します。

導入の流れ

①CocoaPodsのインストールとインポート
②JSONファイルのダウンロード
③ダウンロードしたファイルを読み込んでコード記述

①CocoaPodsのインストールとインポート

必要とするPodsはpod 'lottie-ios'

Podfile.
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'TestApp' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

pod 'IBMWatsonToneAnalyzerV3', '~> 3.6.0'

  # Pods for TestApp

  target 'TestAppTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'TestAppUITests' do
    # Pods for testing
  end

  //ここをインストール
  pod 'lottie-ios'

end

pod installが完了したらプロジェクトへimportします。

②JSONファイルのダウンロード

それではLottieのアニメーション検索ページへ移動してお気に入りのアニメーションをダウンロードしていきます。

▼検索ページ
https://lottiefiles.com/featured?page=1

お気に入りのアニメーションが決まったらクリックして下記のようなページを開きます。
image.png
右上にあるDownload JSONを選択し、Lottie JSONを選択してJSONファイルをダウンロードします。
image.png
ダウンロードが完了したらドラック&ドロップでプロジェクトファイル追に加します。
ドラックする場所はinfo.plistの上あたりでOKです。

③ダウンロードしたファイルを読み込んでコード記述

それではいよいよ実装です。

ViewController.swift
import UIKit
import Lottie //①でインポート済

class ViewController: UIViewController {

    //AnimationViewの宣言
    var animationView = AnimationView()

    override func viewDidLoad() {
        super.viewDidLoad()

        //アニメーションの呼び出し
        addAnimationView()
    }

    //アニメーションの準備
    func addAnimationView() {

        //アニメーションファイルの指定
        animationView = AnimationView(name: "38280-man-chilling-on-electric-scooter") //ここに先ほどダウンロードしたファイル名を記述(拡張子は必要なし)

        //アニメーションの位置指定(画面中央)
        animationView.frame = CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height)

        //アニメーションのアスペクト比を指定&ループで開始
        animationView.contentMode = .scaleAspectFit
        animationView.loopMode = .loop
        animationView.play()

        //ViewControllerに配置
        view.addSubview(animationView)
    }

動作確認

コードの記述を終えたら動作確認を行います。
下記画像のように画面中央にアニメーションが表示されていれば成功です!
image.png

最後に

今回行ったようにLottieを使えばクオリティの高いアニメーションを短いコードで実装できます。
他にもオシャレなアニメーションがたくさんあるので一度みてみても良いかもしれませんね!

最後までご覧いただきありがとうございます!
是非参考にしていただければと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む