Xamarin 后台持续定位与提示

本文详细介绍了如何在iOS中实现后台持续运行功能,针对C#程序员提供了从设置权限信息到关键代码的全面指南。包括如何开启后台运行模式、设置位置更新和音频播放等,确保应用在后台也能正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IOS后台持续运行对于c#程序员不懂得ios后台机制的是存在一定困扰的。特别是ios9过后对后台和安全进行了更严格的限制

好了废话不多说

一 设置info.plist权限信息

参考:

后台模式:http://www.codeceo.com/article/ios-background-guide.html

后台持续定位:http://www.jianshu.com/p/4e30b0af8f51

播放声音:http://www.jianshu.com/p/e54751348abe

需要开启后台运行模式:勾选位置更新,音频播放

二 关键代码

2.1 设置

 coo.DistanceFilter = -1;//设置两点之间位置精度,即手机不动也会提示
 coo.DesiredAccuracy = CLLocation.AccuracyBest;
 coo.AllowsBackgroundLocationUpdates = true;//开启后台持续定位
 coo.PausesLocationUpdatesAutomatically = false;//禁用后台暂停位置更新
 coo.Delegate = this;
 coo.RequestAlwaysAuthorization();

 coo.StartUpdatingLocation();
 coo.StartUpdatingHeading();

2.2 前后台切换

        public override void DidEnterBackground(UIApplication uiApplication)
        {
       //进入后台 DependencyService.Get
<ILocationManager>().EnterBackground(); } public override void WillEnterForeground(UIApplication uiApplication) {
       //进入前台 DependencyService.Get
<ILocationManager>().EnterForground(); }

 

 

三 播放音频(系统提示音)

 

var sound = new SystemSound(1007);

await sound.PlaySystemSoundAsync();

 

 

四 实现结果

当位置发生更新时播放系统提示音,且伴有震动,这里暂时对ios消息推送不甚了解,下次将在位置更新播放提示音同时加入本地推送

这里是使用xamarin.ios 原生api实现,之前试过百度地图持续最新sdk弄了半天进入后台就不行了,也许是我知识不够,但是使用原生api也行那么也就不用那么麻烦了

五 完整代码

[assembly: Dependency(typeof(MyLocationManager))]

namespace Xamarin.Simples.iOS
{
    public class MyLocationManager : NSObject, ICLLocationManagerDelegate, ILocationManager
    {
        private CLLocationManager coo;
        private bool init = false;
        public MyLocationManager()
        {
            coo = new CLLocationManager();
           
            

        }



        #region ICLLocationManagerDelegate

        #region IDisposable implementation

        void IDisposable.Dispose()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region INativeObject implementation

        IntPtr ObjCRuntime.INativeObject.Handle
        {
            get
            {
                throw new NotImplementedException();
            }
        }

        #endregion


        [Foundation.Export("locationManager:didUpdateLocations:")]
        public async void LocationsUpdated(CoreLocation.CLLocationManager manager, CoreLocation.CLLocation[] locations)
        {
            Console.WriteLine("定位成功");

            var sound = new SystemSound(1007);

            await sound.PlaySystemSoundAsync();

            

        }


        [Export("locationManager:didUpdateHeading:")]
        public void UpdatedHeading(CoreLocation.CLLocationManager manager, CoreLocation.CLHeading newHeading)
        {
           
            
        }



        [Foundation.Export("locationManager:didUpdateToLocation:fromLocation:")]
        public void UpdatedLocation(CoreLocation.CLLocationManager manager, CoreLocation.CLLocation newLocation, CoreLocation.CLLocation oldLocation)
        {
            
        }


         


        #endregion


        public void Init()
        {
            if (!init)
            {
                coo.DistanceFilter = -1;
                coo.DesiredAccuracy = CLLocation.AccuracyBest;
                coo.AllowsBackgroundLocationUpdates = true;
                coo.PausesLocationUpdatesAutomatically = false;
                coo.Delegate = this;
                coo.RequestAlwaysAuthorization();

                coo.StartUpdatingLocation();
                coo.StartUpdatingHeading();

                init = true;
            }
            
        }


        public void EnterBackground()
        {
            if (init)
                coo.StartMonitoringSignificantLocationChanges();
        }

        public void EnterForground()
        {
            if (init)
                coo.StopMonitoringSignificantLocationChanges();
        }


    }
}
View Code

 

六  案例下载

https://yunpan.cn/cqegpGW96nYx7 (提取码:4508)

 

转载于:https://www.cnblogs.com/rjjs/p/5376300.html

相关说明: ConsoleApplication1_sERVER ----PC-服务端 MyNetTest --------------------IOS-客户端 1、PC-服务端 只是一个运行在windows系统下的 控制台程序。接收来自客户端的信息。 2、IOS-客户端 运行在ios模拟器上,连接PC服务端的ip,发生相关信息。 3、两台主机,一台是运行windows系统的计算机。另外一台是MacBook计算机。运行ios模拟器。 4、pc-服务端,可以用vs2008打开并且编辑。 5、ios客户端,使用的是XamarinStudio 打开并且编辑。 以下是这个例子中的特别提到的地方 A、这个例子是完全用C#写的。 B、ios由于是伪后台,当程序退回到后台,系统留给程序的可运行时间就只有3分钟。 过了3分钟,就会把这个程序的所有线程挂起(当然内部预留了长任务运行这一后招)。 经过多次试验后,可以借助着3分钟的长任务运行,然后通过简单的修改来突破这个界限。 在本例子中,所有线程共享一个线程ID。 其中只需要一条线程负责不停的延长这个线程ID的运行时间,然后其他的线程就只需要专注于其本应该要做的任务即可。 C、本例子中,还实现了另外一个功能,就是ios程序PC程序进行socket。当然是最为简单的。 ---------------- 由于本人也是刚刚使用c#开发ios程序,初入门,为了这两个问题,也是研究了很久,可查的资料又很少。 希望能够帮助到同样遇到困难的你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值