kamulog

xamarin.formsのネタなど

CollectionView という Xamarin.Forms 向けの 縦以外のレイアウトに対応した ListView を公開しました。

以前 WrapLayout というカスタムレイアウトを含む AiForms.Layouts というライブラリを作成しました。これは、要素を水平方向に配置していき端まできたら折り返すというだけのものでした。そして現在は、FlexLayoutの登場によりその役割をほぼ終えています。

AiForms.Layouts では繰り返し要素を配置するコントロールとして、FlexLayoutやStackLayoutをItemTemplateに対応させたものもあります。

しかし、これらは実直に要素を物理的に生成して配置していくだけなので、要素が増えるとパフォーマンスが激しく低下するという問題がありました。

本来多くの要素を配置する場合は UICollectionView / RecyclerView を使用するべきで、そうなるとPlatform側でちゃんと対応させねばならないと思っていました。

SettingsView というものを作った時に UICollectionView / RecyclerView の実装方法を少しだけ覚えたので、それを生かしてちびちび作成したものが出来上がったので、この度nugetで公開しました。

前述の問題を解決した WrapLayout のListView対応版という風な捉え方で問題ないと思います。ただ現在のところ固定サイズのセルのみ対応です。 1種類だとあれなので、おまけとして水平方向ListView的なものも用意しています。

続きを読む

Xamarin.Forms (Android) のListViewでFFImageLoadingとNativeCellを使ってout of memoryを回避しつつ高速化するサンプル(iOSはViewCellのまま使用する)

Xamarin.Forms の ListView は、Android で使う場合(特に画像を扱う場合)にパフォーマンスが悪いという問題があります。これは Fast Renderer を有効にしても変わりません。 普通にやってたら描画が遅くてメモリリークで落ちがちなので、何らかの対策が必要です。

個人アプリの復習帳では、ListViewやTableViewのセルは全てNativeCellで処理しています。それとは別に仕事で扱ってるプロジェクトではNativeCellに加えてFFImageLoadingのCachedImageを組み合わせた対策を行いました。

そういうわけで、今回はAndroidのListViewを快適に使うためのNativeCell+FFImageLoadingのサンプルをご紹介します。

続きを読む

App Store の審査で CallKit の使用が検出されたとしてリジェクトされた場合の対処 ( Xamarin.Forms / Xamarin.iOS )

復習帳 1.1.6 iOS版 のアップデートの際に審査で「メタデータでの却下」としてリジェクトされました。
内容は以下になります。

Guideline 5.0 - Legal

Recently, the Chinese Ministry of Industry and Information Technology (MIIT) requested that CallKit functionality be deactivated in all apps available on the China App Store.

During our review, we found that your app currently includes CallKit functionality and has China listed as an available territory in iTunes Connect.

Next Steps

This app cannot be approved with CallKit functionality active in China. Please make the appropriate changes and resubmit this app for review.

If you have already ensured that CallKit functionality is not active in China, you may reply to this message in Resolution Center to confirm.

Voice over Internet Protocol (VoIP) call functionality continues to be allowed but can no longer take advantage of CallKit’s intuitive look and feel. CallKit can continue to be used in apps outside of China.

中国への配信では、CallKit機能を使用したアプリは法律で禁止されていて公開ができない決まりだけど、あなたのアプリでCallKitの使用が検出されたので無効化してください。 というような内容です。

CallKitは良くわかりませんが、iOSの電話関連のAPIらしいです。しかし、そんなコードは1行も書いてません。

問題解決センターでやりとりするも、確かに検出されているが、具体的箇所は答えられないということでした。

結論から言えば、「使ってないのに検出された」という事実がすでに答えでそれは「リンカーの設定」でした。

iOSプロジェクトのビルド設定のリンカーの動作が「リンクしない」になっていたので f:id:kamusoft:20180526102014p:plain

これを「フレームワークSDKのみをリンクする」にしてビルドして再提出すると無事審査を通過できました。 f:id:kamusoft:20180526102026p:plain

そもそもデフォルトは「フレームワークSDKのみをリンクする」なのですが、Xamarin Studio時代のとあるバージョンで急にリリースビルドで「リンクしない」に設定しないと即落ち現象に遭遇して、それ以来ずっとこの設定にしてたのが問題だったようです。今回、設定変更したら即落ち現象も発生せず何も問題なかったので、本来ならこのリジェクトは遭遇しないのだと思います。

ただgoogleで検索してもあまり情報がなかったので一応記事にしてみました。

また今回「メタデータでの却下」としてリジェクトされたのですが、それについて検索してみると、これはストア掲載データなどバイナリ以外での理由での却下なので、再提出しなくても大丈夫的な内容が結構ヒットしてました。 ですが今回は「メタデータでの却下」であっても既にバイナリに機能が含まれるという内容なので当然再ビルドが必要で、そのビルドの再提出が必要です。 問題解決センターでのやりとりだけでは確実に解決できないので注意が必要です。

まとめ

AppStoreの審査で中国配信でCallKitが〜と怒られたらリンカーの設定を見直しましょう。