真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

本篇文章給大家分享的是有關(guān)怎么在iOS中實現(xiàn)一個模擬定位功能,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)瑪曲免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千多家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

1、 Runtime swizzle

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

  • 優(yōu)點:便于理解。

  • 缺點:需要遍歷所有的類和類的方法列表。

2、中間代理對象

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

  • 優(yōu)點:相對于第一種方法,不需要遍歷類和類的方法列表,只需swizzle CLLocationManager中的setDelegate:方法即可。

  • 缺點:在中間代理類swizzle delegate中需要實現(xiàn)全部的CLLocationManagerDelegate方法,如果后續(xù)增加代理方法,仍需要修改這個類。

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

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

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

// MockLocationProxy.h
#import 

@interface MockLocationProxy : NSProxy

@property (nonatomic, weak, readonly, nullable) id  target;

- (instancetype)initWithTarget:(id )target;

@end
// MockLocationProxy.m
#import "MockLocationProxy.h"

@implementation MockLocationProxy

- (instancetype)initWithTarget:(id)target {
  _target = target;
  return self;
}

@end

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

所以我們在MockLocationProxy.m中添加以下方法:

// MockLocationProxy.m
@implementation MockLocationProxy

- (instancetype)initWithTarget:(id)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 *)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時,判斷當(dāng)前方法是否是locationManager:didUpdateLocations:,如果是,則MockLocationProxy響應(yīng)事件,否則直接傳遞給原本的target。到此已經(jīng)可以隨時處理模擬定位。你只需要在模擬定位的代碼做一些處理,就可以隨時修改定位。

One more.

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

LLDebugTool

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

以上就是怎么在iOS中實現(xiàn)一個模擬定位功能,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司行業(yè)資訊頻道。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


新聞標(biāo)題:怎么在iOS中實現(xiàn)一個模擬定位功能-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://weahome.cn/article/dijjgi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部