iOS 中不推荐使用 requestReview() 14,替代 xamarin.forms?

requestReview() deprecated in iOS 14, Alternative for xamarin.forms?

我正在使用

SKStoreReviewController.RequestReview ();

在 Xamarin.Forms 的依赖服务中。但是,现在已从 iOS 14 中弃用。我想知道如何与新的集成 UIWindowScene

requestReview(in windowScene: UIWindowScene)

在Xamarin.Forms

首先,您可以尝试在 xxx.ios->AppDelegate.cs 的 FinishedLaunching 方法中添加 SKStoreReviewController.RequestReview(Window.WindowScene);启动项目看看是否正确

如果上述方法出错,使用DependencyService才是正确的做法。

接口代码如下:

 public interface MyInterface
{
     void RequestReview();
}

这里是ios中接口的实现方法:

[assembly: Dependency(typeof(MyInterfaceImpl))]
namespace App19.iOS
{
    public class MyInterfaceImpl : MyInterface
    {
        public void RequestReview()
        {
           var myv = UIDevice.CurrentDevice.CheckSystemVersion(14, 0);
            if (myv)
            {
                UIWindow window = UIApplication.SharedApplication.Delegate.GetWindow();
            SKStoreReviewController.RequestReview(window.WindowScene);
            }
            else 
            {
                SKStoreReviewController.RequestReview();
            }
        }
    }
}

可以在APP.xaml.cs里面的OnStart方法中调用:

 protected override void OnStart()
    {
        if (Device.RuntimePlatform == Device.iOS)
        {
            DependencyService.Get<IReviewService>().RequestReview();
        }
    }

我可能有解决办法:

using StoreKit;
using UIKit;

public void RequestReview(){
    var scene = UIApplication.SharedApplication.KeyWindow.WindowScene;

    if (scene is null)
    {
        //handle the scene being null here
        return;
    }

    SKStoreReviewController.RequestReview(scene);
}

我找到了多种获取当前场景的方法,并且在我测试它们时它们都有效:

var scene = UIApplication.SharedApplication.KeyWindow.WindowScene;

var alsoScene = UIApplication.SharedApplication.Delegate.GetWindow()?.WindowScene;

您可以在 this issue

中详细了解两者之间的区别

检查 iOS 版本以调用正确内容的完整解决方案可能如下所示

using StoreKit;
using UIKit;

public void RequestReview()
{
    var isIos14OrAbove = UIDevice.CurrentDevice.CheckSystemVersion(14, 0);
    if (isIos14OrAbove)
    {
        var scene = UIApplication.SharedApplication.KeyWindow.WindowScene;

        if (scene is null)
        {
            //handle the scene being null here
            return;
        }

        SKStoreReviewController.RequestReview(scene);
    }
    else
    {
        SKStoreReviewController.RequestReview();
    }
}

希望这对您有所帮助。