20201013のSwiftに関する記事は3件です。

iOSアプリにYoutubeプレイヤーを組み込む

アプリにYoutubeプレイヤーを組み込んで制御できます。
IMG_1516.PNG

YoutubePlayer-in-WKWebViewというオープンソースライブラリをつかいます。

Youtube公式のドキュメントでは
youtube-ios-player-helperが使用されていますが、これは現在Apple非推奨となっているUIWebViewを使っていますので、この記事では推奨のWKWebViewにアップグレードされた上記ライブラリを使います。

手順

1、CocoaPods初期化

ターミナルからアプリのディレクトリに移動して下記実行。

pod init

2、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")

IMG_1515.PNG
デフォルトは全画面↑

再生パラメータ(playerVars)で viewの範囲内だけで表示するなど、いろいろコントロールできます。

PlayerView.load(withVideoId: "r8ZKMVIo8IE",
                playerVars: ["playsinline":1, // 全画面ではなくViewの範囲内で再生。
                             "playlist":["0SJHPnRY8YA"] // 最初の動画の後に自動再生されるプレイリスト。
                ])

IMG_1516.PNG
インライン再生↑

6、再生の制御

PlayerView.playVideo() // 再生
PlayerView.pauseVideo() // 一時停止
PlayerView.stopVideo() // 停止

7、デリゲートメソッド

このようなデリゲートメソッドがあります。
スクリーンショット 2020-10-13 13.28.27.png
再生時間に応じて呼ばれるメソッドや、再生画質の変化に応じて呼ばれるメソッドなどがあります。

例えば、Player表示後に自動で再生開始したい場合は、再生準備完了時に呼ばれるデリゲートメソッドを使います。

func playerViewDidBecomeReady(_ playerView: WKYTPlayerView) {
    PlayerView.playVideo()
}

?


お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLを使ったアプリを作っています。
機械学習関連の情報を発信しています。

Twitter
Medium

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

Swiftで使う修飾子の順番(SwiftLintを参照して)

はじめに

複数の修飾子のつくプロパティを書いているとき、

:thinking: 「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のルールの参照先

各修飾子の解説

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ですが、
初期化タイミングが不明瞭なため思わぬバグを引き起こすことがあります。

私見ではありますが、
プロジェクト内での利用タイミングの統一やコメントでの補足等しておく必要はあるかと思います。

参照先 【Swift4.1】lazyプロパティの使い所


lazyなプロパティは
不要なメモリの消費やパフォーマンスの低下を防ぐことができますが
使い方を誤ると
わかりづらい不具合を混ぜてしまう可能性があることがわかりました。

参照先 【Swift】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

参考サイト

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

Xcode12の実機起動時、"no code signature found."で失敗する問題の一時対処

事象

XCode12にアップグレードしてから、ビルドやシミュレータ起動は出来ても実機起動時に以下のコードを吐いて失敗する問題に悩まされていました。

No code signature found.
Domain: com.apple.dt.MobileDeviceErrorDomain
Code: -402620388
……

外部ライブラリSwiftyTesseractSwiftPackageManagerから導入した場合に発生しており、調べてみると、Firebaseライブラリなどでも同様の事象が発生しているらしい。

原因と解決方法

どうやら、導入している外部ライブラリがstaticの場合でも実機に転送し、そのバイナリのsignatureをチェックして失敗しているらしい。

参考URL

基本的にはXCode12のバグのようだが、上記参考URLの通りEdit SchemaBuildPost-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が修正されるまでの一時対処として、参考まで。

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