iOS中怎么實(shí)現(xiàn)一個(gè)模擬定位功能-創(chuàng)新互聯(lián)

本篇文章為大家展示了iOS中怎么實(shí)現(xiàn)一個(gè)模擬定位功能,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司是網(wǎng)站建設(shè)專家,致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營(yíng)銷,專業(yè)領(lǐng)域包括成都做網(wǎng)站、成都網(wǎng)站建設(shè)、電商網(wǎng)站制作開發(fā)、小程序定制開發(fā)、微信營(yíng)銷、系統(tǒng)平臺(tái)開發(fā),與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開發(fā)公司不同,我們的整合解決方案結(jié)合了恒基網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷的理念,并將策略和執(zhí)行緊密結(jié)合,且不斷評(píng)估并優(yōu)化我們的方案,為客戶提供全方位的互聯(lián)網(wǎng)品牌整合方案!

1、 Runtime swizzle

因?yàn)闃I(yè)務(wù)代碼是根據(jù)- (void)locationManager:(CLLocationManager *)manager  didUpdateLocations:(NSArray<CLLocation *> *)locations方法來接受回調(diào)的,所以可以采用Runtime swizzle這個(gè)方法,來實(shí)現(xiàn)模擬定位的功能,但是我們中間組件是不知道業(yè)務(wù)代碼中具體是哪個(gè)類,所以無法具體指定runtime swizzle哪個(gè)類,所以只能遍歷所有的類,判斷當(dāng)前類的方法列表中是否有l(wèi)ocationManager:didUpdateLocations:這個(gè)方法,如果存在則swizzle。

優(yōu)點(diǎn):便于理解。缺點(diǎn):需要遍歷所有的類和類的方法列表。

2、中間代理對(duì)象

這種思路是Swizzle了CLLocationManager的setDelegate:方法,當(dāng)調(diào)用setDelegate時(shí),將真實(shí)的delegate object保存下來,再將我們定義的中間代理類swizzle delegate對(duì)象設(shè)置為CLLocationManager的delegate,這樣當(dāng)系統(tǒng)回調(diào)CLLocationManagerDelegate,會(huì)先回調(diào)到中間代理類swizzle delegate中,再由swizzle delegate將事件傳遞到真實(shí)的delegate object。

優(yōu)點(diǎn):相對(duì)于第一種方法,不需要遍歷類和類的方法列表,只需swizzle CLLocationManager中的setDelegate:方法即可。缺點(diǎn):在中間代理類swizzle delegate中需要實(shí)現(xiàn)全部的CLLocationManagerDelegate方法,如果后續(xù)增加代理方法,仍需要修改這個(gè)類。

3、采用NSProxy實(shí)現(xiàn)中間代理對(duì)象

Objective-C中有2個(gè)基類,常用的就是NSObject,另一個(gè)就是NSProxy,NSProxy主要用于消息轉(zhuǎn)發(fā)處理,所以采用NSProxy我們可以更好的處理方法二中的缺點(diǎn)。

3.1創(chuàng)建一個(gè)新的類MockLocationProxy,集成自NSProxy。

// MockLocationProxy.h#import <CoreLocation/CoreLocation.h>@interface MockLocationProxy : NSProxy@property (nonatomic, weak, readonly, nullable) id <CLLocationManagerDelegate> target;- (instancetype)initWithTarget:(id <CLLocationManagerDelegate>)target;@end

// MockLocationProxy.m#import "MockLocationProxy.h"@implementation MockLocationProxy- (instancetype)initWithTarget:(id<CLLocationManagerDelegate>)target {  _target = target;  return self;}@end

接著就來處理消息轉(zhuǎn)發(fā)的邏輯,首先我們要知道我們想要的是什么效果,系統(tǒng)回調(diào)給MockLocationProxy,MockLocationProxy只處理locationManager:didUpdateLocations:,其他的消息都仍然交給原target。

所以我們?cè)贛ockLocationProxy.m中添加以下方法:

// MockLocationProxy.m@implementation MockLocationProxy- (instancetype)initWithTarget:(id<CLLocationManagerDelegate>)target {  _target = target;  return self;}- (BOOL)respondsToSelector:(SEL)aSelector {  if (aSelector == @selector(locationManager:didUpdateLocations:)) {    return YES;  }  return [self.target respondsToSelector:aSelector];}- (void)forwardInvocation:(NSInvocation *)invocation {  SEL sel = invocation.selector;  if ([self.target respondsToSelector:sel]) {    [invocation invokeWithTarget:self.target];  }}- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {  return [self.target methodSignatureForSelector:sel];}#pragma mark - CLLocationManagerDelegate- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {  if ([self.target respondsToSelector:_cmd]) {    // 模擬定位代碼    CLLocation *mockLocation = [[CLLocation alloc] initWithLatitude:39.908722 longitude:116.397499];    locations = @[mockLocation];    [self.target locationManager:manager didUpdateLocations:locations];  }}@end

當(dāng)消息發(fā)送給MockLocationProxy時(shí),判斷當(dāng)前方法是否是locationManager:didUpdateLocations:,如果是,則MockLocationProxy響應(yīng)事件,否則直接傳遞給原本的target。到此已經(jīng)可以隨時(shí)處理模擬定位。你只需要在模擬定位的代碼做一些處理,就可以隨時(shí)修改定位。

One more.

上述方法雖然可以模擬定位,但是每次修改模擬值都需重新build,那么有沒有辦法在運(yùn)行時(shí)隨時(shí)修改這個(gè)值呢?

LLDebugTool

當(dāng)然可以,你只需要在你的項(xiàng)目中集成LLDebugTool,調(diào)用其中的Location模塊,LLDebugTool提供了一個(gè)UI來隨時(shí)修改這個(gè)模擬值,讓你在調(diào)試時(shí),隨時(shí)模擬定位,LLDebugTool仍提供了很多其他的功能,如果你只需要模擬定位的功能,則只需要集成LLDebugTool/Location這個(gè)subspec就可以了。

上述內(nèi)容就是iOS中怎么實(shí)現(xiàn)一個(gè)模擬定位功能,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享標(biāo)題:iOS中怎么實(shí)現(xiàn)一個(gè)模擬定位功能-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://muchs.cn/article8/djihip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站建設(shè)網(wǎng)站收錄、搜索引擎優(yōu)化、虛擬主機(jī)、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作