FC2ブログ

記事一覧

PHPickerViewController の使用方法 -iOS14対応- | Xamarin.Forms


今回は iOS14 でイメージピッカー(画像選択画面)が変更されたことにより、従来のイメージピッカーが動作しなくなりましたので、その対応方法を覚え書きします。
iOS14 では色々と変更点が多いと思いますが、Xcode12 に更新し、動作検証する必要がありました。そして完成したソースを動作させてみましたところ、正しく動作しそうでした。しかしながら、エラーのような画面が表示されましたので、その点についても調査してみました。


iOS14
xamarin_ios_PHPicker.png



前提条件
・Windows10 Pro 64Bit 1903
・Visual Studio 2019 Community v16.7.5
・Xamarin 16.7.000.452 (NuGet Xamarin.Forms 4.6.0.1141)
・macOS Catalina 10.15.7 / Xcode 12.0 / Xamarin.iOS 14.0.0.0



1.事前準備

以前の記事「イメージギャラリーを表示して写真を取得する方法」に記載していますが、以下の項目については設定を済ませておくことが前提です。
・DependencyService の実装
・ImageSource を app.cs 等で保持・取得できる仕組み
・info.plistにフォトライブラリの使用許可を求める記述



2.PHPickerViewController

以下の様に PHPickerViewController を実装します。

ImageService.cs
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using PhotosUI;
[assembly: Dependency(typeof(ImageService))]
public class ImageService : IImageService
{
/// <summary>
/// イメージ選択画面を表示する(外部アプリ)
/// </summary>
public void ShowImageGallery()
{
UINavigationController navigationController = FindNavigationController();

if (UIDevice.CurrentDevice.CheckSystemVersion(14, 0))
{
//新しいPHPickerViewControllerを呼び出します。
var config = new PHPickerConfiguration();
config.SelectionLimit = 1; //default 1, SelectionLimit=0にすると複数選択可能
config.Filter = PHPickerFilter.ImagesFilter;
var picker = new PHPickerViewController(config);
picker.Delegate = new CustomPHPickerViewControllerDelegate();
navigationController.PresentViewController(picker, true, null);
}
else
{
//従来のイメージピッカーです。iOS14以降で動作しません。
UIViewController viewController = new AppName.iOS.Model.ImagePickerController();
navigationController.PresentViewController(viewController, true, null);
}
}
}

CustomPHPickerViewControllerDelegate.cs
using PhotosUI;
public class CustomPHPickerViewControllerDelegate : PHPickerViewControllerDelegate
{
    public override void DidFinishPicking(PHPickerViewController picker, PHPickerResult[] results)
{
if (results != null &&
results.FirstOrDefault() != null)
{
//選択した結果を取得してImageSourceに変換する
var itemProvider = results.FirstOrDefault().ItemProvider;
if (itemProvider.CanLoadObject(typeof(UIImage)))
{
//LoadObjectで選択した画像を取得します。
//取得できない場合は error でエラーコードとエラー内容が取得できます。
itemProvider.LoadObject<UIImage>((selectedImage, error) =>
{
if (selectedImage == null)
{
return;
}

UIApplication.SharedApplication.InvokeOnMailThread(() =>
{
var image = selectedImage as UIImage;

//App.csのImageSourceにセットする
ImagePickerController.SetAppImageSource(image);
}
});
}
}

//PHPickerViewControllerを終了する
picker.DismissViewController(true, null);
}
}



3.エラーについて

PHPickerViewController をシミュレータで実行した場合は、以下のようなエラー画面が表示されました。Xcode 12.1 に更新してもダメだという記事もありましたので、実機等で確認してみましたところ、正常に動作しました。
Picker Unavailable
There was an error while preparing the picker.
Please try again later


xamarin_ios_simulator_phpicker_error_01.png






最後までお読みいただきありがとうございます。
当ブログの内容をまとめた Xamarin逆引きメニュー は以下のURLからご覧になれます。
https://itblogdsi.blog.fc2.com/blog-entry-81.html



関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。