タグ:Xcode

環境


Swift 4.1
Xcode 9.3.1

下記のコードをどこか適当な.swiftファイルに書いておけば良い。
 
import Foundation

#if !DEBUG
func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
    // なにもしない
}
#endif

Edit Schemeから「Build Configuration」を"Debug"から"Release"に変更して実行してみるとログが出力されない事を確認できる。
スクリーンショット 2018-05-17 20.42.38





環境


Swift 4.0.2
iOS 11.1.2
Xcode 9.1




アプリ側でスクリーンショットは阻止できない


残念ながら、現状ではアプリ側でスクリーンショットを阻止する事はできない様です。
Androidだと出来る様ですが、iOSの場合スクリーンショットを撮った後の通知しか取得できない為、スクリーンショットの直前に画面を黒くする等の実装もできません。
何故なんだろう...


スクリーンショット撮影後の通知は受け取れる


下記の様にすればスクリーンショットが撮影された直後の通知が受け取れます。
正直使い道が分かりませんが...。
スクリーンショットを元に画像を加工したい時とかに使うんですかね。
 
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Observerとして登録
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(self.didScreenshot),
                                               name: .UIApplicationUserDidTakeScreenshot,
                                               object: nil)
    }
    
    @objc func didScreenshot()
    {
        //スクリーンショットが取られた後に行いたい処理
    }

Observerとして登録する際の引数[name]にはNSNotificationName構造体に定義されているUIApplicationUserDidTakeScreenshotを指定しています。
Didとある様にスクリーンショットが取られた後の通知になります。
残念な事にUIApplicationUserWillTakeScreenshotなんてものはありません。

 
DRMで保護されたコンテンツはスクリーンショットを防げる



Hulu等の有料ストリーミング動画などを再生中にスクリーンショットで撮影しようとすると動画部分が真っ黒になります。
私はこれを見て、「なんだスクリーンショット防げるんじゃん!」と思って期待したのですが、これはDRMで保護されたストリーミング動画をOS側で上手い事処理しているだけでアプリ側で何かしらの対処をしている訳ではない様です。


動画キャプチャは防げる  

iOS11から動画キャプチャの機能が実装されました。
設定>コントロールセンター>コントロールをカスタマイズの中に「画面収録」というのがあるのでそれをコントロールセンターに追加すると、コントロールセンターから動画キャプチャを行える様になります。

アプリ側では「現在録画されているのか」という情報と「録画状態の切り替わり」の検知が行えます。
なので、「録画中は画面を黒くする」といった対応が可能です。
スクリーンショットと違い、しっかり録画前に画面更新等が行える様になっています。

下記のコードでは動画キャプチャ中だけ画面が赤くなる様にしています。
    override func viewDidLoad() {
        super.viewDidLoad()
        
        if #available(iOS 11.0, *)
        {
            if UIScreen.main.isCaptured{//録画中なら画面を赤くする
                self.view.backgroundColor = UIColor.red
            }
            //Observerに登録
            NotificationCenter.default.addObserver(self,
                                                   selector: #selector(self.captureStatusDidChange),
                                                   name: .UIScreenCapturedDidChange,
                                                   object: nil)
        }
    }
    
    @objc func captureStatusDidChange()
    {
        if UIScreen.main.isCaptured{//録画中なら画面を赤くする
            self.view.backgroundColor = UIColor.red
        }
        else{
            self.view.backgroundColor = UIColor.white
        }
    }

環境


Swift 4.0.2
iOS 11.1.2
Xcode 9.1



スプラッシュ画面の設定

TARGETS>GeneralタブのStatus Bar StyleをLightにする
 13


画面ごとに設定する

文字色を白色にしたいViewControllerで以下のコードを追加  
override var preferredStatusBarStyle: UIStatusBarStyle {
        // ステータスバーの文字色を白で指定
        return UIStatusBarStyle.lightContent
    }
なお、Info.plistに「View controller-based status bar appearance」追加して値をNOとしている場合、上記のコードを追加しても文字色が変わりませんので、この方法を使う場合「View controller-based status bar appearance」は削除する必要があります。

ちなみに横画面にした時もステータスバーを表示したい場合には下記のコードも追加してください。  
override var prefersStatusBarHidden: Bool { return false }

