Kivyで作ったiOSアプリでHTMLコンテンツを表示するの巻
はじめに
Kivyで作ったアプリをiOSアプリ化して、HTMLを表示するための方法の備忘録です。
ワタシ、Kivyで作ったサンプルアプリをiOSアプリ化したのですが、「HTMLを表示したいぞ、で、どうしたらいいのん?」となりまして。
結局、Kivyで作ったiOSアプリで、HTMLの表示にSafariとWKWebViewが使えることがわかりましたよ、と。
なお、Webページの表示にはSafariとWKWebViewの両方が使えましたが、ローカルに保存してあるHTMLファイルの表示にはWKWebViewしか使えないようです(Safariでは表示できませんでした)。
実施環境
MacOS Ventura 13.3.1
Xcode Version 14.3 (14E222b)
Python 3.9.12 (ただし、toolchainが連れてくる?のはPython 3.9.9 )
Kivy 2.1.0 (ただし、toolchainが連れてくる?のは Kivy v2.2.0.dev0)
Kivy-iOS 2022.7.19
MacBook Pro(2021), (Apple M1 Pro, メモリ 16GB)
やりかた
iosモジュールを使えばできる、と。
Kivy-iOSを導入して、もろもろやってから、
関連記事;Kivyで作ったiOSアプリにAdMobの広告を表示したときの試行錯誤、の巻
toolchain build ios
をしてから
toolchain create xxxxxx yyyyyy
xxxxxxはプロジェクト名
yyyyyyはmain.pyとmain.kvを入れているディレクトリ名。
または、プロジェクト作成済みならば、
toolchain update xxxxxx-ios
すれば良い、と。
Webページを表示する
コードの全体は本記事の下の方に載せてあります。
Safariを使う
ios.IosBrowser.openでurl(文字列)を開ければ良いみたい。
https://www.google.comを表示する、
view_google_in_safari関数を作ってみました。
def view_google_in_safari(self):
url = 'https://www.google.com'
self.browser=ios.IosBrowser.open(self, url)
とかで良いようです、おお。
WKWebViewを使う
少しめんどくさい。urlは文字列じゃなくてバイト列で指定するのですと。
view_google_in_webview関数としてみました。
で、そのままだとデバイスの画面サイズに合わせられないので、Window.sizeで画面サイズを、ios.get_scale()でディスプレイの表示スケーリングをとってきて、表示サイズを調整してやらないといけない模様。
def view_google_in_webview(self):
#urlをbytesに変換
url = bytes(b'https://www.google.com')
displayscale = ios.get_scale()
self.browser=ios.IOSWebView.open(self,url, 0, 0, Window.size[0]/displayscale,Window.size[1]/displayscale)
ios.IOSWebView.open()については、
ios.IOSWebView.open(self, URL(バイト列), 表示始点x位置, 表示始点y位置, 表示width,表示height)
となっているんですと。
ローカルのHTMLファイルを表示する
WKWebViewしかできぬようで。
Xcodeに放り込んでいて、アプリのリソースファイルとしているHTMLファイルをみるとき
読み込みたいHTMLファイル(index.htmlとしました。今回は、とあるサッカーの試合の分析結果です。javascript入り。)をXcode上のResourcesにドラッグ&ドロップなどで放り込んでおきます。
で、これを表示する関数をview_local_file関数として作ってみました。
pyobjusを使って、Objective-CのNSbundleクラスとNSURLクラスをPythonから使えるようにすれば良いみたい。
で、mainBundleからファイルのpathを格納しているオブジェクトを取得してUTF8文字列に変換して、それにfile://をくっつけて、バイト列に変換して、それを開く、と。
def view_local_file(self):
from pyobjus import autoclass
NSBundle = autoclass('NSBundle')
NSURL = autoclass('NSURL')
#mainBundleからurlを格納しているオブジェクトを取得しUTF8文字列に変換
self.resourcepath = NSBundle.mainBundle().pathForResource_ofType_("index", "html").UTF8String()
url = bytes("file://"+self.resourcepath, "utf-8") #bytesに変換
displayscale = ios.get_scale() #windowの大きさの調整のためにdisplayのscaleを取得
self.browser=ios.IOSWebView.open(self, url, 0, 0, Window.size[0]/displayscale,Window.size[1]/displayscale)
Downloadsフォルダのとき
調査、検討中です。うまくいったら追記するか、別の記事に記録を残しておこうと考えています。
うまくいかなかったら。。。この項目は削除してしまおうかしらん。
。。。できました。長くなりそうでしたので別記事にて。
Kivyで作ったiOSアプリでHTMLコンテンツを表示するの巻その2(ローカルファイル編)
うまくいったコード
print文などは適当にスルーしてくださいませ。
main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
import io
#webviewに必要
from kivy.core.window import Window
#ios
import ios
#give class the name of Otameshi
class Otameshi(BoxLayout):
pass
#give class the name of ButtontestApp
class MainApp(App):
def __init__(self, **kwargs):
super(MainApp, self).__init__(**kwargs)
#ios
#safariのとき
def view_google_in_safari(self):
#safariのとき
url = 'https://www.google.com'
self.browser=ios.IosBrowser.open(self, url)
#webviewのとき
def view_google_in_webview(self):
#urlをbytesに変換
url = bytes(b'https://www.google.com')
displayscale = ios.get_scale()
print("window_size; ", Window.size)
print("displayscale",displayscale)
self.browser=ios.IOSWebView.open(self,url, 0, 0, Window.size[0]/displayscale,Window.size[1]/displayscale)
def view_local_file(self):
from pyobjus import autoclass
NSBundle = autoclass('NSBundle')
NSURL = autoclass('NSURL')
#mainBundleからurlを格納しているオブジェクトを取得しUTF8文字列に変換
self.resourcepath = NSBundle.mainBundle().pathForResource_ofType_("index", "html").UTF8String()
print("self.resourcepath", self.resourcepath)
#print("file:// + self.resourcepath", "file://" + self.resourcepath)
url = bytes("file://"+self.resourcepath, "utf-8") #bytesに変換
displayscale = ios.get_scale() #windowの大きさの調整のためにdisplayのscaleを取得
self.browser=ios.IOSWebView.open(self, url, 0, 0, Window.size[0]/displayscale,Window.size[1]/displayscale)
def build(self):
self.browser = None #for webview
return Otameshi()
if __name__ == '__main__':
MainApp().run()
main.kv
<Otameshi>
BoxLayout:
orientation:'vertical'
size:root.size
padding:(100,100)
Label:
id: lab1
text: self.text
text_size: self.width, None
halign: 'center'
font_size: 80
Button:
size: 100, 200
text: 'zettai osunayo'
text_size: self.width, None
halign: 'center'
pos: 0,0
font_size: 80
on_press: root.ids['lab1'].text='osunatte'
on_release:
root.ids['lab1'].text='';
Button:
size: 100, 200
text: 'open google \nin safari'
text_size: self.width, None
halign: 'center'
pos: 0,0
font_size: 80
on_release:
app.view_google_in_safari()
Button:
size: 100, 200
text: 'open google \nin webview'
text_size: self.width, None
halign: 'center'
pos: 0,0
font_size: 80
on_release:
app.view_google_in_webview()
Button:
size: 100, 200
text: 'open local file \nin webview'
text_size: self.width, None
halign: 'center'
pos: 0,0
font_size: 80
on_release:
app.view_local_file()
結果
で、こんな感じにできることがわかりました。うまくいってよかったー。
おまけ
ちなみに、WebViewのバッテンボタンの位置はデフォルトでは左上ですが、ここでは邪魔だったので右上に変更しています。
/Users/xxxx/.local/share/virtualenvs/yyyyyyyy-zzzzzzzz/lib/python3.9/site-packages/kivy_ios/recipes/ios/src
xxxxはユーザー名
yyyyyyyy-zzzzzzzzはプロジェクト名(yyyyyyyy)を冠したディレクトリ名
に、ios_browser.mがあるので、35行目の
35 button.frame = CGRectMake(0.0, 0.0, 40, 40);
を、
35 button.frame = CGRectMake(width-40, 0.0, 40, 40);
に変更して、右上に移動させてます。
変更を保存したら、
toolchain clean ios
をやってから、
iosをbuildしなおして、
toolchain build ios
Xcodeプロジェクトのupdateをしてから
toolchain update xxxxxx-ios
Xcodeでアプリをビルドすれば変更が反映されたのでした。
おわりに
はい、以上、Kivyで作ったアプリをiOSアプリ化して、HTMLを表示するための方法の備忘録でした。
コードについては、ご興味のある方はライセンス遵守下でご自由にお使いください。
んで、ワタシが初めて作ったKivyを使ったAndroidアプリ(myRoupeiro – サッカーの試合記録と分析 – for amazon)をiOSアプリ化してApp Storeにも並べてみたいなと考えていて、そのために試行錯誤しているのですが、解決しないといけないことがまだまだあるのでやっぱり道のりは長そうです。。。また何かブログに残しておいてみようかなというものが出て来たらまた書こうと思います。
最後までお読みいただきありがとうございました。
おしまい。
本記事に記載したコードのライセンスについて
本記事に記載したコードのライセンスは次のとおりとさせてください。
main.pyおよびmain.kvのコード
MIT License
Copyright (c) 2023 bu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the “Software”), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
参考にしたページなど
iosモジュール; https://github.com/kivy/kivy-ios/tree/master/kivy_ios/recipes/ios/src
WKWebViewでローカルのindex.htmlを読み込んでscriptを実行してみた
kivy-iosメモ kivy v1.8.0 URL連携(MAC)
ちょっと広告です
https://business.xserver.ne.jp/
https://www.xdomain.ne.jp/
★LOLIPOP★
.tokyo
MuuMuu Domain!