├── DingtalkUI.xcworkspace ├── xcuserdata │ └── HYY.xcuserdatad │ │ └── xcdebugger │ │ └── Breakpoints_v2.xcbkptlist └── contents.xcworkspacedata ├── DingtalkUI.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── project.pbxproj ├── Podfile ├── DingtalkUI ├── MapSearchViewController.h ├── DingtalkPod.h ├── CoordinateForm.h ├── DingtalkPod.m ├── DingtalkPluginConfig.h ├── POIAnnotation.h ├── DingtalkUI.h ├── Info.plist ├── DingtalkPluginConfig.m ├── CoordinateForm.m ├── POIAnnotation.m ├── 1.0.0 │ └── DingtalkUI.podspec ├── 1.0.1 │ └── DingtalkUI.podspec ├── DingtalkUI.m └── MapSearchViewController.m ├── Podfile.lock ├── README.md └── DingtalkUI.podspec /DingtalkUI.xcworkspace/xcuserdata/HYY.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /DingtalkUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /DingtalkUI.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | source 'https://github.com/AloneMonkey/MonkeyDevSpecs.git' 2 | 3 | use_frameworks! 4 | 5 | target 'DingtalkUI' do 6 | # pod 'DingtalkPod' 7 | pod 'MDSettingCenter' 8 | pod 'CaptainHook' 9 | 10 | #高德地图 11 | pod 'AMap3DMap' 12 | pod 'AMapSearch' 13 | 14 | end 15 | -------------------------------------------------------------------------------- /DingtalkUI/MapSearchViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // MapSearchViewController.h 3 | // CaptainHook 4 | // 5 | // Created by HYY on 2017/11/24. 6 | // 7 | 8 | #import 9 | #import 10 | @interface MapSearchViewController : UIViewController 11 | 12 | @property(copy, nonatomic)void (^searchCoordinateBlock)(CLLocationCoordinate2D coordinate); 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /DingtalkUI/DingtalkPod.h: -------------------------------------------------------------------------------- 1 | // 2 | // DingtalkPod.h 3 | // DingtalkPod 4 | // 5 | // Created by jack ma on 2017/9/14. 6 | // Copyright © 2017年 jack ma. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface DingtalkPod :NSObject 13 | /** 14 | 设置经纬度 15 | 16 | @param location 经纬度 17 | */ 18 | -(void)setLocation:(CLLocationCoordinate2D) location; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /DingtalkUI/CoordinateForm.h: -------------------------------------------------------------------------------- 1 | // 2 | // CoordinateForm.h 3 | // DingtalkUI 4 | // 5 | // Created by HYY on 2017/11/21. 6 | // Copyright © 2017年 com.laiwang.DingTalk. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | @interface CoordinateForm : NSObject 12 | 13 | @property(copy, nonatomic)NSString *latitude; 14 | @property(copy, nonatomic)NSString *longitude; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /DingtalkUI/DingtalkPod.m: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // DingtalkPod.m 4 | // DingtalkPod 5 | // 6 | // Created by jack ma on 2017/9/14. 7 | // Copyright (c) 2017年 jack ma. All rights reserved. 8 | // 9 | 10 | #import "DingtalkPod.h" 11 | #import "DingtalkPluginConfig.h" 12 | #import 13 | #import 14 | 15 | @implementation DingtalkPod 16 | -(void)setLocation:(CLLocationCoordinate2D)location{ 17 | [pluginConfig setLocation:location]; 18 | } 19 | @end 20 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - CaptainHook (2.0.0) 3 | - DingtalkPod (1.0.2): 4 | - CaptainHook 5 | - MDSettingCenter (1.1.0) 6 | 7 | DEPENDENCIES: 8 | - DingtalkPod 9 | - MDSettingCenter 10 | 11 | SPEC CHECKSUMS: 12 | CaptainHook: 3889d18beaf6a87b19c9bb47f5c8348a0b275036 13 | DingtalkPod: 8a629715e388c8868556a4739763f0832c149707 14 | MDSettingCenter: 41b910206cd1d826e11247413cd48a068d38e274 15 | 16 | PODFILE CHECKSUM: 093b8a8333ed3492f23725bc7ff9521cb50acf00 17 | 18 | COCOAPODS: 1.3.1 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DingTalkUI 2 | 修改钉钉GPS打卡位置 3 | 4 | ## 1.给Dafa开发的DingtalkPod添加了视图界面 5 | http://www.cnblogs.com/DafaRan/p/7522284.html author: Dafa blog: http://www.cnblogs.com/DafaRan/ 6 | 7 | ## 2. 主要功能: 8 | ### a. 手动输入经纬度 9 | 10 | 11 | ### b. 直接搜索地理位置 12 | 13 | 14 | ### c. 地图直接选取坐标点 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /DingtalkUI/DingtalkPluginConfig.h: -------------------------------------------------------------------------------- 1 | // 2 | // DingtalkPluginConfig.h 3 | // DingtalkPod 4 | // 5 | // Created by jack ma on 2017/9/14. 6 | // Copyright © 2017年 jack ma. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @class DingtalkPluginConfig; 13 | extern DingtalkPluginConfig* pluginConfig; 14 | 15 | @interface DingtalkPluginConfig : NSObject 16 | 17 | +(DingtalkPluginConfig*)sharedInstance; 18 | /** 19 | 经纬度 20 | */ 21 | @property(nonatomic, assign) CLLocationCoordinate2D location; 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /DingtalkUI/POIAnnotation.h: -------------------------------------------------------------------------------- 1 | // 2 | // AMapSearchApiModel.h 3 | // CaptainHook 4 | // 5 | // Created by HYY on 2017/11/24. 6 | // 7 | 8 | #import 9 | #import 10 | #import 11 | 12 | @interface POIAnnotation : NSObject 13 | 14 | 15 | - (id)initWithPOI:(AMapPOI *)poi; 16 | 17 | @property(nonatomic, strong)AMapPOI *poi; 18 | @property(assign, nonatomic)CLLocationCoordinate2D coordinate; 19 | 20 | @property(nonatomic, strong)NSString *title; 21 | @property(nonatomic, strong)NSString *subtitle; 22 | // 23 | //- (NSString *)title; 24 | // 25 | //- (NSString *)subtitle; 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /DingtalkUI/DingtalkUI.h: -------------------------------------------------------------------------------- 1 | // 2 | // DingtalkUI.h 3 | // DingtalkUI 4 | // 5 | // Created by HYY on 2017/11/21. 6 | // Copyright © 2017年 com.laiwang.DingTalk. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface DingtalkUI: NSObject 13 | + (instancetype)sharedInstance; 14 | 15 | /** 16 | * @brief 添加悬浮球 17 | * @param 18 | */ 19 | - (void)addToWindow:(UIWindow *)window; 20 | 21 | @end 22 | 23 | 24 | ////! Project version number for DingtalkUI. 25 | //FOUNDATION_EXPORT double DingtalkUIVersionNumber; 26 | // 27 | ////! Project version string for DingtalkUI. 28 | //FOUNDATION_EXPORT const unsigned char DingtalkUIVersionString[]; 29 | 30 | // In this header, you should import all the public headers of your framework using statements like #import 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /DingtalkUI/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /DingtalkUI/DingtalkPluginConfig.m: -------------------------------------------------------------------------------- 1 | // 2 | // DingtalkPluginConfig.m 3 | // DingtalkPod 4 | // 5 | // Created by jack ma on 2017/9/14. 6 | // Copyright © 2017年 jack ma. All rights reserved. 7 | // 8 | #import "CaptainHook.h" 9 | #import "DingtalkPluginConfig.h" 10 | 11 | DingtalkPluginConfig* pluginConfig = nil; 12 | 13 | @implementation DingtalkPluginConfig 14 | +(DingtalkPluginConfig *)sharedInstance{ 15 | static id sharedInstance; 16 | static dispatch_once_t onceToken; 17 | dispatch_once(&onceToken, ^{ 18 | sharedInstance = [self new]; 19 | }); 20 | return sharedInstance; 21 | } 22 | 23 | - (instancetype)init 24 | { 25 | self = [super init]; 26 | if (self) { 27 | 28 | _location = CLLocationCoordinate2DMake(0, 0); 29 | 30 | } 31 | return self; 32 | } 33 | 34 | @end 35 | 36 | CHConstructor{ 37 | pluginConfig = [DingtalkPluginConfig sharedInstance]; 38 | } 39 | 40 | 41 | -------------------------------------------------------------------------------- /DingtalkUI/CoordinateForm.m: -------------------------------------------------------------------------------- 1 | // 2 | // CoordinateForm.m 3 | // DingtalkUI 4 | // 5 | // Created by HYY on 2017/11/21. 6 | // Copyright © 2017年 com.laiwang.DingTalk. All rights reserved. 7 | // 8 | 9 | #import "CoordinateForm.h" 10 | 11 | @implementation CoordinateForm 12 | 13 | 14 | - (NSDictionary *)latitudeField{ 15 | return @{FXFormFieldTitle:@"纬度", 16 | FXFormFieldHeader:@"修改位置", 17 | }; 18 | } 19 | 20 | - (NSDictionary *)longitudeField{ 21 | return @{FXFormFieldTitle:@"经度", 22 | }; 23 | } 24 | 25 | - (NSArray *)extraFields{ 26 | return @[ 27 | // @{FXFormFieldTitle:@"提交", 28 | // FXFormFieldHeader:@"", 29 | // FXFormFieldAction:@"modifyCoordinate" 30 | // }, 31 | @{FXFormFieldTitle:@"本地搜索", 32 | FXFormFieldHeader:@"", 33 | FXFormFieldAction:@"searchCoordinate" 34 | }, 35 | 36 | // @{FXFormFieldTitle:@"高德地图搜索", 37 | // FXFormFieldHeader:@"", 38 | // FXFormFieldAction:@"aMapsearchCoordinate" 39 | // } 40 | // 41 | ]; 42 | } 43 | 44 | 45 | @end 46 | 47 | -------------------------------------------------------------------------------- /DingtalkUI/POIAnnotation.m: -------------------------------------------------------------------------------- 1 | // 2 | // AMapSearchApiModel.m 3 | // CaptainHook 4 | // 5 | // Created by HYY on 2017/11/24. 6 | // 7 | 8 | #import "POIAnnotation.h" 9 | @interface POIAnnotation () 10 | //@property(nonatomic, strong,readwrite)AMapPOI *poi; 11 | @end 12 | 13 | @implementation POIAnnotation 14 | 15 | //- (NSString *)title{ 16 | // return self.poi.name; 17 | //} 18 | // 19 | //- (NSString *)subtitle{ 20 | // return self.poi.address; 21 | //} 22 | 23 | //- (void)setTitle:(NSString *)title{ 24 | // if (_title != title) { 25 | // _title = title; 26 | // } 27 | //} 28 | // 29 | //- (void)setSubtitle:(NSString *)subtitle{ 30 | // if (_subtitle != subtitle) { 31 | // _subtitle = subtitle; 32 | // } 33 | //} 34 | 35 | //- (CLLocationCoordinate2D)coordinate{ 36 | // return CLLocationCoordinate2DMake(self.poi.location.latitude, self.poi.location.longitude); 37 | //} 38 | 39 | #pragma mark - life cycle 40 | - (id)initWithPOI:(AMapPOI *)poi{ 41 | if (self = [super init]) { 42 | self.poi = poi; 43 | self.title = poi.name; 44 | self.subtitle = poi.address; 45 | self.coordinate = CLLocationCoordinate2DMake(self.poi.location.latitude, self.poi.location.longitude); 46 | } 47 | return self; 48 | } 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /DingtalkUI/1.0.0/DingtalkUI.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |spec| 2 | spec.name = "DingtalkUI" #Pod的名字 3 | spec.version = "1.0.1" #版本号 4 | spec.summary = "DingtalkUI for DingtalkPod [MonkeyDev]" 5 | spec.description = "DingtalkPod 修改钉钉GPS打卡位置,需要MonkeyDev" 6 | 7 | spec.homepage = "https://github.com/NearEven/DingTalkUI" #Pod的地址 8 | 9 | # spec.license = { :type => "MIT", :file => "LICENSE" } #License 10 | spec.author = { "NearEven" => "nearby.xu@gmail.com}" } #作者 11 | spec.social_media_url = "http://evenxu.cc" #weibo 12 | spec.platform = :ios, "8.0" #平台、版本 13 | spec.source = :git => "https://github.com/NearEven/DingTalkUI.git" #代码的git地址以及tag 14 | spec.source_files = "DingtalkUI/*.{h,m}" #本地验证,表示当前目录以及子目录的所有h或m结尾的文件 如果发布到MonkeyPodSpecs需要填写git clone下来的对应的路径 15 | spec.public_header_files = "DingtalkUI/DingtalkUI.h" #需要对外导出的头文件 此处为本地验证 16 | spec.requires_arc = true #ARC 17 | spec.pod_target_xcconfig = { "ONLY_ACTIVE_ARCH" => "NO", 'HEADER_SEARCH_PATHS' => '/opt/MonkeyDev/include' } #这个必须有,不要修改 18 | spec.dependency 'DingtalkPod' 19 | spec.dependency 'MDSettingCenter' 20 | spec.dependency 'AMap3DMap' 21 | spec.dependency 'AMapSearch' 22 | end 23 | 24 | -------------------------------------------------------------------------------- /DingtalkUI/1.0.1/DingtalkUI.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |spec| 2 | spec.name = "DingtalkUI" #Pod的名字 3 | spec.version = "1.0.1" #版本号 4 | spec.summary = "DingtalkUI for DingtalkPod [MonkeyDev]" 5 | spec.description = "DingtalkPod 修改钉钉GPS打卡位置,需要MonkeyDev" 6 | 7 | spec.homepage = "https://github.com/NearEven/DingTalkUI" #Pod的地址 8 | 9 | # spec.license = { :type => "MIT", :file => "LICENSE" } #License 10 | spec.author = { "NearEven" => "nearby.xu@gmail.com" } #作者 11 | spec.social_media_url = "http://evenxu.cc" #weibo 12 | spec.platform = :ios, "8.0" #平台、版本 13 | spec.source = { :git => "https://github.com/NearEven/DingTalkUI.git" } #代码的git地址以及tag 14 | spec.source_files = "DingtalkUI/*.{h,m}" #本地验证,表示当前目录以及子目录的所有h或m结尾的文件 如果发布到MonkeyPodSpecs需要填写git clone下来的对应的路径 15 | spec.public_header_files = "DingtalkUI/DingtalkUI.h" #需要对外导出的头文件 此处为本地验证 16 | spec.requires_arc = true #ARC 17 | spec.pod_target_xcconfig = { "ONLY_ACTIVE_ARCH" => "NO", 'HEADER_SEARCH_PATHS' => '/opt/MonkeyDev/include' } #这个必须有,不要修改 18 | 19 | spec.dependency 'DingtalkPod' 20 | spec.dependency 'MDSettingCenter' 21 | # spec.dependency 'AMap3DMap' 22 | # spec.dependency 'AMapSearch' 23 | end 24 | 25 | -------------------------------------------------------------------------------- /DingtalkUI.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |spec| 2 | spec.name = "DingtalkUI" #Pod的名字 3 | spec.version = "1.0.2" #版本号 4 | spec.summary = "DingtalkUI for DingtalkPod [MonkeyDev]" 5 | spec.description = "DingtalkPod 修改钉钉GPS打卡位置,需要MonkeyDev" 6 | 7 | spec.homepage = "https://github.com/NearEven/DingTalkUI" #Pod的地址 8 | 9 | # spec.license = { :type => "MIT", :file => "LICENSE" } #License 10 | spec.author = { "NearEven" => "nearby.xu@gmail.com}" } #作者 11 | spec.social_media_url = "http://evenxu.cc" #weibo 12 | spec.platform = :ios, "8.0" #平台、版本 13 | spec.source = {:git => "https://github.com/NearEven/DingTalkUI.git"} #代码的git地址以及tag 14 | 15 | spec.source_files = "DingtalkUI/*.{h,m}" 16 | 17 | #本地验证,表示当前目录以及子目录的所有h或m结尾的文件 如果发布到MonkeyPodSpecs需要填写git clone下来的对应的路径ßsßß 18 | spec.public_header_files = "DingtalkUI/DingtalkUI.h" #需要对外导出的头文件 此处为本地验证 19 | spec.requires_arc = true #ARC 20 | spec.pod_target_xcconfig = { "ONLY_ACTIVE_ARCH" => "NO", 'HEADER_SEARCH_PATHS' => '/opt/MonkeyDev/include' } #这个必须有,不要修改 21 | 22 | 23 | spec.dependency 'MDSettingCenter' 24 | spec.dependency 'CaptainHook' 25 | spec.dependency 'AMap3DMap' 26 | spec.dependency 'AMapSearch' 27 | end 28 | 29 | -------------------------------------------------------------------------------- /DingtalkUI/DingtalkUI.m: -------------------------------------------------------------------------------- 1 | // weibo: http://weibo.com/xiaoqing28 2 | // blog: http://www.alonemonkey.com 3 | // 4 | // DingtalkUI.m 5 | // DingtalkUI 6 | // 7 | // Created by HYY on 2017/11/21. 8 | // Copyright (c) 2017年 com.laiwang.DingTalk. All rights reserved. 9 | // 10 | 11 | #import "DingtalkUI.h" 12 | #import 13 | #import "CaptainHook.h" 14 | #import 15 | #import 16 | #import "DingtalkUI.h" 17 | #import "CoordinateForm.h" 18 | #import "MapSearchViewController.h" 19 | #import 20 | #import "POIAnnotation.h" 21 | #import "DingtalkPluginConfig.h" 22 | #import "DingtalkPod.h" 23 | 24 | @implementation DingtalkUI 25 | 26 | + (instancetype)sharedInstance{ 27 | static DingtalkUI *instance = nil; 28 | static dispatch_once_t onceToken; 29 | dispatch_once(&onceToken, ^{ 30 | instance = [[DingtalkUI alloc] init]; 31 | }); 32 | return instance; 33 | } 34 | 35 | // 添加悬浮球 36 | - (void)addToWindow:(UIWindow *)window{ 37 | MDSuspendBall *ballInstance = [MDSuspendBall sharedInstance]; 38 | [ballInstance addToWindow:window]; 39 | } 40 | @end 41 | 42 | CHDeclareClass(MDSettingsViewController) 43 | 44 | // 设置fxform 45 | CHOptimizedMethod0(self, void,MDSettingsViewController, setupSubViews){ 46 | CHSuper0(MDSettingsViewController, setupSubViews); 47 | FXFormController *controller = [self valueForKeyPath:@"formController"]; 48 | CoordinateForm *cForm = [[CoordinateForm alloc] init]; 49 | controller.form = cForm; 50 | } 51 | 52 | // 设置coordinate 53 | CHDeclareMethod0(void, MDSettingsViewController, modifyCoordinate){ 54 | FXFormController *controller = [self valueForKeyPath:@"formController"]; 55 | CoordinateForm *form = controller.form; 56 | CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake([form.latitude doubleValue], [form.longitude doubleValue]); 57 | [[DingtalkPod alloc] setLocation:coordinate]; 58 | } 59 | 60 | // 搜索coordinate 61 | CHDeclareMethod0(void, MDSettingsViewController, searchCoordinate){ 62 | MapSearchViewController *mapController = [[MapSearchViewController alloc] init]; 63 | [mapController setSearchCoordinateBlock:^(CLLocationCoordinate2D coordinate) { 64 | [[DingtalkPod alloc] setLocation:coordinate]; 65 | FXFormController *controller = [self valueForKeyPath:@"formController"]; 66 | CoordinateForm *form = controller.form; 67 | form.latitude = [@(coordinate.latitude) stringValue]; 68 | form.longitude = [@(coordinate.longitude) stringValue]; 69 | }]; 70 | 71 | [self.navigationController pushViewController:mapController animated:YES]; 72 | } 73 | 74 | CHDeclareMethod0(void, MDSettingsViewController, aMapsearchCoordinate){ 75 | NSURL *scheme = [NSURL URLWithString:@"iosamap://"]; 76 | BOOL canOpen = [[UIApplication sharedApplication] canOpenURL:scheme]; 77 | 78 | NSURL *myLocationScheme = [NSURL URLWithString:@"iosamap://myLocation?sourceApplication=DingTalk"]; 79 | if (canOpen) { 80 | if ([[UIDevice currentDevice].systemVersion integerValue] >= 10) { //iOS10以后,使用新API 81 | [[UIApplication sharedApplication] openURL:myLocationScheme options:@{} completionHandler:^(BOOL success) { 82 | NSLog(@"scheme调用结束"); }]; 83 | 84 | } else { //iOS10以前,使用旧API 85 | [[UIApplication sharedApplication] openURL:myLocationScheme]; 86 | 87 | } 88 | } 89 | 90 | 91 | 92 | 93 | } 94 | 95 | CHOptimizedMethod0(self, void, MDSettingsViewController, exit){ 96 | 97 | FXFormController *controller = [self valueForKeyPath:@"formController"]; 98 | CoordinateForm *form = controller.form; 99 | CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake([form.latitude doubleValue], [form.longitude doubleValue]); 100 | [[DingtalkPod alloc] setLocation:coordinate]; 101 | UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"修改成功" message:@"sdafasdf" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil]; 102 | [[UIApplication sharedApplication].keyWindow addSubview:alert]; 103 | 104 | CHSuper0(MDSettingsViewController, exit); 105 | } 106 | 107 | 108 | CHConstructor{ 109 | CHLoadLateClass(MDSettingsViewController); 110 | CHHook0(MDSettingsViewController, setupSubViews); 111 | CHHook0(MDSettingsViewController, exit); 112 | } 113 | 114 | 115 | 116 | 117 | #pragma mark -- uri调用高德地图进行搜索 118 | 119 | 120 | 121 | 122 | 123 | 124 | #pragma mark - DingtalkPod 125 | // http://www.cnblogs.com/DafaRan/p/7522284.html author: Dafa blog: http://www.cnblogs.com/DafaRan/ 126 | 127 | CHDeclareClass(CLLocation); 128 | 129 | CHOptimizedMethod0(self, CLLocationCoordinate2D, CLLocation, coordinate){ 130 | CLLocationCoordinate2D coordinate = CHSuper(0, CLLocation, coordinate); 131 | if(pluginConfig.location.longitude || pluginConfig.location.latitude ){ 132 | coordinate = pluginConfig.location; 133 | } 134 | return coordinate; 135 | } 136 | 137 | CHConstructor{ 138 | CHLoadLateClass(CLLocation); 139 | CHClassHook(0, CLLocation, coordinate); 140 | } 141 | 142 | 143 | CHDeclareClass(AMapGeoFenceManager); 144 | CHMethod(0, BOOL,AMapGeoFenceManager,detectRiskOfFakeLocation){ 145 | 146 | return NO; 147 | } 148 | CHMethod(0, BOOL,AMapGeoFenceManager,pausesLocationUpdatesAutomatically){ 149 | 150 | return NO; 151 | } 152 | CHConstructor{ 153 | CHLoadLateClass(AMapGeoFenceManager); 154 | CHClassHook(0, AMapGeoFenceManager,detectRiskOfFakeLocation); 155 | CHClassHook(0, AMapGeoFenceManager,pausesLocationUpdatesAutomatically); 156 | } 157 | 158 | 159 | 160 | 161 | CHDeclareClass(AMapLocationManager); 162 | CHMethod(0, BOOL,AMapLocationManager,detectRiskOfFakeLocation){ 163 | 164 | return NO; 165 | } 166 | CHMethod(0, BOOL,AMapLocationManager,pausesLocationUpdatesAutomatically){ 167 | 168 | return NO; 169 | } 170 | CHConstructor{ 171 | CHLoadLateClass(AMapLocationManager); 172 | CHClassHook(0, AMapLocationManager,detectRiskOfFakeLocation); 173 | CHClassHook(0, AMapLocationManager,pausesLocationUpdatesAutomatically); 174 | } 175 | 176 | 177 | 178 | 179 | 180 | CHDeclareClass(DTALocationManager); 181 | CHMethod(0, BOOL,DTALocationManager,detectRiskOfFakeLocation){ 182 | 183 | return NO; 184 | } 185 | CHMethod(0, BOOL,DTALocationManager,dt_pausesLocationUpdatesAutomatically){ 186 | 187 | return NO; 188 | } 189 | CHConstructor{ 190 | CHLoadLateClass(DTALocationManager); 191 | CHClassHook(0, DTALocationManager,detectRiskOfFakeLocation); 192 | CHClassHook(0, DTALocationManager,dt_pausesLocationUpdatesAutomatically); 193 | } 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | -------------------------------------------------------------------------------- /DingtalkUI/MapSearchViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // MapSearchViewController.m 3 | // CaptainHook 4 | // 5 | // Created by HYY on 2017/11/24. 6 | // 7 | 8 | #import "MapSearchViewController.h" 9 | #import "CaptainHook.h" 10 | #import 11 | //#import 12 | #import 13 | #import 14 | #import "POIAnnotation.h" 15 | #import 16 | 17 | @interface MapSearchCell: UITableViewCell 18 | @property(nonatomic, strong)UILabel *titlLabel; 19 | @property(nonatomic, strong)UILabel *subTitleLabel; 20 | @end 21 | 22 | @interface MapSearchViewController () 23 | @property(nonatomic, strong)AMapSearchAPI *search; 24 | @property(nonatomic, strong)MAMapView *mapView; 25 | @property(nonatomic, strong)UISearchBar *searchBar; 26 | @property(nonatomic, strong)UITableView *table; 27 | @property(nonatomic, strong)POIAnnotation *searchModel; 28 | @property(copy, nonatomic)NSArray *searchArr; 29 | @property(nonatomic, strong)POIAnnotation *poiAnnotation; 30 | @end 31 | 32 | @implementation MapSearchViewController 33 | 34 | - (void)viewDidLoad { 35 | [super viewDidLoad]; 36 | self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:self action:@selector(backItemAction)]; 37 | self.view.backgroundColor = [UIColor whiteColor]; 38 | [self initMapView]; 39 | self.navigationItem.titleView = self.searchBar; 40 | self.search = [[AMapSearchAPI alloc] init]; 41 | self.search.delegate = self; 42 | } 43 | 44 | - (void)initMapView{ 45 | self.mapView = [[MAMapView alloc] initWithFrame:self.view.bounds]; 46 | self.mapView.delegate = self; 47 | self.mapView.showsUserLocation = NO; 48 | self.mapView.userTrackingMode = MAUserTrackingModeFollow; 49 | [self.mapView setZoomLevel:17 animated:YES]; 50 | self.mapView.touchPOIEnabled = YES; 51 | [self.view addSubview:self.mapView]; 52 | 53 | UIView *zoomPannelView = [self makeZoomPannelView]; 54 | [self.mapView addSubview:zoomPannelView]; 55 | } 56 | 57 | - (void)backItemAction{ 58 | [self.navigationController popViewControllerAnimated:YES]; 59 | } 60 | 61 | - (UIView *)makeZoomPannelView 62 | { 63 | UIView *ret = [[UIView alloc] initWithFrame:CGRectMake(self.view.frame.size.width - 60, self.view.frame.size.height - 105, 53, 98)]; 64 | ret.backgroundColor = [UIColor lightGrayColor]; 65 | 66 | UIButton *incBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 53, 49)]; 67 | incBtn.backgroundColor = [UIColor whiteColor]; 68 | [incBtn setTitle:@"+" forState:UIControlStateNormal]; 69 | incBtn.titleLabel.font = [UIFont systemFontOfSize:30]; 70 | [incBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 71 | [incBtn addTarget:self action:@selector(zoomPlusAction) forControlEvents:UIControlEventTouchUpInside]; 72 | 73 | UIButton *decBtn = [[UIButton alloc] initWithFrame:CGRectMake(0, 51, 53, 49)]; 74 | decBtn.backgroundColor = [UIColor whiteColor]; 75 | [decBtn setTitle:@"-" forState:UIControlStateNormal]; 76 | decBtn.titleLabel.font = [UIFont systemFontOfSize:30]; 77 | [decBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 78 | [decBtn addTarget:self action:@selector(zoomMinusAction) forControlEvents:UIControlEventTouchUpInside]; 79 | 80 | 81 | [ret addSubview:incBtn]; 82 | [ret addSubview:decBtn]; 83 | 84 | return ret; 85 | } 86 | 87 | - (void)zoomPlusAction 88 | { 89 | CGFloat oldZoom = self.mapView.zoomLevel; 90 | [self.mapView setZoomLevel:(oldZoom + 1) animated:YES]; 91 | self.mapView.showsScale = YES; 92 | } 93 | 94 | - (void)zoomMinusAction 95 | { 96 | CGFloat oldZoom = self.mapView.zoomLevel; 97 | [self.mapView setZoomLevel:(oldZoom - 1) animated:YES]; 98 | self.mapView.showsScale = NO; 99 | } 100 | 101 | 102 | - (UITableView *)table{ 103 | if (!_table) { 104 | _table = ({ 105 | UITableView *table = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; 106 | [self.view addSubview:table]; 107 | table.delegate =self; 108 | table.dataSource =self; 109 | 110 | table; 111 | }); 112 | } 113 | return _table; 114 | } 115 | 116 | - (UISearchBar *)searchBar{ 117 | if (!_searchBar) { 118 | _searchBar = ({ 119 | UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; 120 | searchBar.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth; 121 | searchBar.barStyle = UIBarStyleDefault; 122 | searchBar.delegate = self; 123 | searchBar.placeholder = @"输入查询地址"; 124 | searchBar.keyboardType = UIKeyboardTypeDefault; 125 | [searchBar sizeToFit]; 126 | searchBar; 127 | }); 128 | } 129 | return _searchBar; 130 | } 131 | 132 | #pragma mark - UISearchBarDelegate 133 | - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 134 | { 135 | [self.searchBar setShowsCancelButton:YES]; 136 | } 137 | 138 | - (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar 139 | { 140 | [self.searchBar setShowsCancelButton:NO]; 141 | self.table.hidden = false; 142 | } 143 | 144 | - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 145 | { 146 | [self.searchBar resignFirstResponder]; 147 | self.table.hidden = YES; 148 | } 149 | 150 | - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 151 | [self.searchBar resignFirstResponder]; 152 | 153 | if(self.searchBar.text.length == 0) { 154 | return; 155 | } 156 | 157 | [self searchPoiByKeyword:self.searchBar.text]; 158 | } 159 | 160 | #pragma mark - MAMapViewDelegate 161 | 162 | - (void)mapView:(MAMapView *)mapView annotationView:(MAAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 163 | { 164 | id annotation = view.annotation; 165 | 166 | if ([annotation isKindOfClass:[POIAnnotation class]]) 167 | { 168 | POIAnnotation *poiAnnotation = (POIAnnotation*)annotation; 169 | if (self.searchCoordinateBlock) { 170 | self.searchCoordinateBlock(poiAnnotation.coordinate); 171 | } 172 | [self.navigationController popViewControllerAnimated:YES]; 173 | } 174 | 175 | } 176 | 177 | - (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id)annotation 178 | { 179 | 180 | if ([annotation isKindOfClass:[POIAnnotation class]]) 181 | { 182 | static NSString *poiIdentifier = @"poiIdentifier"; 183 | MAPinAnnotationView *poiAnnotationView = (MAPinAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:poiIdentifier]; 184 | if (poiAnnotationView == nil) 185 | { 186 | poiAnnotationView = [[MAPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:poiIdentifier]; 187 | } 188 | poiAnnotationView.draggable = YES; 189 | 190 | poiAnnotationView.canShowCallout = YES; 191 | poiAnnotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeInfoDark]; 192 | 193 | return poiAnnotationView; 194 | } 195 | 196 | return nil; 197 | } 198 | 199 | - (POIAnnotation *)annotationForTouchPoi:(MATouchPoi *)touchPoi{ 200 | if (touchPoi) { 201 | POIAnnotation *annotation = [[POIAnnotation alloc] init]; 202 | annotation.title = touchPoi.name; 203 | annotation.coordinate = touchPoi.coordinate; 204 | return annotation; 205 | } 206 | return nil; 207 | } 208 | 209 | - (void)mapView:(MAMapView *)mapView didTouchPois:(NSArray *)pois{ 210 | if (pois.count) { 211 | POIAnnotation *annotation = [self annotationForTouchPoi:pois[0]]; 212 | [self.mapView removeAnnotation:(id)self.poiAnnotation]; 213 | [self.mapView addAnnotation:(id)annotation]; 214 | [self.mapView selectAnnotation:(id)annotation animated:YES]; 215 | self.poiAnnotation = annotation; 216 | } 217 | } 218 | 219 | #pragma mark - AMapSearchDelegate 220 | - (void)AMapSearchRequest:(id)request didFailWithError:(NSError *)error 221 | { 222 | } 223 | 224 | /* POI 搜索回调. */ 225 | - (void)onPOISearchDone:(AMapPOISearchBaseRequest *)request response:(AMapPOISearchResponse *)response 226 | { 227 | [self.mapView removeAnnotations:self.mapView.annotations]; 228 | 229 | if (response.pois.count == 0) 230 | { 231 | return; 232 | } 233 | 234 | NSMutableArray *poiAnnotations = [NSMutableArray arrayWithCapacity:response.pois.count]; 235 | 236 | [response.pois enumerateObjectsUsingBlock:^(AMapPOI *obj, NSUInteger idx, BOOL *stop) { 237 | [poiAnnotations addObject:[[POIAnnotation alloc] initWithPOI:obj]]; 238 | 239 | }]; 240 | 241 | /* 将结果以annotation的形式加载到地图上. */ 242 | [self.mapView addAnnotations:poiAnnotations]; 243 | self.searchArr = [NSArray arrayWithArray:poiAnnotations]; 244 | 245 | /* 如果只有一个结果,设置其为中心点. */ 246 | // if (poiAnnotations.count == 1) 247 | // { 248 | // [self.mapView setCenterCoordinate:[poiAnnotations[0] coordinate]]; 249 | // } 250 | // /* 如果有多个结果, 设置地图使所有的annotation都可见. */ 251 | // else 252 | // { 253 | // [self.mapView showAnnotations:poiAnnotations animated:NO]; 254 | // } 255 | [self.table reloadData]; 256 | } 257 | 258 | #pragma mark - tableviewDelegate 259 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 260 | return 70; 261 | } 262 | 263 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 264 | return self.searchArr.count; 265 | } 266 | 267 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 268 | return 1; 269 | } 270 | 271 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 272 | static NSString *iden = @"iden"; 273 | MapSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:iden]; 274 | if (!cell) { 275 | cell = [[MapSearchCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:iden]; 276 | } 277 | POIAnnotation *annotation = self.searchArr[indexPath.row]; 278 | cell.titlLabel.text = annotation.title; 279 | cell.subTitleLabel.text = annotation.subtitle; 280 | return cell; 281 | } 282 | 283 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 284 | [tableView deselectRowAtIndexPath:indexPath animated:YES]; 285 | self.table.hidden = YES; 286 | POIAnnotation *annotation = self.searchArr[indexPath.row]; 287 | [self.mapView removeAnnotation:(id)self.poiAnnotation]; 288 | [self.mapView addAnnotation:(id)annotation]; 289 | [self.mapView selectAnnotation:(id)annotation animated:YES]; 290 | self.poiAnnotation = annotation; 291 | 292 | } 293 | 294 | #pragma mark - Utility 295 | /* 根据关键字来搜索POI. */ 296 | - (void)searchPoiByKeyword:(NSString *)keyword 297 | { 298 | AMapPOIKeywordsSearchRequest *request = [[AMapPOIKeywordsSearchRequest alloc] init]; 299 | request.keywords = keyword; 300 | request.requireExtension = YES; 301 | // 302 | // /* 搜索SDK 3.2.0 中新增加的功能,只搜索本城市的POI。*/ 303 | request.cityLimit = YES; 304 | request.requireSubPOIs = YES; 305 | 306 | [self.search AMapPOIKeywordsSearch:request]; 307 | } 308 | 309 | @end 310 | 311 | 312 | 313 | @implementation MapSearchCell 314 | - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{ 315 | if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 316 | UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, self.frame.size.width-20, 20)]; 317 | [self.contentView addSubview:titleLabel]; 318 | _titlLabel = titleLabel; 319 | 320 | UILabel *subTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, titleLabel.frame.size.width, 40)]; 321 | subTitleLabel.numberOfLines = 0; 322 | subTitleLabel.font = [UIFont systemFontOfSize:12]; 323 | subTitleLabel.textColor = [UIColor grayColor]; 324 | [self.contentView addSubview:subTitleLabel]; 325 | _subTitleLabel = subTitleLabel; 326 | 327 | } 328 | return self; 329 | } 330 | 331 | @end 332 | 333 | -------------------------------------------------------------------------------- /DingtalkUI.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 2D5FAC0AC6DB118E9D3DCBB4 /* Pods_DingtalkUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F8AEECC7D926BD26D5CC5AC8 /* Pods_DingtalkUI.framework */; }; 11 | 647CF7DD1FC3F32000DF3739 /* DingtalkUI.m in Sources */ = {isa = PBXBuildFile; fileRef = 647CF7DC1FC3F32000DF3739 /* DingtalkUI.m */; }; 12 | 647CF7E11FC3F32000DF3739 /* DingtalkUI.h in Headers */ = {isa = PBXBuildFile; fileRef = 647CF7DB1FC3F32000DF3739 /* DingtalkUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | 647CF7E91FC3F75A00DF3739 /* CoordinateForm.h in Headers */ = {isa = PBXBuildFile; fileRef = 647CF7E71FC3F75A00DF3739 /* CoordinateForm.h */; }; 14 | 647CF7EA1FC3F75A00DF3739 /* CoordinateForm.m in Sources */ = {isa = PBXBuildFile; fileRef = 647CF7E81FC3F75A00DF3739 /* CoordinateForm.m */; }; 15 | 64EA6EB61FCBEE2300F76E70 /* DingtalkPluginConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 64EA6EAD1FCBEE2200F76E70 /* DingtalkPluginConfig.m */; }; 16 | 64EA6EB71FCBEE2300F76E70 /* POIAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 64EA6EAE1FCBEE2200F76E70 /* POIAnnotation.m */; }; 17 | 64EA6EB81FCBEE2300F76E70 /* MapSearchViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 64EA6EAF1FCBEE2200F76E70 /* MapSearchViewController.h */; }; 18 | 64EA6EB91FCBEE2300F76E70 /* MapSearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 64EA6EB01FCBEE2200F76E70 /* MapSearchViewController.m */; }; 19 | 64EA6EBA1FCBEE2300F76E70 /* DingtalkPod.m in Sources */ = {isa = PBXBuildFile; fileRef = 64EA6EB11FCBEE2300F76E70 /* DingtalkPod.m */; }; 20 | 64EA6EBB1FCBEE2300F76E70 /* POIAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = 64EA6EB21FCBEE2300F76E70 /* POIAnnotation.h */; }; 21 | 64EA6EBC1FCBEE2300F76E70 /* dingdingDylib.m in Sources */ = {isa = PBXBuildFile; fileRef = 64EA6EB31FCBEE2300F76E70 /* dingdingDylib.m */; }; 22 | 64EA6EBD1FCBEE2300F76E70 /* DingtalkPod.h in Headers */ = {isa = PBXBuildFile; fileRef = 64EA6EB41FCBEE2300F76E70 /* DingtalkPod.h */; }; 23 | 64EA6EBE1FCBEE2300F76E70 /* DingtalkPluginConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 64EA6EB51FCBEE2300F76E70 /* DingtalkPluginConfig.h */; }; 24 | /* End PBXBuildFile section */ 25 | 26 | /* Begin PBXFileReference section */ 27 | 4DCEA75CC3D7817BF161B6F3 /* Pods-DingtalkUI.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DingtalkUI.release.xcconfig"; path = "Pods/Target Support Files/Pods-DingtalkUI/Pods-DingtalkUI.release.xcconfig"; sourceTree = ""; }; 28 | 647CF7D81FC3F32000DF3739 /* DingtalkUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DingtalkUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | 647CF7DB1FC3F32000DF3739 /* DingtalkUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DingtalkUI.h; sourceTree = ""; }; 30 | 647CF7DC1FC3F32000DF3739 /* DingtalkUI.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DingtalkUI.m; sourceTree = ""; }; 31 | 647CF7E01FC3F32000DF3739 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 32 | 647CF7E71FC3F75A00DF3739 /* CoordinateForm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoordinateForm.h; sourceTree = ""; }; 33 | 647CF7E81FC3F75A00DF3739 /* CoordinateForm.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CoordinateForm.m; sourceTree = ""; }; 34 | 64EA6EAD1FCBEE2200F76E70 /* DingtalkPluginConfig.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DingtalkPluginConfig.m; sourceTree = ""; }; 35 | 64EA6EAE1FCBEE2200F76E70 /* POIAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = POIAnnotation.m; sourceTree = ""; }; 36 | 64EA6EAF1FCBEE2200F76E70 /* MapSearchViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MapSearchViewController.h; sourceTree = ""; }; 37 | 64EA6EB01FCBEE2200F76E70 /* MapSearchViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MapSearchViewController.m; sourceTree = ""; }; 38 | 64EA6EB11FCBEE2300F76E70 /* DingtalkPod.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DingtalkPod.m; sourceTree = ""; }; 39 | 64EA6EB21FCBEE2300F76E70 /* POIAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = POIAnnotation.h; sourceTree = ""; }; 40 | 64EA6EB31FCBEE2300F76E70 /* dingdingDylib.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = dingdingDylib.m; sourceTree = ""; }; 41 | 64EA6EB41FCBEE2300F76E70 /* DingtalkPod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DingtalkPod.h; sourceTree = ""; }; 42 | 64EA6EB51FCBEE2300F76E70 /* DingtalkPluginConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DingtalkPluginConfig.h; sourceTree = ""; }; 43 | F7A5CAC06DC5BBE1965CA117 /* Pods-DingtalkUI.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DingtalkUI.debug.xcconfig"; path = "Pods/Target Support Files/Pods-DingtalkUI/Pods-DingtalkUI.debug.xcconfig"; sourceTree = ""; }; 44 | F8AEECC7D926BD26D5CC5AC8 /* Pods_DingtalkUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DingtalkUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 647CF7D41FC3F32000DF3739 /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | 2D5FAC0AC6DB118E9D3DCBB4 /* Pods_DingtalkUI.framework in Frameworks */, 53 | ); 54 | runOnlyForDeploymentPostprocessing = 0; 55 | }; 56 | /* End PBXFrameworksBuildPhase section */ 57 | 58 | /* Begin PBXGroup section */ 59 | 0DDD9342B5776E1FBC5B38E7 /* Frameworks */ = { 60 | isa = PBXGroup; 61 | children = ( 62 | F8AEECC7D926BD26D5CC5AC8 /* Pods_DingtalkUI.framework */, 63 | ); 64 | name = Frameworks; 65 | sourceTree = ""; 66 | }; 67 | 5AE3728BC7025D8FD52C3CB0 /* Pods */ = { 68 | isa = PBXGroup; 69 | children = ( 70 | F7A5CAC06DC5BBE1965CA117 /* Pods-DingtalkUI.debug.xcconfig */, 71 | 4DCEA75CC3D7817BF161B6F3 /* Pods-DingtalkUI.release.xcconfig */, 72 | ); 73 | name = Pods; 74 | sourceTree = ""; 75 | }; 76 | 647CF7CE1FC3F31F00DF3739 = { 77 | isa = PBXGroup; 78 | children = ( 79 | 647CF7DA1FC3F32000DF3739 /* DingtalkUI */, 80 | 647CF7D91FC3F32000DF3739 /* Products */, 81 | 5AE3728BC7025D8FD52C3CB0 /* Pods */, 82 | 0DDD9342B5776E1FBC5B38E7 /* Frameworks */, 83 | ); 84 | sourceTree = ""; 85 | }; 86 | 647CF7D91FC3F32000DF3739 /* Products */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 647CF7D81FC3F32000DF3739 /* DingtalkUI.framework */, 90 | ); 91 | name = Products; 92 | sourceTree = ""; 93 | }; 94 | 647CF7DA1FC3F32000DF3739 /* DingtalkUI */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 647CF7DB1FC3F32000DF3739 /* DingtalkUI.h */, 98 | 647CF7DC1FC3F32000DF3739 /* DingtalkUI.m */, 99 | 647CF7E01FC3F32000DF3739 /* Info.plist */, 100 | 647CF7E71FC3F75A00DF3739 /* CoordinateForm.h */, 101 | 647CF7E81FC3F75A00DF3739 /* CoordinateForm.m */, 102 | 64EA6EB31FCBEE2300F76E70 /* dingdingDylib.m */, 103 | 64EA6EB51FCBEE2300F76E70 /* DingtalkPluginConfig.h */, 104 | 64EA6EAD1FCBEE2200F76E70 /* DingtalkPluginConfig.m */, 105 | 64EA6EB41FCBEE2300F76E70 /* DingtalkPod.h */, 106 | 64EA6EB11FCBEE2300F76E70 /* DingtalkPod.m */, 107 | 64EA6EAF1FCBEE2200F76E70 /* MapSearchViewController.h */, 108 | 64EA6EB01FCBEE2200F76E70 /* MapSearchViewController.m */, 109 | 64EA6EB21FCBEE2300F76E70 /* POIAnnotation.h */, 110 | 64EA6EAE1FCBEE2200F76E70 /* POIAnnotation.m */, 111 | ); 112 | path = DingtalkUI; 113 | sourceTree = ""; 114 | }; 115 | /* End PBXGroup section */ 116 | 117 | /* Begin PBXHeadersBuildPhase section */ 118 | 647CF7D51FC3F32000DF3739 /* Headers */ = { 119 | isa = PBXHeadersBuildPhase; 120 | buildActionMask = 2147483647; 121 | files = ( 122 | 64EA6EBD1FCBEE2300F76E70 /* DingtalkPod.h in Headers */, 123 | 64EA6EBB1FCBEE2300F76E70 /* POIAnnotation.h in Headers */, 124 | 647CF7E91FC3F75A00DF3739 /* CoordinateForm.h in Headers */, 125 | 64EA6EBE1FCBEE2300F76E70 /* DingtalkPluginConfig.h in Headers */, 126 | 64EA6EB81FCBEE2300F76E70 /* MapSearchViewController.h in Headers */, 127 | 647CF7E11FC3F32000DF3739 /* DingtalkUI.h in Headers */, 128 | ); 129 | runOnlyForDeploymentPostprocessing = 0; 130 | }; 131 | /* End PBXHeadersBuildPhase section */ 132 | 133 | /* Begin PBXNativeTarget section */ 134 | 647CF7D71FC3F32000DF3739 /* DingtalkUI */ = { 135 | isa = PBXNativeTarget; 136 | buildConfigurationList = 647CF7E41FC3F32000DF3739 /* Build configuration list for PBXNativeTarget "DingtalkUI" */; 137 | buildPhases = ( 138 | C529D1EAB4D9DDA20227CFCB /* [CP] Check Pods Manifest.lock */, 139 | 647CF7D31FC3F32000DF3739 /* Sources */, 140 | 647CF7D41FC3F32000DF3739 /* Frameworks */, 141 | 647CF7D51FC3F32000DF3739 /* Headers */, 142 | 647CF7D61FC3F32000DF3739 /* Resources */, 143 | 039F0D4D24D39B07C06B41BF /* [CP] Copy Pods Resources */, 144 | ); 145 | buildRules = ( 146 | ); 147 | dependencies = ( 148 | ); 149 | name = DingtalkUI; 150 | productName = DingtalkUI; 151 | productReference = 647CF7D81FC3F32000DF3739 /* DingtalkUI.framework */; 152 | productType = "com.apple.product-type.framework"; 153 | }; 154 | /* End PBXNativeTarget section */ 155 | 156 | /* Begin PBXProject section */ 157 | 647CF7CF1FC3F31F00DF3739 /* Project object */ = { 158 | isa = PBXProject; 159 | attributes = { 160 | LastUpgradeCheck = 0910; 161 | ORGANIZATIONNAME = com.laiwang.DingTalk; 162 | TargetAttributes = { 163 | 647CF7D71FC3F32000DF3739 = { 164 | CreatedOnToolsVersion = 9.1; 165 | ProvisioningStyle = Automatic; 166 | }; 167 | }; 168 | }; 169 | buildConfigurationList = 647CF7D21FC3F31F00DF3739 /* Build configuration list for PBXProject "DingtalkUI" */; 170 | compatibilityVersion = "Xcode 8.0"; 171 | developmentRegion = en; 172 | hasScannedForEncodings = 0; 173 | knownRegions = ( 174 | en, 175 | ); 176 | mainGroup = 647CF7CE1FC3F31F00DF3739; 177 | productRefGroup = 647CF7D91FC3F32000DF3739 /* Products */; 178 | projectDirPath = ""; 179 | projectRoot = ""; 180 | targets = ( 181 | 647CF7D71FC3F32000DF3739 /* DingtalkUI */, 182 | ); 183 | }; 184 | /* End PBXProject section */ 185 | 186 | /* Begin PBXResourcesBuildPhase section */ 187 | 647CF7D61FC3F32000DF3739 /* Resources */ = { 188 | isa = PBXResourcesBuildPhase; 189 | buildActionMask = 2147483647; 190 | files = ( 191 | ); 192 | runOnlyForDeploymentPostprocessing = 0; 193 | }; 194 | /* End PBXResourcesBuildPhase section */ 195 | 196 | /* Begin PBXShellScriptBuildPhase section */ 197 | 039F0D4D24D39B07C06B41BF /* [CP] Copy Pods Resources */ = { 198 | isa = PBXShellScriptBuildPhase; 199 | buildActionMask = 2147483647; 200 | files = ( 201 | ); 202 | inputPaths = ( 203 | ); 204 | name = "[CP] Copy Pods Resources"; 205 | outputPaths = ( 206 | ); 207 | runOnlyForDeploymentPostprocessing = 0; 208 | shellPath = /bin/sh; 209 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-DingtalkUI/Pods-DingtalkUI-resources.sh\"\n"; 210 | showEnvVarsInLog = 0; 211 | }; 212 | C529D1EAB4D9DDA20227CFCB /* [CP] Check Pods Manifest.lock */ = { 213 | isa = PBXShellScriptBuildPhase; 214 | buildActionMask = 2147483647; 215 | files = ( 216 | ); 217 | inputPaths = ( 218 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 219 | "${PODS_ROOT}/Manifest.lock", 220 | ); 221 | name = "[CP] Check Pods Manifest.lock"; 222 | outputPaths = ( 223 | "$(DERIVED_FILE_DIR)/Pods-DingtalkUI-checkManifestLockResult.txt", 224 | ); 225 | runOnlyForDeploymentPostprocessing = 0; 226 | shellPath = /bin/sh; 227 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 228 | showEnvVarsInLog = 0; 229 | }; 230 | /* End PBXShellScriptBuildPhase section */ 231 | 232 | /* Begin PBXSourcesBuildPhase section */ 233 | 647CF7D31FC3F32000DF3739 /* Sources */ = { 234 | isa = PBXSourcesBuildPhase; 235 | buildActionMask = 2147483647; 236 | files = ( 237 | 647CF7DD1FC3F32000DF3739 /* DingtalkUI.m in Sources */, 238 | 64EA6EB71FCBEE2300F76E70 /* POIAnnotation.m in Sources */, 239 | 64EA6EB91FCBEE2300F76E70 /* MapSearchViewController.m in Sources */, 240 | 64EA6EB61FCBEE2300F76E70 /* DingtalkPluginConfig.m in Sources */, 241 | 64EA6EBC1FCBEE2300F76E70 /* dingdingDylib.m in Sources */, 242 | 647CF7EA1FC3F75A00DF3739 /* CoordinateForm.m in Sources */, 243 | 64EA6EBA1FCBEE2300F76E70 /* DingtalkPod.m in Sources */, 244 | ); 245 | runOnlyForDeploymentPostprocessing = 0; 246 | }; 247 | /* End PBXSourcesBuildPhase section */ 248 | 249 | /* Begin XCBuildConfiguration section */ 250 | 647CF7E21FC3F32000DF3739 /* Debug */ = { 251 | isa = XCBuildConfiguration; 252 | buildSettings = { 253 | ALWAYS_SEARCH_USER_PATHS = NO; 254 | CLANG_ANALYZER_NONNULL = YES; 255 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 256 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 257 | CLANG_CXX_LIBRARY = "libc++"; 258 | CLANG_ENABLE_MODULES = YES; 259 | CLANG_ENABLE_OBJC_ARC = YES; 260 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 261 | CLANG_WARN_BOOL_CONVERSION = YES; 262 | CLANG_WARN_COMMA = YES; 263 | CLANG_WARN_CONSTANT_CONVERSION = YES; 264 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 265 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 266 | CLANG_WARN_EMPTY_BODY = YES; 267 | CLANG_WARN_ENUM_CONVERSION = YES; 268 | CLANG_WARN_INFINITE_RECURSION = YES; 269 | CLANG_WARN_INT_CONVERSION = YES; 270 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 271 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 272 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 273 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 274 | CLANG_WARN_STRICT_PROTOTYPES = YES; 275 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 276 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 277 | CLANG_WARN_UNREACHABLE_CODE = YES; 278 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 279 | CODE_SIGN_IDENTITY = "iPhone Developer"; 280 | COPY_PHASE_STRIP = NO; 281 | CURRENT_PROJECT_VERSION = 1; 282 | DEBUG_INFORMATION_FORMAT = dwarf; 283 | ENABLE_STRICT_OBJC_MSGSEND = YES; 284 | ENABLE_TESTABILITY = YES; 285 | GCC_C_LANGUAGE_STANDARD = gnu11; 286 | GCC_DYNAMIC_NO_PIC = NO; 287 | GCC_NO_COMMON_BLOCKS = YES; 288 | GCC_OPTIMIZATION_LEVEL = 0; 289 | GCC_PREPROCESSOR_DEFINITIONS = ( 290 | "DEBUG=1", 291 | "$(inherited)", 292 | ); 293 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 294 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 295 | GCC_WARN_UNDECLARED_SELECTOR = YES; 296 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 297 | GCC_WARN_UNUSED_FUNCTION = YES; 298 | GCC_WARN_UNUSED_VARIABLE = YES; 299 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 300 | MTL_ENABLE_DEBUG_INFO = YES; 301 | ONLY_ACTIVE_ARCH = YES; 302 | SDKROOT = iphoneos; 303 | VERSIONING_SYSTEM = "apple-generic"; 304 | VERSION_INFO_PREFIX = ""; 305 | }; 306 | name = Debug; 307 | }; 308 | 647CF7E31FC3F32000DF3739 /* Release */ = { 309 | isa = XCBuildConfiguration; 310 | buildSettings = { 311 | ALWAYS_SEARCH_USER_PATHS = NO; 312 | CLANG_ANALYZER_NONNULL = YES; 313 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 314 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 315 | CLANG_CXX_LIBRARY = "libc++"; 316 | CLANG_ENABLE_MODULES = YES; 317 | CLANG_ENABLE_OBJC_ARC = YES; 318 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 319 | CLANG_WARN_BOOL_CONVERSION = YES; 320 | CLANG_WARN_COMMA = YES; 321 | CLANG_WARN_CONSTANT_CONVERSION = YES; 322 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 323 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 324 | CLANG_WARN_EMPTY_BODY = YES; 325 | CLANG_WARN_ENUM_CONVERSION = YES; 326 | CLANG_WARN_INFINITE_RECURSION = YES; 327 | CLANG_WARN_INT_CONVERSION = YES; 328 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 329 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 330 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 331 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 332 | CLANG_WARN_STRICT_PROTOTYPES = YES; 333 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 334 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 335 | CLANG_WARN_UNREACHABLE_CODE = YES; 336 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 337 | CODE_SIGN_IDENTITY = "iPhone Developer"; 338 | COPY_PHASE_STRIP = NO; 339 | CURRENT_PROJECT_VERSION = 1; 340 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 341 | ENABLE_NS_ASSERTIONS = NO; 342 | ENABLE_STRICT_OBJC_MSGSEND = YES; 343 | GCC_C_LANGUAGE_STANDARD = gnu11; 344 | GCC_NO_COMMON_BLOCKS = YES; 345 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 346 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 347 | GCC_WARN_UNDECLARED_SELECTOR = YES; 348 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 349 | GCC_WARN_UNUSED_FUNCTION = YES; 350 | GCC_WARN_UNUSED_VARIABLE = YES; 351 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 352 | MTL_ENABLE_DEBUG_INFO = NO; 353 | SDKROOT = iphoneos; 354 | VALIDATE_PRODUCT = YES; 355 | VERSIONING_SYSTEM = "apple-generic"; 356 | VERSION_INFO_PREFIX = ""; 357 | }; 358 | name = Release; 359 | }; 360 | 647CF7E51FC3F32000DF3739 /* Debug */ = { 361 | isa = XCBuildConfiguration; 362 | baseConfigurationReference = F7A5CAC06DC5BBE1965CA117 /* Pods-DingtalkUI.debug.xcconfig */; 363 | buildSettings = { 364 | CODE_SIGN_IDENTITY = ""; 365 | CODE_SIGN_STYLE = Automatic; 366 | DEFINES_MODULE = YES; 367 | DEVELOPMENT_TEAM = UJLH85825A; 368 | DYLIB_COMPATIBILITY_VERSION = 1; 369 | DYLIB_CURRENT_VERSION = 1; 370 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 371 | INFOPLIST_FILE = DingtalkUI/Info.plist; 372 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 373 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 374 | PRODUCT_BUNDLE_IDENTIFIER = com.laiwang.DingtalkUI; 375 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 376 | SKIP_INSTALL = YES; 377 | TARGETED_DEVICE_FAMILY = "1,2"; 378 | }; 379 | name = Debug; 380 | }; 381 | 647CF7E61FC3F32000DF3739 /* Release */ = { 382 | isa = XCBuildConfiguration; 383 | baseConfigurationReference = 4DCEA75CC3D7817BF161B6F3 /* Pods-DingtalkUI.release.xcconfig */; 384 | buildSettings = { 385 | CODE_SIGN_IDENTITY = ""; 386 | CODE_SIGN_STYLE = Automatic; 387 | DEFINES_MODULE = YES; 388 | DEVELOPMENT_TEAM = UJLH85825A; 389 | DYLIB_COMPATIBILITY_VERSION = 1; 390 | DYLIB_CURRENT_VERSION = 1; 391 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 392 | INFOPLIST_FILE = DingtalkUI/Info.plist; 393 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 394 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 395 | PRODUCT_BUNDLE_IDENTIFIER = com.laiwang.DingtalkUI; 396 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 397 | SKIP_INSTALL = YES; 398 | TARGETED_DEVICE_FAMILY = "1,2"; 399 | }; 400 | name = Release; 401 | }; 402 | /* End XCBuildConfiguration section */ 403 | 404 | /* Begin XCConfigurationList section */ 405 | 647CF7D21FC3F31F00DF3739 /* Build configuration list for PBXProject "DingtalkUI" */ = { 406 | isa = XCConfigurationList; 407 | buildConfigurations = ( 408 | 647CF7E21FC3F32000DF3739 /* Debug */, 409 | 647CF7E31FC3F32000DF3739 /* Release */, 410 | ); 411 | defaultConfigurationIsVisible = 0; 412 | defaultConfigurationName = Release; 413 | }; 414 | 647CF7E41FC3F32000DF3739 /* Build configuration list for PBXNativeTarget "DingtalkUI" */ = { 415 | isa = XCConfigurationList; 416 | buildConfigurations = ( 417 | 647CF7E51FC3F32000DF3739 /* Debug */, 418 | 647CF7E61FC3F32000DF3739 /* Release */, 419 | ); 420 | defaultConfigurationIsVisible = 0; 421 | defaultConfigurationName = Release; 422 | }; 423 | /* End XCConfigurationList section */ 424 | }; 425 | rootObject = 647CF7CF1FC3F31F00DF3739 /* Project object */; 426 | } 427 | --------------------------------------------------------------------------------