Info.plistで一括設定

全画面でまとめて設定したい場合に便利です。
ただしこの方法の場合、横画面にした時にステータスバーを表示させる事ができない様です。

まずスプラッシュ画面のステータスバーの色を変更した時と同様に、TARGETS>GeneralタブのStatus Bar StyleをLightにします。
次にInfo.plistに「View controller-based status bar appearance」追加して値をNOで設定します。
49



 

環境


Swift 4.0.2
iOS 11.1.2
Xcode 9.1



ステータスバーはデフォルトだと横画面では表示されない様です。

横画面でも表示させたい場合は、ステータスバーを表示したいViewControllerで下記の様にオーバーライドすればOK
override var prefersStatusBarHidden: Bool { return false }

はじめに


Carthage(カーセージ)を使用してGitHubにあるライブラリを導入する方法です
 
環境

Xcode 9.1

macOS 10.13.1(High Sierra) 



ターミナルでごにょごにょ

主にターミナルでの操作になります。 


1.Homebrewの導入 

※導入済みの場合は不要

ターミナルを起動し、下記のコマンドを実行

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2.Carthageの導入  

ターミナルで、下記のコマンドを実行 

brew install carthage

ちなみにCarthageのバージョンを上げたい場合は下記コマンドを実行
brew upgrade carthage

3.ライブラリを導入したいプロジェクトのディレクトリへ移動 

ターミナルのcdコマンドでプロジェクトのディレクトリへ移動します。 

例:デスクトップの「ios-test」というプロジェクトに移動する場合 

cd desktop/ios-test 

4.Cartfileを作成 

ターミナルのtouchコマンドでファイルを作成 
touch Cartfile

これでプロジェクト内にCartfileが作成されます。

32


5.導入したいライブラリの場所を特定

まずブラウザ等でGitHubで公開されているライブラリのページへアクセスします。

URLを見てみるとhttps://github.com/”ユーザー名”/”ライブラリ名”となっていると思います。

このユーザー名からライブラリ名までをコピーしておきます。

SwiftyJSONの場合は「SwiftyJSON/SwiftyJSON」です。 

6.Carthfileを編集 

先程作成したCartfileを開くとテキストエディットが起動するので、「github "先程コピーした文字列"」と記述して閉じます。 
37


7.外部ライブラリをビルド 

ターミナルにて下記のコマンドを実行。

少し時間がかかります。

carthage update --platform iOS

ちなみに

carthage update

だけだと、OSX用とwatchOS用のもビルドされます。

ビルドが始まらない場合は、Carthfileに記載した文字列のスペルミス等の可能性が高いです。


終わるとプロジェクト内部がこんな感じになります。 
39


Xcodeでごにょごにょ



次はXcodeで外部ライブラリを使用する為の設定をしていきます。 

  

1.Linked Frameworks and Libraryに追加

プロジェクトファイルのGeneralタブから、「Linked Frameworks and Library」を探して+ボタンを押します。

09

左下にある「Add Other...」を選択します。

次にプロジェクトのディレクトリ内からCarthage/Build/iOSと移動し、

導入したいライブラリの.frameworkファイルを選択して「Open」を押します。


56


2.Run Scriptでの設定


Build Phasesタブに移動し、+ボタンから「New Run Script Phase」を選択します。

12

次に追加された「Run Script」を開き、「Shell」の下にある黒い部分に下記のコマンドを記述します。

/usr/local/bin/carthage copy-frameworks

そして次に「input Files」にて+ボタンを押し、以下のようにframeworkの情報を記述します。  

$(SRCROOT)/Carthage/Build/iOS/SwiftyJSON.framework

50

以上でライブラリの導入完了です。

あとは必要なクラスでimportして使用するだけです。 



ちなみに新たにライブラリを追加したい場合は、Carthfileに追記してターミナルでプロジェクトのディレクトリに移動後、

carthage update --platform iOS

でビルド

Linked Frameworks and Libraryに追加

↓ 

「Run Script」の「input Files」にて+ボタンを押し、上記手順と同様にframeworkの情報を記述すればOKです。 

 

↑このページのトップヘ