后续=>非越狱手机钉钉搭建修改经纬度的UI界面
本帖最后由 zhufeixing 于 2018-12-13 15:18 编辑前传 https://www.52pojie.cn/thread-837108-1-1.html
基于上一个帖子https://www.52pojie.cn/thread-837108-1-1.html遗留的历史问题:'(weeqw
1.很多小伙伴反应把Bundle ID改为“ com.laiwang.DingTalk ”运行后钉钉依然提示“非官方应用”
以下是我的操作,由于我没有越狱手机,只能在pp助手下载,下载是注意要下载越狱应用而不是正版应用,下载的是PP助手上钉钉最新版本4.5.15 ,APPStore上的是4.6版本
2. 注意:真机运行需要开发者证书,把Bundle ID改为“ com.laiwang.DingTalk ”,Version改为对应的“4.5.15”,真机运行成功,没有提示“非官方应用”。
======================================== ===凉凉的分割线
上一个帖子的经纬度是写死在代码里面的,当公司安排出差的时候就有点尴尬了 {:1_896:},签到的还是公司的位置,决定对其进行简单的改良,可以在钉钉内手动输入经纬度坐标(经纬度自己百度查询{:1_907:})。
一.使用封装好的第三方库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项目,不进行经纬度修改,此时我的位置是南山智园,把经纬度修改为天安门广场,修改成功。
以下是源码:#import "ZFXXXButton.h"
//导入第三方库DingtalkPod
#import "DingtalkPod.h"
//宏定义屏幕的宽度和高度
#define KScreenHeight .bounds.size.height
#define KScreenWidth .bounds.size.width
@ interface ZFXXXButton()
//按钮(用于点击弹出经纬度输入框)
@property (nonatomic,strong)UIButton *btn;
//DingtalkPod对象用于修改经纬度操作
@property (nonatomic,strong)DingtalkPod *pod;
@End
@ implementation ZFXXXButton
-(DingtalkPod *) pod{
if (!_pod) {
_pod = [init];
}
return _pod;
}
//懒加载按钮
- (UIButton *)btn{
if (!_btn) {
_btn = ;
;
];
_btn.userInteractionEnabled = YES;
;
}
return _btn;
}
//重写initWithFrame:(CGRect)frame方法,把按钮添加到我们自定义的view中
- (instancetype)initWithFrame:(CGRect)frame{
if (self = ) {
//添加按钮
;
//设置透明度
self.backgroundColor = [ colorWithAlphaComponent:0.5];
}
return self;
}
- (void)layoutSubviews{
;
CGSize size = self.frame.size;
//设置按钮在view中的位置
self.btn.frame = CGRectMake(0, 0, size.width , size .height);
}
//点击按钮触发该方法
- (void)btnClick:(UIButton*)btn{
UIAlertController *alert = ;
[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 = ;
double latitude = ;
//调用DingtalkPod的setLocation:方法修改经纬度
;
}]];
//添加经度输入框
[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;
}];
//弹出经纬度输入框
[.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 .bounds.size.height
#define KScreenWidth .bounds.size. width
CHDeclareClass(DTTabBarController)
CHOptimizedMethod0(self, void, DTTabBarController, viewDidLayoutSubviews){
//调用y正版钉钉的viewDidLayoutSubviews方法
CHSuper0(DTTabBarController, viewDidLayoutSubviews) ;
//创建ZFXXXButton
ZFXXXButton *btn = [initWithFrame:CGRectMake( (KScreenWidth - 80)/2, 20 , 80, 50)];
//获取DTTabBarController控制器的根控制器的view,把ZFXXXButton添加到view上
UITabBarController * vc = (UITabBarController*)self;
UIView *view = vc.selectedViewController.view;
;
}
CHConstructor{
CHLoadLateClass (DTTabBarController);
CHClassHook(0, DTTabBarController, viewDidLayoutSubviews);
}
期待得到小伙伴们的好评和喜欢 :lol :lol{:1_893:} YXingXing 发表于 2018-12-13 14:04
楼主威武,那么快搞了个界面出来
{:1_918:}谢谢支持 楼主威武,那么快搞了个界面出来{:1_918:} 为毛没人点赞呢 好东西,先收藏着。。。 先给楼主点赞,然后慢慢再看 大神,原价市面上的钉钉远程打卡都是来您这抄袭的技术稍加改良居然就能卖钱了!!一个几十块呢! 太复杂了, 一般人不会呀 真强啊!!! 真的需要一定动手能力。
Android app还能搞搞,水果机望而却步 是否有成品分享啊?谢谢{:1_1:}