May 19, 2020

iOS FIle System の 調査

iOSアプリにMP3ファイル(複数)を含めたら、200MBを超えてしまった。Appleの推奨は、200MB以下。 対策案は、「 MP3は、アプリがURLからダウンロードしてきて、データとして保持し、それを webView から使う」できるか、調査・実験が必要になった。

From About the iOS File System by Apple

まとめ

iOS app は、 Sandbox と呼ばれるディレクトリの下のみアクセスできる。

 Sandbox の 下は、 Bundle Container(AppName.app), Data Container(Documents/), iCloud Container の三つに分かれる。

Bundle Container には、アプリケーション本体とリソースファイルが入り、 read のみ許可される

Data Container には、アプリケーションが作成(ダウンロード)したデータを保存する。

Bundle Container と Data Container は、単純な隣のディレクトリではない、ディレクトリパスは、階層が深く途中に暗号コードが這っていて、共通部が全くない。

Appleの推奨は、動画や音楽は、Data Container にダウンロードし、iCloudのバックアップ対象から外すべきであること( You can exclude files from the backup by calling -[NSURL setResourceValue:forKey:error:] using the NSURLIsExcludedFromBackupKey key. HowTo)

Data Container の ひとつのhtml ファイル を webView に swiftから指定して表示できる、方法はここ load html file to UIWebview from documents directory on ios with swift ()

Mp3のダウンロード例 Xcode: Download mp3 file [closed]
Mp3のダウンロード例 How to play mp3 audio from URL in ios swift

Swift memo GuidedTour
let : an immutable constant 定数定義, 
var : a a mutable variable 変数定義,   
  var 名称 = 値
  var 名称 : 型 = 値
  var 名称 = [ ,,, ]   //配列(自動拡張)
  var 名称 = [ "インデックス":"",,, ]   //文字インデックス配列(自動拡張)

暗黙の型変換はなし

""" で、複数行テキスト定数の定義開始と終了
"... \(変数名称)..."  文字列での変数引用

  var 名称 : 型? = 値   // ? は、 optionals を意味し、 nil または型の値を持つ
  // ?? は、デフォルトバリューオペレーター

関数を呼ぶときは、ラベル名: を付ける
greet(person: "Bob", day: "Tuesday")

API memo
NSURLAn object representing the location of a resource that bridges to URL;
NSURLSessionDownloadTask : A URL session task that stores downloaded data to a file
NSURLSessionTask : A task, like downloading a specific resource, performed in a URL session
NSURLSession An object that coordinates a group of related, network data-transfer tasks.
 downloadTaskWithURL:completionHandler:
NSAllowsArbitraryLoads : A Boolean value indicating whether App Transport Security restrictions are disabled for all network connections. (Remember to add this in your info.plist)

結論 webView は、Bundle ContainerとData Containerの両方を同時に扱えない

swiftから、Bundle Container(またはData Container)の下のhtmlファイル(またし外部WEBサイトURL) を指定してwebView を起動すると、webViewは、それらを表示できる。

[href=/action=/src="file://..." 指定が禁止] webViewにロードされた Bundle Container(またはData Container)の下のhtml /javascriptが、"src=" 指定で、自分と別ディレクトリのData Container(またはBundle Container)の下のimg/audioファイルを"src=" 指定するには、"file:///" とならざるを得ないため、セキュリティ違反となるから、呼び出せない。

[href=/action=/src="https://..." 指定が可能] webViewにロードされた Bundle Container(またはData Container)の下のhtml /javascriptが、img/audioタグの "src=" 指定で、https://指定で インターネットのファイル を指定して動作できる。

[href=/action=/src="onlyFileName.ext" 指定が可能webViewにロードされた Bundle Container(またはData Container)の下のhtml /javascriptが、img/audioタグの "src=" 指定で、自分と同じディレクトリ(またはサブディレクトリ)のファイル を指定して動作できる("file:///"を指定しないで済むため)。

[ローカルファイルからXMLHttpRequest禁止 ] webViewにロードされた Bundle Container(またはData Container)の下のhtml /javascriptが、XMLHttpRequest 関係を呼び出しても、 呼ばれたサーバ側は、呼び出し側をローカルと判断して、セキュリティ違反となるため、エラー応答されてしまう。

webViewのjavascript は、swift にメッセージを送り関数を起動することができるが、リターン値は無しとなる。

swiftのライブラリは、 外部サイトのURLを指定して、 htmlなどのファイルをダウンロードできる。

swiftは、起動したwebViewのjavascriptの関数を好きなタイミングで呼び出せる。リターン値は無しとなる。

"iOS Simulator could not hardlink copy |Apple Developer Forums"

「src="data:image/png;base64,」形式  ( RFC2397  The "data" URL scheme )で、swiftから javascriptに ファイルの中身を渡せると思われるが未検証。

以上




No comments:

Post a Comment