99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

iOS中怎么實現一個模擬定位功能-創新互聯

本篇文章為大家展示了iOS中怎么實現一個模擬定位功能,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

成都創新互聯公司是網站建設專家,致力于互聯網品牌建設與網絡營銷,專業領域包括成都做網站、成都網站建設、電商網站制作開發、小程序定制開發、微信營銷、系統平臺開發,與其他網站設計及系統開發公司不同,我們的整合解決方案結合了恒基網絡品牌建設經驗和互聯網整合營銷的理念,并將策略和執行緊密結合,且不斷評估并優化我們的方案,為客戶提供全方位的互聯網品牌整合方案!

1、 Runtime swizzle

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

優點:便于理解。缺點:需要遍歷所有的類和類的方法列表。

2、中間代理對象

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

優點:相對于第一種方法,不需要遍歷類和類的方法列表,只需swizzle CLLocationManager中的setDelegate:方法即可。缺點:在中間代理類swizzle delegate中需要實現全部的CLLocationManagerDelegate方法,如果后續增加代理方法,仍需要修改這個類。

3、采用NSProxy實現中間代理對象

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

3.1創建一個新的類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

接著就來處理消息轉發的邏輯,首先我們要知道我們想要的是什么效果,系統回調給MockLocationProxy,MockLocationProxy只處理locationManager:didUpdateLocations:,其他的消息都仍然交給原target。

所以我們在MockLocationProxy.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

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

One more.

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

LLDebugTool

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

上述內容就是iOS中怎么實現一個模擬定位功能,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創新互聯行業資訊頻道。

分享標題:iOS中怎么實現一個模擬定位功能-創新互聯
轉載源于:http://www.yijiale78.com/article8/djihip.html

成都網站建設公司_創新互聯,為您提供建站公司網站建設網站收錄搜索引擎優化虛擬主機靜態網站

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

外貿網站制作