[英]Xamarin Forms: How to check if GPS is on or off in Xamarin ios app?
每當我打開我的應用程序時,我都需要檢查 GPS 是否打開。 如果 GPS 關閉,我需要將用戶重定向到位置設置頁面。 我已經使用如下依賴服務完成了 android 部分。
ILoc設置
public interface ILocSettings
{
void OpenSettings();
bool isGpsAvailable();
}
安卓實現
[assembly: Dependency(typeof(LocationShare))]
namespace Projectname.Droid.Services
{
public class LocationShare : ILocSettings
{
public bool isGpsAvailable()
{
bool value = false;
Android.Locations.LocationManager manager = (Android.Locations.LocationManager)Android.App.Application.Context.GetSystemService(Android.Content.Context.LocationService);
if (!manager.IsProviderEnabled(Android.Locations.LocationManager.GpsProvider))
{
//gps disable
value = false;
}
else
{
//Gps enable
value = true;
}
return value;
}
public void OpenSettings()
{
Intent intent = new Android.Content.Intent(Android.Provider.Settings.ActionLocationSourceSettings);
intent.AddFlags(ActivityFlags.NewTask);
Android.App.Application.Context.StartActivity(intent);
}
}
}
最后來自如下調用的共享項目:
//For checking the GPS Status
bool gpsStatus = DependencyService.Get<ILocSettings>().isGpsAvailable();
//For opening the location settings
DependencyService.Get<ILocSettings>().OpenSettings();
對於 ios,我如何才能執行相同的功能? 我試過如下:
[assembly: Dependency(typeof(LocationShare))]
namespace Projectname.iOS.Serivces
{
class LocationShare : ILocSettings
{
public bool isGpsAvailable()
{
//how to check the GPS is on or off here
}
public void OpenSettings()
{
UIApplication.SharedApplication.OpenUrl(new NSUrl(UIApplication.OpenSettingsUrlString));
}
}
}
在 ios 模擬器上打開位置設置頁面,但不知道如何查看 GPS 狀態。
更新1
我已經嘗試了CLLocationManager
代碼,但它沒有按預期工作。 即使位置關閉或打開,它也始終返回 true。
OpenSettings() 函數代碼( UIApplication.SharedApplication.OpenUrl(new NSUrl(UIApplication.OpenSettingsUrlString));
)也沒有按預期工作,它正在重定向到其他頁面,如果 GPS 關閉,我需要打開位置設置頁面.
另外,我正在請求位置許可,如下所示:
var status = await Permissions.RequestAsync<Permissions.LocationAlways>();
在android 中,請求位置權限,但在 ios 中,沒有請求權限。
更新2
我已經嘗試了新的代碼並且總是將錯誤值作為 GPS 狀態。 我在info.plist
上添加了所有位置權限,如下所示:
但是在運行應用程序時不會詢問位置權限(甚至一次)。 我試過Permissions.LocationWhenInUse
而不是Permissions.LocationAlways
,但沒有運氣。
更新 3
以下是我檢查位置權限、檢查 GPS 狀態和打開設置的完整流程。 權限狀態值始終為Disabled
。
//Requesting permission like below:
var status = await Permissions.RequestAsync<Permissions.LocationAlways>();
if (status == PermissionStatus.Granted)
{
//Then checking the GPS state like below
bool gpsStatus = DependencyService.Get<ILocSettings>().isGpsAvailable();
if (!gpsStatus)
{
//show a message to user here for sharing the GPS
//If user granted GPS Sharing, opening the location settings page like below:
DependencyService.Get<ILocSettings>().OpenSettings();
}
}
我已經嘗試了以下 2 個代碼來請求或檢查權限。 在這兩種情況下,狀態值都是 Disabled。 如果我卸載應用程序並重新安裝它,得到相同的狀態並且不顯示任何權限彈出窗口。
var status = await Permissions.RequestAsync<Permissions.LocationAlways>();
var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
與安卓系統不同,iOS可以單獨設置GPS開關,只能獲取位置服務是否開啟的狀態。 剩下的具體定位方法就留給iOS系統去選擇了。
一開始,我們需要看看iOS中location的狀態:
CLAuthorizationStatus 枚舉
UIApplicationOpenSettingsURLString :用於創建可以傳遞給 openURL: 方法的 URL。 當您打開根據該字符串構建的 URL 時,系統會啟動“設置”應用程序並顯示該應用程序的自定義設置(如果有)。
從現在開始,iOS 只支持這種方式來顯示應用程序的自定義設置。 有兩個有用的討論,你可以看看。 iOS10如何跳轉到系統設置的定位服務? 和打開位置設置在 ios 11 Objective c 中不起作用? .
如果它重定向到其他頁面,如下所示:
這意味着您的應用程序在安裝應用程序后不會對位置服務進行任何設置。 因此,您無需打開設置頁面,因為它不會在您的應用程序設置頁面下方顯示位置服務。 現在CLAuthorizationStatus
應該是NotDetermined
。 您可以使用CLLocationManager.RequestWhenInUseAuthorization來請求權限,位置服務的彈出窗口將顯示給客戶在應用程序內選擇。
如果客戶第一次選擇不允許,這意味着下次打開應用程序檢查將顯示拒絕狀態的位置服務。 現在您需要使用UIApplicationOpenSettingsURLString打開設置頁面,並會在應用的自定義設置列表中看到位置服務。
最后LocationShare的最終代碼如下:
public class LocationShare : ILocSettings
{
public bool isGpsAvailable()
{
bool value = false;
if ( CLLocationManager.LocationServicesEnabled )
{
if(CLLocationManager.Status == CLAuthorizationStatus.Authorized || CLLocationManager.Status == CLAuthorizationStatus.AuthorizedAlways || CLLocationManager.Status == CLAuthorizationStatus.AuthorizedWhenInUse)
{//enable
value = true;
}
else if (CLLocationManager.Status == CLAuthorizationStatus.Denied)
{
value = false;
OpenSettings();
}
else{
value = false;
RequestRuntime();
}
}
else
{
//location service false
value = false;
//ask user to open system setting page to turn on it manually.
}
return value;
}
public void RequestRuntime()
{
CLLocationManager cLLocationManager = new CLLocationManager();
cLLocationManager.RequestWhenInUseAuthorization();
}
public void OpenSettings()
{
UIApplication.SharedApplication.OpenUrl(new NSUrl(UIApplication.OpenSettingsUrlString));
}
}
同樣,如果CLAuthorizationStatus被Denied
(與 Forms 中的status == PermissionStatus.Unknown
相同),以下代碼在 Forms 中將不起作用。
var status = await Permissions.RequestAsync<Permissions.LocationAlways>();
它僅在CLAuthorizationStatus為NotDetermined
時NotDetermined
。 並且您最好請求Permissions.LocationWhenInUse
而不是Permissions.LocationAlways
,這應該是更好的推薦選項。
============================更新#2================== ==============
我修改了上面的代碼,你會看到如果CLLocationManager.LocationServicesEnabled
為false,我們只能要求用戶重定向到系統設置頁面手動開啟服務。 因為從 iOS 10 開始,iOS 不支持從非系統應用程序導航到系統設置頁面。
============================更新#3================== ====================
如果啟用定位服務,當使用UIApplication.SharedApplication.OpenUrl(new NSUrl(UIApplication.OpenSettingsUrlString));
方法你會看到類似的截圖如下:
Loaction 選項將顯示在列表中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.