- 投稿日:2020-10-13T21:03:24+09:00
iOSアプリにYoutubeプレイヤーを組み込む
YoutubePlayer-in-WKWebViewというオープンソースライブラリをつかいます。
Youtube公式のドキュメントでは
youtube-ios-player-helperが使用されていますが、これは現在Apple非推奨となっているUIWebViewを使っていますので、この記事では推奨のWKWebViewにアップグレードされた上記ライブラリを使います。手順
1、CocoaPods初期化
ターミナルからアプリのディレクトリに移動して下記実行。
pod init2、YoutubePlayer-in-WKWebViewをCocoaPodsでインストール
アプリのディレクトリでPodfileを開いて下記を追記。
# Pods for YourProject pod "YoutubePlayer-in-WKWebView", "~> 0.3.0"ターミナルから下記実行。
pod install
3、PlayerViewを設置
ストーリーボードから取り付ける場合は、UIViewを置いて、カスタムクラスでWKYTPlayerViewを選びます。
@IBOutlet weak var PlayerView: WKYTPlayerView!4、インポートとデリゲート設定
import YoutubePlayer_in_WKWebView class ViewController: UIViewController,WKYTPlayerViewDelegate { override func viewDidLoad() { super.viewDidLoad() YTPlayerView.delegate = self } }5、再生
playerView.loadWithVideoId("r8ZKMVIo8IE")再生パラメータ(playerVars)で viewの範囲内だけで表示するなど、いろいろコントロールできます。
PlayerView.load(withVideoId: "r8ZKMVIo8IE", playerVars: ["playsinline":1, // 全画面ではなくViewの範囲内で再生。 "playlist":["0SJHPnRY8YA"] // 最初の動画の後に自動再生されるプレイリスト。 ])6、再生の制御
PlayerView.playVideo() // 再生 PlayerView.pauseVideo() // 一時停止 PlayerView.stopVideo() // 停止7、デリゲートメソッド
このようなデリゲートメソッドがあります。
再生時間に応じて呼ばれるメソッドや、再生画質の変化に応じて呼ばれるメソッドなどがあります。例えば、Player表示後に自動で再生開始したい場合は、再生準備完了時に呼ばれるデリゲートメソッドを使います。
func playerViewDidBecomeReady(_ playerView: WKYTPlayerView) { PlayerView.playVideo() }?
お仕事のご相談こちらまで
rockyshikoku@gmail.comCore MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。
- 投稿日:2020-10-13T07:25:54+09:00
Swiftで使う修飾子の順番(SwiftLintを参照して)
はじめに
複数の修飾子のつくプロパティを書いているとき、
「dynamic と public と @objc ってどの順番にすべきなんだっけ?」
とか思っていたら、SwiftLintに参考になるものがあったので、まとめます。
結論(SwiftLintとしての推奨)
推奨順序
- [override, acl, setterACL, dynamic, mutators, lazy, final, required, convenience, typeMethods, owned]
例
@objc public private(set) dynamic weak var foo: Bar?public class Foo: Bar { override public final class var foo: String { return "bar" } }SwiftLintのルールの参照先
- SwiftLintFramework Reference > modifier_order Reference
- Modifier Order
- ルールの意味
- 修飾子の順番は一貫すべき。
- デフォルトで無効
各修飾子の解説
ACL
- Access Control Level のこと
- open
- public
- internal(デフォルト)
- fileprivate
- private
setterACL
- セッターに対応するゲッターよりも低いアクセスレベルを指定して、その変数、プロパティ、または添え字の読み取り/書き込みスコープを制限するために使うもの。
- fileprivate(set)
- private(set)
- internal(set) など。
- 例
public struct TrackedString { public private(set) var numberOfEdits = 0 public var value: String = "" { didSet { numberOfEdits += 1 } } public init() {} }dynamic
- Objective-Cのランタイムを用いるために使う。@objc を使うときにはdynamicキーワードが必要。
- RealmSwiftを使うときには頻出。
mutators
- 多分mutating キーワードのこと。
- Swiftでは、特に要求しない限り、プロパティを変更するメソッドを記述できない。
- メソッドの中でプロパティを変更したいときは、mutating キーワードを使ってマークする必要がある。
- 例
struct Person { var name: String mutating func makeAnonymous() { name = "Anonymous" } }
- 呼び出し方
var person = Person(name: "Ed") person.makeAnonymous()lazy
- 参照された時に初めて初期値が設定されるプロパティ。
- 不要なメモリの消費やパフォーマンスの低下を防ぐことができる。
- ただ、もし使うときは気を付ける。いくつか記事見ていると、安易に使うと不具合の元な感じが伝わってきた。
便利なlazyですが、
初期化タイミングが不明瞭なため思わぬバグを引き起こすことがあります。私見ではありますが、
プロジェクト内での利用タイミングの統一やコメントでの補足等しておく必要はあるかと思います。
lazyなプロパティは
不要なメモリの消費やパフォーマンスの低下を防ぐことができますが
使い方を誤ると
わかりづらい不具合を混ぜてしまう可能性があることがわかりました。final
override を防ぐ。
メソッド、プロパティ、subscript(添え字?)が override されることを防ぐ。
- final var
- final func
- final class func
- final subscript
クラスが継承されることを防ぐ。サブクラス化しようとすると、コンパイル時エラーになる。
- final class
required
- クラスの初期化子の前につけて、クラスの全てのサブクラスがその初期化子を実装する必要があることを示す。
- 例
class SomeClass { required init() { // initializer implementation goes here } } class SomeSubclass: SomeClass { required init() { // subclass implementation of the required initializer goes here } }convenience
- クラスの初期化子をサポートする。指定した初期化子を呼び出し、その初期化子のパラメーターの一部をデフォルト値に設定できる。
- 例
class Food { var name: String init(name: String) { self.name = name } convenience init() { self.init(name: "[Unnamed]") } }typemethod
- 例
class SomeClass { class func someTypeMethod() { // type method implementation goes here } } SomeClass.someTypeMethod()owned
- unowned
- weak
参考サイト
- Swift Document
- 投稿日:2020-10-13T06:57:36+09:00
Xcode12の実機起動時、"no code signature found."で失敗する問題の一時対処
事象
XCode12にアップグレードしてから、ビルドやシミュレータ起動は出来ても実機起動時に以下のコードを吐いて失敗する問題に悩まされていました。
No code signature found. Domain: com.apple.dt.MobileDeviceErrorDomain Code: -402620388 ……外部ライブラリSwiftyTesseractをSwiftPackageManagerから導入した場合に発生しており、調べてみると、Firebaseライブラリなどでも同様の事象が発生しているらしい。
原因と解決方法
どうやら、導入している外部ライブラリがstaticの場合でも実機に転送し、そのバイナリのsignatureをチェックして失敗しているらしい。
基本的にはXCode12のバグのようだが、上記参考URLの通りEdit Schema→Build→Post-actionsに、以下のRun Scriptを追加することで一時対処可能。
なお、除去するFrameworksは導入しているライブラリにあわせてください
- Shell
/bin/sh
- Provide build settings from
- 対象のアプリ
- 内容
# Type a script or drag a script file from your workspace to insert its path. rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/libtesseract.framework" rm -rf "${TARGET_BUILD_DIR}/${TARGET_NAME}.app/Frameworks/SwiftyTesseract.framework"XCode12が修正されるまでの一時対処として、参考まで。