本帖最后由 zhufeixing 于 2018-12-13 15:18 编辑
前传 https://www.52pojie.cn/thread-837108-1-1.html
基于上一个帖子https://www.52pojie.cn/thread-837108-1-1.html遗留的历史问题
1.很多小伙伴反应把Bundle ID改为“ com.laiwang.DingTalk ”运行后钉钉依然提示“非官方应用”
以下是我的操作,由于我没有越狱手机,只能在pp助手下载,下载是注意要下载越狱应用而不是正版应用,下载的是PP助手上钉钉最新版本4.5.15 ,APPStore上的是4.6版本
2. 注意:真机运行需要开发者证书,把Bundle ID改为“ com.laiwang.DingTalk ”,Version改为对应的“4.5.15”,真机运行成功,没有提示“非官方应用”。
======================================== ===凉凉的分割线
上一个帖子的经纬度是写死在代码里面的,当公司安排出差的时候就有点尴尬了 ,签到的还是公司的位置,决定对其进行简单的改良,可以在钉钉内手动输入经纬度坐标(经纬度自己百度查询)。
一.使用封装好的第三方库DingTalkUI ,此库封装了我上一篇修改定位的代码,我们利用Cocoapods进行导入安装到我们的dingding项目中
1.打开终端,定位到dingding项目所在目录,执行“ pod init”操作
2.进入dingding目录,利用xcode方式打开Podfile文件,规则参照https://github.com/AloneMonkey/MonkeyDevSpecs
3.修改好Podfile文件后进行保存操作,利用终端进入dingding目录进行“pod install”操作,导入DingTalkUI库成功。注意:( 修改Pods->dingdingPodDylib的 Build Settings 下 Build Active Architecture Only Debug改成No。 )
4.运行dingding项目,安装完第三方库后在(某些不完美越狱的手机)上运行项目闪退,在非越狱手机上正常运行(还没想到解决方法)在越狱手机上报错。。。如下图,找到解决办法请告诉我
5.进行hook操作,给钉钉添加修改经纬度的输入框界面,我们要把输入框添加到主界面上去怎么添加输入框界面呢,此处我们需要对项目进行调试操作在dingdingDylib.m文件中,监听UIApplicationDidBecomeActiveNotification的通知,打印[ UIApplication sharedApplication ]. keyWindow . rootViewController的根控制器,点击home键让app进入后台,再切回到前台,发现控制台打印的是“ DTTabBarController ”(此处操作均为登录钉钉账号后)
6.利用class-dump操作,查看DTTabBarController 控制器的头文件,选择对“ -( void )viewDidLayoutSubviews”进行hook操作,详情请参考下图,大家也可以选择在别的方法或者控制器上进行hook操作,不一定要选择 DTTabBarController 控制器。
7.编写经纬度输入框的代码,我选择自定义view操作,右键new file新建一个类ZFXXXButton继承于UIView,详细方法注释请参考图片:
8.在dingdingDylib.m中导入#import "ZFXXXButton.h"的,对DTTabBarController的viewDidLayoutSubviews方法进行hook操作:
9.真机运行dingding项目,不进行经纬度修改,此时我的位置是南山智园,把经纬度修改为天安门广场,修改成功。
以下是源码:[Objective-C] 纯文本查看 复制代码 #import "ZFXXXButton.h"
//导入第三方库DingtalkPod
#import "DingtalkPod.h"
//宏定义屏幕的宽度和高度
#define KScreenHeight [UIScreen mainScreen].bounds.size.height
#define KScreenWidth [UIScreen mainScreen].bounds.size.width
[url=home.php?mod=space&uid=402414]@[/url] interface ZFXXXButton()
//按钮(用于点击弹出经纬度输入框)
@property (nonatomic,strong)UIButton *btn;
//DingtalkPod对象用于修改经纬度操作
@property (nonatomic,strong)DingtalkPod *pod;
[url=home.php?mod=space&uid=262062]@End[/url]
@ implementation ZFXXXButton
-(DingtalkPod *) pod{
if (!_pod) {
_pod = [[DingtalkPod alloc]init];
}
return _pod;
}
//懒加载按钮
- (UIButton *)btn{
if (!_btn) {
_btn = [UIButton buttonWithType:UIButtonTypeCustom];
[_btn setTitle "修改经纬度" forState:UIControlStateNormal];
[_btn.titleLabel setFont:[UIFont systemFontOfSize:13]];
_btn.userInteractionEnabled = YES;
[_btn addTarget:self action: @selector (btnClick:) forControlEvents:UIControlEventTouchUpInside];
}
return _btn;
}
//重写initWithFrame:(CGRect)frame方法,把按钮添加到我们自定义的view中
- (instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
//添加按钮
[self addSubview:self.btn];
//设置透明度
self.backgroundColor = [[UIColor grayColor] colorWithAlphaComponent:0.5];
}
return self;
}
- (void)layoutSubviews{
[super layoutSubviews];
CGSize size = self.frame.size;
//设置按钮在view中的位置
self.btn.frame = CGRectMake(0, 0, size.width , size .height);
}
//点击按钮触发该方法
- (void)btnClick:(UIButton*)btn{
UIAlertController *alert = [UIAlertController alertControllerWithTitle "修改定位" message "请输入经纬度" preferredStyle:UIAlertControllerStyleAlert];
[alert addAction: [UIAlertAction actionWithTitle "取消" style:UIAlertActionStyleDefault handler :^(UIAlertAction * _Nonnull action) {
}]];
//点击确定按钮,修改经纬度
[alert addAction:[UIAlertAction actionWithTitle"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
UITextField *longitudeTextField = alert.textFields.firstObject;
UITextField *latitudeTextField = alert.textFields.lastObject;
NSLog(@"经度= %@",longitudeTextField.text) ;
NSLog(@"纬度= %@",latitudeTextField.text);
double longitude = [longitudeTextField.text doubleValue];
double latitude = [latitudeTextField.text doubleValue];
//调用DingtalkPod的setLocation:方法修改经纬度
[self.pod setLocation:CLLocationCoordinate2DMake(longitude,latitude)];
}]];
//添加经度输入框
[alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
textField.placeholder = @"请输入经度";
textField.keyboardType = UIKeyboardTypeASCIICapable;
textField.returnKeyType = UIReturnKeyDone;
}];
//添加纬度输入框
[alert addTextFieldWithConfigurationHandler:^( UITextField * _Nonnull textField) {
textField.placeholder = @"请输入纬度";
textField.keyboardType = UIKeyboardTypeASCIICapable;
textField.returnKeyType = UIReturnKeyDone;
}];
//弹出经纬度输入框
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alert animated:YES completion:nil];
}
# import "ZFXXXButton.h"
#import "dingdingDylib.h"
#import <CaptainHook/CaptainHook.h>
#import <UIKit/UIKit.h>
#import <Cycript/Cycript.h>
#import <MDCycriptManager.h>
#import <CoreLocation/CoreLocation.h>
#define KScreenHeight [UIScreen mainScreen] .bounds.size.height
#define KScreenWidth [UIScreen mainScreen].bounds.size. width
CHDeclareClass(DTTabBarController)
CHOptimizedMethod0(self, void, DTTabBarController, viewDidLayoutSubviews){
//调用y正版钉钉的viewDidLayoutSubviews方法
CHSuper0(DTTabBarController, viewDidLayoutSubviews) ;
//创建ZFXXXButton
ZFXXXButton *btn = [[ZFXXXButton alloc]initWithFrame:CGRectMake( (KScreenWidth - 80)/2, 20 , 80, 50)];
//获取DTTabBarController控制器的根控制器的view,把ZFXXXButton添加到view上
UITabBarController * vc = (UITabBarController*)self;
UIView *view = vc.selectedViewController.view;
[view addSubview:btn];
}
CHConstructor{
CHLoadLateClass (DTTabBarController);
CHClassHook(0, DTTabBarController, viewDidLayoutSubviews);
}
期待得到小伙伴们的好评和喜欢 |