- 投稿日:2020-11-08T22:35:18+09:00
【Swift】ミュージックライブラリから曲を再生する方法
ミュージックライブラリを使用する方法
ミュージックライブラリを使用する場合、ミュージックライブラリへのアクセスを許可させる必要があります。
info.plistPrivacy - 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
- 投稿日:2020-11-08T20:22:24+09:00
【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-08T19:45:21+09:00
【Swift5】TabBarControllerを用いたXLPagerTabStripの実装
はじめに
XLPagerTabStripというSwift製のiOSライブラリを使った際に、
TabBarController
と絡めた実装をしました。storyboard
での設定等で少し詰まったりもしましたので、備忘録として投稿します。動作環境
【Xcode】Version 12.0.1
【Swift】Version 5.3
【CocoaPods】version 1.9.3実装後の画面
実装手順
1.
TabBarController
の用意
Main.storyboard
の元々あるViewController
を削除して、TabBarController
を追加します。付属のViewController
も消しておいてください。(storyboard
1つに対してViewController
1つとする理由です。)
MainTabBarController.swift
を作成し、Main.storyboard
のClass
に割り当ててください。MainTabBarController.swiftclass 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
の用意
- 上記の
tab1VC
をBookmarks.storyboard
、tab2VC
をFavorites.storyboard
として用意します。それぞれUINavigationController
を設定し、見分けがつくようにタイトルを付けます。3.
XLPagerTabStrip
を導入
- CocoaPodsを利用します。
- ターミナルを開いて
cd 対象ファイル
で移動します。pod init
でpodfile
作成podfile
に下記を追加し保存して、pod install
にて完了です。podfile.rbpod 'XLPagerTabStrip'4. 管理元クラス
ButtonBarPagerTabStripViewController
の用意
ViewController
たちを管理するButtonBarPagerTabStripViewController
を継承したクラスを用意します。今回はBookmarks
を管理元とします。BookmarksViewController.swift
を作成します。BookmarksViewController.swiftimport 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
とします。
Collection View
を右クリックします。Referencing Outlets
のNew Referencing Outlet
をViewController
にドラッグし、ButtonBarView
を選択します。
2. 切り替え部分になる
ScrollView
の設置
- 切り替え部分になる
ScrollView
を配置し、下記画像のようにAutoLayout
を設定します。- あいまいなレイアウトと警告がでるので
Content Layout Guides
のチェックを外しましょう。
ScrollView
を右クリックします。Referencing Outlets
のNew Referencing Outlet
をViewController
にドラッグし、containerView
を選択します。
正しく繋ぐことができると、
ScrollView
の表示がContainerView
に変わります。5. 管理される
ViewController
たちの用意
- スワイプやボタンを押されて遷移する
ViewController
になります。IndicatorInfoProvider
プロトコルを実装したUIViewController
を下記3つそれぞれ用意します。
First.storyboard
、FirstViewController
を用意。(storyboard
の背景色は赤色
)Second.storyboard
、SecondViewController
を用意。(storyboard
の背景色は青色
)Third.storyboard
、ThirdViewController
を用意。(storyboard
の背景色は緑色
)FirstViewController.swiftimport 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 } }6. buttonBarの見た目と振る舞いを追加
MainTabBarController.swiftimport 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 } }参考
- 投稿日:2020-11-08T15:50:29+09:00
新規に開発する 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 を確認できます。
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 大変 などありましたら、ご教授いただけると助かります。
- 投稿日:2020-11-08T15:36:29+09:00
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
を追加します。
追加したらExternal Objectのインスペクタより設定を行います。
- Identifier → 今回はCalcObject
にします
- Class → 先ほど作成したクラスCalcObject
にしますついでに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()
の部分をAdditionObject
やMultiplicationObject
に差し替えると動作を変えることができます。
以下は画面に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の場合
MultiplicationObjectの場合
まとめ
つかおう!DI!
- 投稿日:2020-11-08T13:06:35+09:00
【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 watchman2.React Native CLIのインストール
npm install -g react-native-cli3.JDK(Java Development Kit)のインストール
brew tap AdoptOpenJDK/openjdkbrew cask install adoptopenjdk8iOSシミュレーターで正しくアプリが起動しない
セットアップが終わったので、iOSアプリを起動してみます。
cd SampleApp npm run iossimulatorが起動し、アプリがロードされて。。。
と、参考サイトとは違い、こちらのサイトのような赤い画面にエラーが。メッセージはURL以降は違っててこんな感じ。で、アプリ起動時のコンソールを見てみると、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の権限を読み/書きに変更しました。
無事プロジェクトが表示されました!
Androidでの起動
Androidは、事前にシミュレーターを起動する必要があるとのことで、「Android Studioの起動画面右下の「Configure」>「AVD Manager」を選択して...」と書かれているんだけど、AVD Managerが見当たらない。
いろいろ調べてみたけど、なぜ表示されていないのかわからず...。
起動画面の「Start a new Android Studio project」 から新規プロジェクトを生成してみると、AVD Manager自体はインストールされていたので、ここから起動してシミュレーターを立ち上げてから
npm run androidで無事起動しました。
まとめ
/usr/local の権限は意外な落とし穴でした。同じようなトラブルが出てる方の参考になれば。
以下、参考リンクです。
- 投稿日:2020-11-08T12:20:43+09:00
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」 をクリックする。
「Statistic」、「Region」、「Chart Type」、「Period」を設定して、「View Chart」をクリックする。
グラフが表示される。
以上。
サンプル
現在の iOS/Android のシェア率 棒グラフ (日本)
現在の iOS/Android のシェア率 棒グラフ (世界)
現在の iOS/Android のシェア率 世界地図
過去10年の iOS/Android のシェア率 棒グラフ (日本)
現在の iOS のシェア率 棒グラフ (日本)
過去1年間の iOS のシェア率 線グラフ (日本)
グラフからわかること
- 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 のようなシェア率はわからない
- 投稿日:2020-11-08T12:20:43+09:00
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」 をクリックする。
「Statistic」、「Region」、「Chart Type」、「Period」を設定して、「View Chart」をクリックする。
グラフが表示される。
以上。
サンプル (2020/11/08)
現在の iOS/Android のシェア率 棒グラフ (日本)
現在の iOS/Android のシェア率 棒グラフ (世界)
現在の iOS/Android のシェア率 世界地図
過去10年の iOS/Android のシェア率 棒グラフ (日本)
現在の iOS のシェア率 棒グラフ (日本)
過去1年間の iOS のシェア率 線グラフ (日本)
グラフからわかること
- 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
デバイス別のシェア率 (by DeciceAtlas)
以下のサイトで日本での2019年のデバイスシェア率が確認できます。
残念ながら、データが古く(2019年)、また、ここで表すシェア率は Android 端末含めたすべてのデバイスの中でのシェア率のため、iPhone 端末のみの比較には使用できなので注意が必要です。・「The most popular smartphones in 2019」 - DeviceAtlas
他にも探してみましたが、最新の iPhone 端末のシェア率のデータは見つけられませんでした。
もし、ご存知の方がいましたら、ご教授のほどよろしくお願いいたします。
- 投稿日:2020-11-08T10:58:27+09:00
[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お気に入りのアニメーションが決まったらクリックして下記のようなページを開きます。
右上にあるDownload JSONを選択し、Lottie JSONを選択してJSONファイルをダウンロードします。
ダウンロードが完了したらドラック&ドロップでプロジェクトファイル追に加します。
ドラックする場所はinfo.plist
の上あたりでOKです。③ダウンロードしたファイルを読み込んでコード記述
それではいよいよ実装です。
ViewController.swiftimport 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) }動作確認
コードの記述を終えたら動作確認を行います。
下記画像のように画面中央にアニメーションが表示されていれば成功です!
最後に
今回行ったようにLottieを使えばクオリティの高いアニメーションを短いコードで実装できます。
他にもオシャレなアニメーションがたくさんあるので一度みてみても良いかもしれませんね!最後までご覧いただきありがとうございます!
是非参考にしていただければと思います。