From 1bcdb120642d7f89bd1a4e7f99479fd4956ebbbb Mon Sep 17 00:00:00 2001 From: Wangin1996 Date: Fri, 6 Mar 2026 19:22:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E5=88=86HOOK=20UI?= =?UTF-8?q?=E4=B8=BAHOOK=20=E6=95=B0=E6=8D=AE=E6=A8=A1=E5=9E=8B=EF=BC=8C?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B1=9E=E5=9C=B0=E6=9F=A5=E8=AF=A2=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=E5=A2=9E=E5=8A=A0=E9=83=A8=E5=88=86=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8CHOOK=E7=82=B9=E4=BD=8D=E4=B8=BA=E4=BA=BA?= =?UTF-8?q?=E5=B7=A5=E6=9F=A5=E6=89=BE=EF=BC=8C=E4=BB=A3=E7=A0=81=E4=B8=BA?= =?UTF-8?q?AI=E6=92=B0=E5=86=99=EF=BC=8C=E5=8B=BF=E5=96=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AwemeHeaders.h | 1 + CityManager.h | 3 + CityManager.m | 1048 +++++++++++++++++++------------ DYYY.xm | 1155 ++++++++++++++++++++++++----------- DYYYLongPressPanel.xm | 398 ++++++------ DYYYSettingViewController.m | 21 +- DYYYSettings.xm | 133 ++-- 7 files changed, 1684 insertions(+), 1075 deletions(-) diff --git a/AwemeHeaders.h b/AwemeHeaders.h index 354ae8120..52f1e04e0 100644 --- a/AwemeHeaders.h +++ b/AwemeHeaders.h @@ -130,6 +130,7 @@ typedef NS_ENUM(NSUInteger, DYEdgeMode) { @property(nonatomic, strong) AWELiveFollowFeedCellModel *cellRoom; @property(nonatomic, strong) NSString *videoFeedTag; @property(nonatomic, strong) id shareRecExtra; // 推荐视频专有属性 +@property (nonatomic, copy) NSString *referString; // 推荐页为 homepage_hot @property(nonatomic, strong) NSArray *textExtras; @property(nonatomic, copy) NSString *itemTitle; @property(nonatomic, copy) NSString *descriptionSimpleString; diff --git a/CityManager.h b/CityManager.h index 9eae29d0f..8b8e89ae6 100644 --- a/CityManager.h +++ b/CityManager.h @@ -3,10 +3,13 @@ @interface CityManager : NSObject @property(nonatomic, strong) NSDictionary *cityCodeMap; +@property(nonatomic, strong) NSDictionary *countryCodeMap; + (instancetype)sharedInstance; - (NSString *)getCityNameWithCode:(NSString *)code; - (NSString *)getProvinceNameWithCode:(NSString *)code; +- (NSString *)getCountryNameWithCode:(NSString *)code; - (void)loadCityData; +- (void)loadCountryData; + (void)fetchLocationWithGeonameId:(NSString *)geonameId completionHandler:(void (^)(NSDictionary *locationInfo, NSError *error))completionHandler; @end diff --git a/CityManager.m b/CityManager.m index a5ec71ba9..d54aaa2ea 100644 --- a/CityManager.m +++ b/CityManager.m @@ -10,439 +10,471 @@ + (instancetype)sharedInstance { dispatch_once(&onceToken, ^{ instance = [[CityManager alloc] init]; [instance loadCityData]; + [instance loadCountryData]; }); return instance; } - (void)loadCityData { self.cityCodeMap = @{ + // 直辖市(包含省级和市级代码) @"110000" : @"北京", @"110100" : @"北京", @"120000" : @"天津", @"120100" : @"天津", + @"310000" : @"上海", + @"310100" : @"上海", + @"500000" : @"重庆", + @"500100" : @"重庆", + // 河北省 @"130000" : @"河北", - @"130100" : @"石家庄", - @"130200" : @"唐山", - @"130300" : @"秦皇岛", - @"130400" : @"邯郸", - @"130500" : @"邢台", - @"130600" : @"保定", - @"130700" : @"张家口", - @"130800" : @"承德", - @"130900" : @"沧州", - @"131000" : @"廊坊", - @"131100" : @"衡水", + @"130100" : @"河北 石家庄", + @"130200" : @"河北 唐山", + @"130300" : @"河北 秦皇岛", + @"130400" : @"河北 邯郸", + @"130500" : @"河北 邢台", + @"130600" : @"河北 保定", + @"130700" : @"河北 张家口", + @"130800" : @"河北 承德", + @"130900" : @"河北 沧州", + @"131000" : @"河北 廊坊", + @"131100" : @"河北 衡水", + // 山西省 @"140000" : @"山西", - @"140100" : @"太原", - @"140200" : @"大同", - @"140300" : @"阳泉", - @"140400" : @"长治", - @"140500" : @"晋城", - @"140600" : @"朔州", - @"140700" : @"晋中", - @"140800" : @"运城", - @"140900" : @"忻州", - @"141000" : @"临汾", - @"141100" : @"吕梁", + @"140100" : @"山西 太原", + @"140200" : @"山西 大同", + @"140300" : @"山西 阳泉", + @"140400" : @"山西 长治", + @"140500" : @"山西 晋城", + @"140600" : @"山西 朔州", + @"140700" : @"山西 晋中", + @"140800" : @"山西 运城", + @"140900" : @"山西 忻州", + @"141000" : @"山西 临汾", + @"141100" : @"山西 吕梁", + // 内蒙古自治区 @"150000" : @"内蒙古", - @"150100" : @"呼和浩特", - @"150200" : @"包头", - @"150300" : @"乌海", - @"150400" : @"赤峰", - @"150500" : @"通辽", - @"150600" : @"鄂尔多斯", - @"150700" : @"呼伦贝尔", - @"150800" : @"巴彦淖尔", - @"150900" : @"乌兰察布", - @"152200" : @"兴安", - @"152500" : @"锡林郭勒", - @"152900" : @"阿拉善", + @"150100" : @"内蒙古 呼和浩特", + @"150200" : @"内蒙古 包头", + @"150300" : @"内蒙古 乌海", + @"150400" : @"内蒙古 赤峰", + @"150500" : @"内蒙古 通辽", + @"150600" : @"内蒙古 鄂尔多斯", + @"150700" : @"内蒙古 呼伦贝尔", + @"150800" : @"内蒙古 巴彦淖尔", + @"150900" : @"内蒙古 乌兰察布", + @"152200" : @"内蒙古 兴安", + @"152500" : @"内蒙古 锡林郭勒", + @"152900" : @"内蒙古 阿拉善", + // 辽宁省 @"210000" : @"辽宁", - @"210100" : @"沈阳", - @"210200" : @"大连", - @"210300" : @"鞍山", - @"210400" : @"抚顺", - @"210500" : @"本溪", - @"210600" : @"丹东", - @"210700" : @"锦州", - @"210800" : @"营口", - @"210900" : @"阜新", - @"211000" : @"辽阳", - @"211100" : @"盘锦", - @"211200" : @"铁岭", - @"211300" : @"朝阳", - @"211400" : @"葫芦岛", + @"210100" : @"辽宁 沈阳", + @"210200" : @"辽宁 大连", + @"210300" : @"辽宁 鞍山", + @"210400" : @"辽宁 抚顺", + @"210500" : @"辽宁 本溪", + @"210600" : @"辽宁 丹东", + @"210700" : @"辽宁 锦州", + @"210800" : @"辽宁 营口", + @"210900" : @"辽宁 阜新", + @"211000" : @"辽宁 辽阳", + @"211100" : @"辽宁 盘锦", + @"211200" : @"辽宁 铁岭", + @"211300" : @"辽宁 朝阳", + @"211400" : @"辽宁 葫芦岛", + // 吉林省 @"220000" : @"吉林", - @"220100" : @"长春", - @"220200" : @"吉林", - @"220300" : @"四平", - @"220400" : @"辽源", - @"220500" : @"通化", - @"220600" : @"白山", - @"220700" : @"松原", - @"220800" : @"白城", - @"222400" : @"延边", + @"220100" : @"吉林 长春", + @"220200" : @"吉林 吉林", + @"220300" : @"吉林 四平", + @"220400" : @"吉林 辽源", + @"220500" : @"吉林 通化", + @"220600" : @"吉林 白山", + @"220700" : @"吉林 松原", + @"220800" : @"吉林 白城", + @"222400" : @"吉林 延边", + // 黑龙江省 @"230000" : @"黑龙江", - @"230100" : @"哈尔滨", - @"230200" : @"齐齐哈尔", - @"230300" : @"鸡西", - @"230400" : @"鹤岗", - @"230500" : @"双鸭山", - @"230600" : @"大庆", - @"230700" : @"伊春", - @"230800" : @"佳木斯", - @"230900" : @"七台河", - @"231000" : @"牡丹江", - @"231100" : @"黑河", - @"231200" : @"绥化", - @"232700" : @"大兴安岭", - @"310000" : @"上海", - @"310100" : @"上海", + @"230100" : @"黑龙江 哈尔滨", + @"230200" : @"黑龙江 齐齐哈尔", + @"230300" : @"黑龙江 鸡西", + @"230400" : @"黑龙江 鹤岗", + @"230500" : @"黑龙江 双鸭山", + @"230600" : @"黑龙江 大庆", + @"230700" : @"黑龙江 伊春", + @"230800" : @"黑龙江 佳木斯", + @"230900" : @"黑龙江 七台河", + @"231000" : @"黑龙江 牡丹江", + @"231100" : @"黑龙江 黑河", + @"231200" : @"黑龙江 绥化", + @"232700" : @"黑龙江 大兴安岭", + // 江苏省 @"320000" : @"江苏", - @"320100" : @"南京", - @"320200" : @"无锡", - @"320300" : @"徐州", - @"320400" : @"常州", - @"320500" : @"苏州", - @"320600" : @"南通", - @"320700" : @"连云港", - @"320800" : @"淮安", - @"320900" : @"盐城", - @"321000" : @"扬州", - @"321100" : @"镇江", - @"321200" : @"泰州", - @"321300" : @"宿迁", + @"320100" : @"江苏 南京", + @"320200" : @"江苏 无锡", + @"320300" : @"江苏 徐州", + @"320400" : @"江苏 常州", + @"320500" : @"江苏 苏州", + @"320600" : @"江苏 南通", + @"320700" : @"江苏 连云港", + @"320800" : @"江苏 淮安", + @"320900" : @"江苏 盐城", + @"321000" : @"江苏 扬州", + @"321100" : @"江苏 镇江", + @"321200" : @"江苏 泰州", + @"321300" : @"江苏 宿迁", + // 浙江省 @"330000" : @"浙江", - @"330100" : @"杭州", - @"330200" : @"宁波", - @"330300" : @"温州", - @"330400" : @"嘉兴", - @"330500" : @"湖州", - @"330600" : @"绍兴", - @"330700" : @"金华", - @"330800" : @"衢州", - @"330900" : @"舟山", - @"331000" : @"台州", - @"331100" : @"丽水", + @"330100" : @"浙江 杭州", + @"330200" : @"浙江 宁波", + @"330300" : @"浙江 温州", + @"330400" : @"浙江 嘉兴", + @"330500" : @"浙江 湖州", + @"330600" : @"浙江 绍兴", + @"330700" : @"浙江 金华", + @"330800" : @"浙江 衢州", + @"330900" : @"浙江 舟山", + @"331000" : @"浙江 台州", + @"331100" : @"浙江 丽水", + // 安徽省 @"340000" : @"安徽", - @"340100" : @"合肥", - @"340200" : @"芜湖", - @"340300" : @"蚌埠", - @"340400" : @"淮南", - @"340500" : @"马鞍山", - @"340600" : @"淮北", - @"340700" : @"铜陵", - @"340800" : @"安庆", - @"341000" : @"黄山", - @"341100" : @"滁州", - @"341200" : @"阜阳", - @"341300" : @"宿州", - @"341500" : @"六安", - @"341600" : @"亳州", - @"341700" : @"池州", - @"341800" : @"宣城", + @"340100" : @"安徽 合肥", + @"340200" : @"安徽 芜湖", + @"340300" : @"安徽 蚌埠", + @"340400" : @"安徽 淮南", + @"340500" : @"安徽 马鞍山", + @"340600" : @"安徽 淮北", + @"340700" : @"安徽 铜陵", + @"340800" : @"安徽 安庆", + @"341000" : @"安徽 黄山", + @"341100" : @"安徽 滁州", + @"341200" : @"安徽 阜阳", + @"341300" : @"安徽 宿州", + @"341500" : @"安徽 六安", + @"341600" : @"安徽 亳州", + @"341700" : @"安徽 池州", + @"341800" : @"安徽 宣城", + // 福建省 @"350000" : @"福建", - @"350100" : @"福州", - @"350200" : @"厦门", - @"350300" : @"莆田", - @"350400" : @"三明", - @"350500" : @"泉州", - @"350600" : @"漳州", - @"350700" : @"南平", - @"350800" : @"龙岩", - @"350900" : @"宁德", + @"350100" : @"福建 福州", + @"350200" : @"福建 厦门", + @"350300" : @"福建 莆田", + @"350400" : @"福建 三明", + @"350500" : @"福建 泉州", + @"350600" : @"福建 漳州", + @"350700" : @"福建 南平", + @"350800" : @"福建 龙岩", + @"350900" : @"福建 宁德", + // 江西省 @"360000" : @"江西", - @"360100" : @"南昌", - @"360200" : @"景德镇", - @"360300" : @"萍乡", - @"360400" : @"九江", - @"360500" : @"新余", - @"360600" : @"鹰潭", - @"360700" : @"赣州", - @"360800" : @"吉安", - @"360900" : @"宜春", - @"361000" : @"抚州", - @"361100" : @"上饶", + @"360100" : @"江西 南昌", + @"360200" : @"江西 景德镇", + @"360300" : @"江西 萍乡", + @"360400" : @"江西 九江", + @"360500" : @"江西 新余", + @"360600" : @"江西 鹰潭", + @"360700" : @"江西 赣州", + @"360800" : @"江西 吉安", + @"360900" : @"江西 宜春", + @"361000" : @"江西 抚州", + @"361100" : @"江西 上饶", + // 山东省 @"370000" : @"山东", - @"370100" : @"济南", - @"370200" : @"青岛", - @"370300" : @"淄博", - @"370400" : @"枣庄", - @"370500" : @"东营", - @"370600" : @"烟台", - @"370700" : @"潍坊", - @"370800" : @"济宁", - @"370900" : @"泰安", - @"371000" : @"威海", - @"371100" : @"日照", - @"371200" : @"莱芜", - @"371300" : @"临沂", - @"371400" : @"德州", - @"371500" : @"聊城", - @"371600" : @"滨州", - @"371700" : @"菏泽", + @"370100" : @"山东 济南", + @"370200" : @"山东 青岛", + @"370300" : @"山东 淄博", + @"370400" : @"山东 枣庄", + @"370500" : @"山东 东营", + @"370600" : @"山东 烟台", + @"370700" : @"山东 潍坊", + @"370800" : @"山东 济宁", + @"370900" : @"山东 泰安", + @"371000" : @"山东 威海", + @"371100" : @"山东 日照", + @"371200" : @"山东 莱芜", + @"371300" : @"山东 临沂", + @"371400" : @"山东 德州", + @"371500" : @"山东 聊城", + @"371600" : @"山东 滨州", + @"371700" : @"山东 菏泽", + // 河南省 @"410000" : @"河南", - @"410100" : @"郑州", - @"410200" : @"开封", - @"410300" : @"洛阳", - @"410400" : @"平顶山", - @"410500" : @"安阳", - @"410600" : @"鹤壁", - @"410700" : @"新乡", - @"410800" : @"焦作", - @"410900" : @"濮阳", - @"411000" : @"许昌", - @"411100" : @"漯河", - @"411200" : @"三门峡", - @"411300" : @"南阳", - @"411400" : @"商丘", - @"411500" : @"信阳", - @"411600" : @"周口", - @"411700" : @"驻马店", - @"419001" : @"济源", + @"410100" : @"河南 郑州", + @"410200" : @"河南 开封", + @"410300" : @"河南 洛阳", + @"410400" : @"河南 平顶山", + @"410500" : @"河南 安阳", + @"410600" : @"河南 鹤壁", + @"410700" : @"河南 新乡", + @"410800" : @"河南 焦作", + @"410900" : @"河南 濮阳", + @"411000" : @"河南 许昌", + @"411100" : @"河南 漯河", + @"411200" : @"河南 三门峡", + @"411300" : @"河南 南阳", + @"411400" : @"河南 商丘", + @"411500" : @"河南 信阳", + @"411600" : @"河南 周口", + @"411700" : @"河南 驻马店", + @"419001" : @"河南 济源", + // 湖北省 @"420000" : @"湖北", - @"420100" : @"武汉", - @"420200" : @"黄石", - @"420300" : @"十堰", - @"420500" : @"宜昌", - @"420600" : @"襄阳", - @"420700" : @"鄂州", - @"420800" : @"荆门", - @"420900" : @"孝感", - @"421000" : @"荆州", - @"421100" : @"黄冈", - @"421200" : @"咸宁", - @"421300" : @"随州", - @"422800" : @"恩施", - @"429004" : @"仙桃", - @"429005" : @"潜江", - @"429006" : @"天门", - @"429021" : @"神农架", + @"420100" : @"湖北 武汉", + @"420200" : @"湖北 黄石", + @"420300" : @"湖北 十堰", + @"420500" : @"湖北 宜昌", + @"420600" : @"湖北 襄阳", + @"420700" : @"湖北 鄂州", + @"420800" : @"湖北 荆门", + @"420900" : @"湖北 孝感", + @"421000" : @"湖北 荆州", + @"421100" : @"湖北 黄冈", + @"421200" : @"湖北 咸宁", + @"421300" : @"湖北 随州", + @"422800" : @"湖北 恩施", + @"429004" : @"湖北 仙桃", + @"429005" : @"湖北 潜江", + @"429006" : @"湖北 天门", + @"429021" : @"湖北 神农架", + // 湖南省 @"430000" : @"湖南", - @"430100" : @"长沙", - @"430200" : @"株洲", - @"430300" : @"湘潭", - @"430400" : @"衡阳", - @"430500" : @"邵阳", - @"430600" : @"岳阳", - @"430700" : @"常德", - @"430800" : @"张家界", - @"430900" : @"益阳", - @"431000" : @"郴州", - @"431100" : @"永州", - @"431200" : @"怀化", - @"431300" : @"娄底", - @"433100" : @"湘西", + @"430100" : @"湖南 长沙", + @"430200" : @"湖南 株洲", + @"430300" : @"湖南 湘潭", + @"430400" : @"湖南 衡阳", + @"430500" : @"湖南 邵阳", + @"430600" : @"湖南 岳阳", + @"430700" : @"湖南 常德", + @"430800" : @"湖南 张家界", + @"430900" : @"湖南 益阳", + @"431000" : @"湖南 郴州", + @"431100" : @"湖南 永州", + @"431200" : @"湖南 怀化", + @"431300" : @"湖南 娄底", + @"433100" : @"湖南 湘西", + // 广东省 @"440000" : @"广东", - @"440100" : @"广州", - @"440200" : @"韶关", - @"440300" : @"深圳", - @"440400" : @"珠海", - @"440500" : @"汕头", - @"440600" : @"佛山", - @"440700" : @"江门", - @"440800" : @"湛江", - @"440900" : @"茂名", - @"441200" : @"肇庆", - @"441300" : @"惠州", - @"441400" : @"梅州", - @"441500" : @"汕尾", - @"441600" : @"河源", - @"441700" : @"阳江", - @"441800" : @"清远", - @"441900" : @"东莞", - @"442000" : @"中山", - @"445100" : @"潮州", - @"445200" : @"揭阳", - @"445300" : @"云浮", + @"440100" : @"广东 广州", + @"440200" : @"广东 韶关", + @"440300" : @"广东 深圳", + @"440400" : @"广东 珠海", + @"440500" : @"广东 汕头", + @"440600" : @"广东 佛山", + @"440700" : @"广东 江门", + @"440800" : @"广东 湛江", + @"440900" : @"广东 茂名", + @"441200" : @"广东 肇庆", + @"441300" : @"广东 惠州", + @"441400" : @"广东 梅州", + @"441500" : @"广东 汕尾", + @"441600" : @"广东 河源", + @"441700" : @"广东 阳江", + @"441800" : @"广东 清远", + @"441900" : @"广东 东莞", + @"442000" : @"广东 中山", + @"445100" : @"广东 潮州", + @"445200" : @"广东 揭阳", + @"445300" : @"广东 云浮", + // 广西壮族自治区 @"450000" : @"广西", - @"450100" : @"南宁", - @"450200" : @"柳州", - @"450300" : @"桂林", - @"450400" : @"梧州", - @"450500" : @"北海", - @"450600" : @"防城港", - @"450700" : @"钦州", - @"450800" : @"贵港", - @"450900" : @"玉林", - @"451000" : @"百色", - @"451100" : @"贺州", - @"451200" : @"河池", - @"451300" : @"来宾", - @"451400" : @"崇左", + @"450100" : @"广西 南宁", + @"450200" : @"广西 柳州", + @"450300" : @"广西 桂林", + @"450400" : @"广西 梧州", + @"450500" : @"广西 北海", + @"450600" : @"广西 防城港", + @"450700" : @"广西 钦州", + @"450800" : @"广西 贵港", + @"450900" : @"广西 玉林", + @"451000" : @"广西 百色", + @"451100" : @"广西 贺州", + @"451200" : @"广西 河池", + @"451300" : @"广西 来宾", + @"451400" : @"广西 崇左", + // 海南省 @"460000" : @"海南", - @"460100" : @"海口", - @"460200" : @"三亚", - @"460300" : @"三沙", - @"460400" : @"儋州", - @"469001" : @"五指山", - @"469002" : @"琼海", - @"469005" : @"文昌", - @"469006" : @"万宁", - @"469007" : @"东方", - @"469021" : @"定安", - @"469022" : @"屯昌", - @"469023" : @"澄迈", - @"469024" : @"临高", - @"469025" : @"白沙", - @"469026" : @"昌江", - @"469027" : @"乐东", - @"469028" : @"陵水", - @"469029" : @"保亭", - @"469030" : @"琼中", - @"500000" : @"重庆", - @"500100" : @"重庆", + @"460100" : @"海南 海口", + @"460200" : @"海南 三亚", + @"460300" : @"海南 三沙", + @"460400" : @"海南 儋州", + @"469001" : @"海南 五指山", + @"469002" : @"海南 琼海", + @"469005" : @"海南 文昌", + @"469006" : @"海南 万宁", + @"469007" : @"海南 东方", + @"469021" : @"海南 定安", + @"469022" : @"海南 屯昌", + @"469023" : @"海南 澄迈", + @"469024" : @"海南 临高", + @"469025" : @"海南 白沙", + @"469026" : @"海南 昌江", + @"469027" : @"海南 乐东", + @"469028" : @"海南 陵水", + @"469029" : @"海南 保亭", + @"469030" : @"海南 琼中", + // 四川省 @"510000" : @"四川", - @"510100" : @"成都", - @"510300" : @"自贡", - @"510400" : @"攀枝花", - @"510500" : @"泸州", - @"510600" : @"德阳", - @"510700" : @"绵阳", - @"510800" : @"广元", - @"510900" : @"遂宁", - @"511000" : @"内江", - @"511100" : @"乐山", - @"511300" : @"南充", - @"511400" : @"眉山", - @"511500" : @"宜宾", - @"511600" : @"广安", - @"511700" : @"达州", - @"511800" : @"雅安", - @"511900" : @"巴中", - @"512000" : @"资阳", - @"513200" : @"阿坝", - @"513300" : @"甘孜", - @"513400" : @"凉山", + @"510100" : @"四川 成都", + @"510300" : @"四川 自贡", + @"510400" : @"四川 攀枝花", + @"510500" : @"四川 泸州", + @"510600" : @"四川 德阳", + @"510700" : @"四川 绵阳", + @"510800" : @"四川 广元", + @"510900" : @"四川 遂宁", + @"511000" : @"四川 内江", + @"511100" : @"四川 乐山", + @"511300" : @"四川 南充", + @"511400" : @"四川 眉山", + @"511500" : @"四川 宜宾", + @"511600" : @"四川 广安", + @"511700" : @"四川 达州", + @"511800" : @"四川 雅安", + @"511900" : @"四川 巴中", + @"512000" : @"四川 资阳", + @"513200" : @"四川 阿坝", + @"513300" : @"四川 甘孜", + @"513400" : @"四川 凉山", + // 贵州省 @"520000" : @"贵州", - @"520100" : @"贵阳", - @"520200" : @"六盘水", - @"520300" : @"遵义", - @"520400" : @"安顺", - @"520500" : @"毕节", - @"520600" : @"铜仁", - @"522300" : @"黔西南", - @"522600" : @"黔东南", - @"522700" : @"黔南", + @"520100" : @"贵州 贵阳", + @"520200" : @"贵州 六盘水", + @"520300" : @"贵州 遵义", + @"520400" : @"贵州 安顺", + @"520500" : @"贵州 毕节", + @"520600" : @"贵州 铜仁", + @"522300" : @"贵州 黔西南", + @"522600" : @"贵州 黔东南", + @"522700" : @"贵州 黔南", + // 云南省 @"530000" : @"云南", - @"530100" : @"昆明", - @"530300" : @"曲靖", - @"530400" : @"玉溪", - @"530500" : @"保山", - @"530600" : @"昭通", - @"530700" : @"丽江", - @"530800" : @"普洱", - @"530900" : @"临沧", - @"532300" : @"楚雄", - @"532500" : @"红河", - @"532600" : @"文山", - @"532800" : @"西双版纳", - @"532900" : @"大理", - @"533100" : @"德宏", - @"533300" : @"怒江", - @"533400" : @"迪庆", + @"530100" : @"云南 昆明", + @"530300" : @"云南 曲靖", + @"530400" : @"云南 玉溪", + @"530500" : @"云南 保山", + @"530600" : @"云南 昭通", + @"530700" : @"云南 丽江", + @"530800" : @"云南 普洱", + @"530900" : @"云南 临沧", + @"532300" : @"云南 楚雄", + @"532500" : @"云南 红河", + @"532600" : @"云南 文山", + @"532800" : @"云南 西双版纳", + @"532900" : @"云南 大理", + @"533100" : @"云南 德宏", + @"533300" : @"云南 怒江", + @"533400" : @"云南 迪庆", + // 西藏自治区 @"540000" : @"西藏", - @"540100" : @"拉萨", - @"540200" : @"日喀则", - @"540300" : @"昌都", - @"540400" : @"林芝", - @"540500" : @"山南", - @"542400" : @"那曲", - @"542500" : @"阿里", + @"540100" : @"西藏 拉萨", + @"540200" : @"西藏 日喀则", + @"540300" : @"西藏 昌都", + @"540400" : @"西藏 林芝", + @"540500" : @"西藏 山南", + @"542400" : @"西藏 那曲", + @"542500" : @"西藏 阿里", + // 陕西省 @"610000" : @"陕西", - @"610100" : @"西安", - @"610200" : @"铜川", - @"610300" : @"宝鸡", - @"610400" : @"咸阳", - @"610500" : @"渭南", - @"610600" : @"延安", - @"610700" : @"汉中", - @"610800" : @"榆林", - @"610900" : @"安康", - @"611000" : @"商洛", + @"610100" : @"陕西 西安", + @"610200" : @"陕西 铜川", + @"610300" : @"陕西 宝鸡", + @"610400" : @"陕西 咸阳", + @"610500" : @"陕西 渭南", + @"610600" : @"陕西 延安", + @"610700" : @"陕西 汉中", + @"610800" : @"陕西 榆林", + @"610900" : @"陕西 安康", + @"611000" : @"陕西 商洛", + // 甘肃省 @"620000" : @"甘肃", - @"620100" : @"兰州", - @"620200" : @"嘉峪关", - @"620300" : @"金昌", - @"620400" : @"白银", - @"620500" : @"天水", - @"620600" : @"武威", - @"620700" : @"张掖", - @"620800" : @"平凉", - @"620900" : @"酒泉", - @"621000" : @"庆阳", - @"621100" : @"定西", - @"621200" : @"陇南", - @"622900" : @"临夏", - @"623000" : @"甘南", + @"620100" : @"甘肃 兰州", + @"620200" : @"甘肃 嘉峪关", + @"620300" : @"甘肃 金昌", + @"620400" : @"甘肃 白银", + @"620500" : @"甘肃 天水", + @"620600" : @"甘肃 武威", + @"620700" : @"甘肃 张掖", + @"620800" : @"甘肃 平凉", + @"620900" : @"甘肃 酒泉", + @"621000" : @"甘肃 庆阳", + @"621100" : @"甘肃 定西", + @"621200" : @"甘肃 陇南", + @"622900" : @"甘肃 临夏", + @"623000" : @"甘肃 甘南", + // 青海省 @"630000" : @"青海", - @"630100" : @"西宁", - @"630200" : @"海东", - @"632200" : @"海北", - @"632300" : @"黄南", - @"632500" : @"海南", - @"632600" : @"果洛", - @"632700" : @"玉树", - @"632800" : @"海西", + @"630100" : @"青海 西宁", + @"630200" : @"青海 海东", + @"632200" : @"青海 海北", + @"632300" : @"青海 黄南", + @"632500" : @"青海 海南", + @"632600" : @"青海 果洛", + @"632700" : @"青海 玉树", + @"632800" : @"青海 海西", + // 宁夏回族自治区 @"640000" : @"宁夏", - @"640100" : @"银川", - @"640200" : @"石嘴山", - @"640300" : @"吴忠", - @"640400" : @"固原", - @"640500" : @"中卫", + @"640100" : @"宁夏 银川", + @"640200" : @"宁夏 石嘴山", + @"640300" : @"宁夏 吴忠", + @"640400" : @"宁夏 固原", + @"640500" : @"宁夏 中卫", + // 新疆维吾尔自治区 @"650000" : @"新疆", - @"650100" : @"乌鲁木齐", - @"650200" : @"克拉玛依", - @"650400" : @"吐鲁番", - @"650500" : @"哈密", - @"652300" : @"昌吉", - @"652700" : @"博尔塔拉", - @"652800" : @"巴音郭楞", - @"652900" : @"阿克苏", - @"653000" : @"克孜勒苏", - @"653100" : @"喀什", - @"653200" : @"和田", - @"654000" : @"伊犁", - @"654200" : @"塔城", - @"654300" : @"阿勒泰", - @"659001" : @"石河子", - @"659002" : @"阿拉尔", - @"659003" : @"图木舒克", - @"659004" : @"五家渠", - @"659005" : @"北屯", - @"659006" : @"铁门关", - @"659007" : @"双河", - @"659008" : @"可克达拉", + @"650100" : @"新疆 乌鲁木齐", + @"650200" : @"新疆 克拉玛依", + @"650400" : @"新疆 吐鲁番", + @"650500" : @"新疆 哈密", + @"652300" : @"新疆 昌吉", + @"652700" : @"新疆 博尔塔拉", + @"652800" : @"新疆 巴音郭楞", + @"652900" : @"新疆 阿克苏", + @"653000" : @"新疆 克孜勒苏", + @"653100" : @"新疆 喀什", + @"653200" : @"新疆 和田", + @"654000" : @"新疆 伊犁", + @"654200" : @"新疆 塔城", + @"654300" : @"新疆 阿勒泰", + @"659001" : @"新疆 石河子", + @"659002" : @"新疆 阿拉尔", + @"659003" : @"新疆 图木舒克", + @"659004" : @"新疆 五家渠", + @"659005" : @"新疆 北屯", + @"659006" : @"新疆 铁门关", + @"659007" : @"新疆 双河", + @"659008" : @"新疆 可克达拉", + // 台湾省 @"710000" : @"中国台湾", - @"710100" : @"台北", - @"710200" : @"高雄", - @"710300" : @"台中", - @"710400" : @"台北", - @"710500" : @"桃园", - @"710600" : @"台南", - @"710700" : @"彰化", - @"710800" : @"屏东", - @"710900" : @"云林", - @"711000" : @"苗栗", + @"710100" : @"中国台湾 台北", + @"710200" : @"中国台湾 高雄", + @"710300" : @"中国台湾 台中", + @"710400" : @"中国台湾 台北", + @"710500" : @"中国台湾 桃园", + @"710600" : @"中国台湾 台南", + @"710700" : @"中国台湾 彰化", + @"710800" : @"中国台湾 屏东", + @"710900" : @"中国台湾 云林", + @"711000" : @"中国台湾 苗栗", @"711100" : @"中国台湾", - @"711200" : @"嘉义县", - @"711300" : @"南投", - @"711400" : @"宜兰", + @"711200" : @"中国台湾 嘉义县", + @"711300" : @"中国台湾 南投", + @"711400" : @"中国台湾 宜兰", @"711500" : @"中国台湾", @"711600" : @"中国台湾", - @"711700" : @"花莲", - @"711800" : @"嘉义市", - @"711900" : @"台东", - @"712100" : @"澎湖", + @"711700" : @"中国台湾 花莲", + @"711800" : @"中国台湾 嘉义市", + @"711900" : @"中国台湾 台东", + @"712100" : @"中国台湾 澎湖", + // 香港特别行政区 @"810000" : @"中国香港", - @"810100" : @"香港岛", - @"810200" : @"九龙", - @"810300" : @"新界", + @"810100" : @"中国香港 香港岛", + @"810200" : @"中国香港 九龙", + @"810300" : @"中国香港 新界", + // 澳门特别行政区 @"820000" : @"中国澳门", - @"820100" : @"澳门半岛", - @"820200" : @"氹仔", - @"820300" : @"路环", - @"820400" : @"无堂", + @"820100" : @"中国澳门 澳门半岛", + @"820200" : @"中国澳门 氹仔", + @"820300" : @"中国澳门 路环", + @"820400" : @"中国澳门 无堂", @"820500" : @"中国澳门", @"820600" : @"中国澳门", @"820700" : @"中国澳门", @@ -450,13 +482,15 @@ - (void)loadCityData { } - (NSString *)getCityNameWithCode:(NSString *)code { - if (!code || code.length < 6) { + if (!code || code.length == 0) { return nil; } - NSString *cityName = self.cityCodeMap[code]; + if ([code isEqualToString:@"0"] || [code integerValue] == 0) { + return nil; + } - return cityName; + return self.cityCodeMap[code]; } - (NSString *)getProvinceNameWithCode:(NSString *)code { @@ -470,6 +504,221 @@ - (NSString *)getProvinceNameWithCode:(NSString *)code { return provinceCodeName; } +- (void)loadCountryData { + self.countryCodeMap = @{ + // 亚洲 + @"HK" : @"中国香港", + @"MO" : @"中国澳门", + @"TW" : @"中国台湾", + @"JP" : @"日本", + @"KR" : @"韩国", + @"KP" : @"朝鲜", + @"SG" : @"新加坡", + @"MY" : @"马来西亚", + @"TH" : @"泰国", + @"VN" : @"越南", + @"ID" : @"印度尼西亚", + @"PH" : @"菲律宾", + @"IN" : @"印度", + @"PK" : @"巴基斯坦", + @"BD" : @"孟加拉国", + @"MM" : @"缅甸", + @"LA" : @"老挝", + @"KH" : @"柬埔寨", + @"BN" : @"文莱", + @"MN" : @"蒙古", + @"NP" : @"尼泊尔", + @"BT" : @"不丹", + @"LK" : @"斯里兰卡", + @"MV" : @"马尔代夫", + @"AF" : @"阿富汗", + @"TJ" : @"塔吉克斯坦", + @"KG" : @"吉尔吉斯斯坦", + @"KZ" : @"哈萨克斯坦", + @"UZ" : @"乌兹别克斯坦", + @"TM" : @"土库曼斯坦", + @"IR" : @"伊朗", + @"IQ" : @"伊拉克", + @"SA" : @"沙特阿拉伯", + @"AE" : @"阿联酋", + @"IL" : @"以色列", + @"TR" : @"土耳其", + @"SY" : @"叙利亚", + @"JO" : @"约旦", + @"LB" : @"黎巴嫩", + @"YE" : @"也门", + @"OM" : @"阿曼", + @"KW" : @"科威特", + @"QA" : @"卡塔尔", + @"BH" : @"巴林", + // 欧洲 + @"GB" : @"英国", + @"FR" : @"法国", + @"DE" : @"德国", + @"IT" : @"意大利", + @"ES" : @"西班牙", + @"PT" : @"葡萄牙", + @"NL" : @"荷兰", + @"BE" : @"比利时", + @"LU" : @"卢森堡", + @"CH" : @"瑞士", + @"AT" : @"奥地利", + @"SE" : @"瑞典", + @"NO" : @"挪威", + @"DK" : @"丹麦", + @"FI" : @"芬兰", + @"IS" : @"冰岛", + @"IE" : @"爱尔兰", + @"PL" : @"波兰", + @"CZ" : @"捷克", + @"SK" : @"斯洛伐克", + @"HU" : @"匈牙利", + @"RO" : @"罗马尼亚", + @"BG" : @"保加利亚", + @"GR" : @"希腊", + @"RS" : @"塞尔维亚", + @"HR" : @"克罗地亚", + @"SI" : @"斯洛文尼亚", + @"BA" : @"波黑", + @"MK" : @"北马其顿", + @"AL" : @"阿尔巴尼亚", + @"ME" : @"黑山", + @"RU" : @"俄罗斯", + @"UA" : @"乌克兰", + @"BY" : @"白俄罗斯", + @"MD" : @"摩尔多瓦", + @"LT" : @"立陶宛", + @"LV" : @"拉脱维亚", + @"EE" : @"爱沙尼亚", + @"GE" : @"格鲁吉亚", + @"AM" : @"亚美尼亚", + @"AZ" : @"阿塞拜疆", + @"PS" : @"巴勒斯坦", + @"CY" : @"塞浦路斯", + @"TL" : @"东帝汶", + // 北美洲 + @"US" : @"美国", + @"CA" : @"加拿大", + @"MX" : @"墨西哥", + @"GT" : @"危地马拉", + @"BZ" : @"伯利兹", + @"SV" : @"萨尔瓦多", + @"HN" : @"洪都拉斯", + @"NI" : @"尼加拉瓜", + @"CR" : @"哥斯达黎加", + @"PA" : @"巴拿马", + @"CU" : @"古巴", + @"JM" : @"牙买加", + @"HT" : @"海地", + @"DO" : @"多米尼加", + @"TT" : @"特立尼达和多巴哥", + @"BS" : @"巴哈马", + @"BB" : @"巴巴多斯", + @"GD" : @"格林纳达", + @"LC" : @"圣卢西亚", + @"VC" : @"圣文森特和格林纳丁斯", + @"AG" : @"安提瓜和巴布达", + @"DM" : @"多米尼克", + @"KN" : @"圣基茨和尼维斯", + @"PR" : @"波多黎各", + // 南美洲 + @"BR" : @"巴西", + @"AR" : @"阿根廷", + @"CL" : @"智利", + @"CO" : @"哥伦比亚", + @"PE" : @"秘鲁", + @"VE" : @"委内瑞拉", + @"EC" : @"厄瓜多尔", + @"BO" : @"玻利维亚", + @"PY" : @"巴拉圭", + @"UY" : @"乌拉圭", + @"GY" : @"圭亚那", + @"SR" : @"苏里南", + @"GF" : @"法属圭亚那", + // 非洲 + @"EG" : @"埃及", + @"ZA" : @"南非", + @"NG" : @"尼日利亚", + @"KE" : @"肯尼亚", + @"ET" : @"埃塞俄比亚", + @"GH" : @"加纳", + @"TZ" : @"坦桑尼亚", + @"UG" : @"乌干达", + @"DZ" : @"阿尔及利亚", + @"MA" : @"摩洛哥", + @"TN" : @"突尼斯", + @"LY" : @"利比亚", + @"SD" : @"苏丹", + @"AO" : @"安哥拉", + @"MZ" : @"莫桑比克", + @"ZM" : @"赞比亚", + @"ZW" : @"津巴布韦", + @"BW" : @"博茨瓦纳", + @"NA" : @"纳米比亚", + @"RW" : @"卢旺达", + @"BI" : @"布隆迪", + @"SN" : @"塞内加尔", + @"ML" : @"马里", + @"CI" : @"科特迪瓦", + @"CM" : @"喀麦隆", + @"CD" : @"刚果(金)", + @"CG" : @"刚果(布)", + @"GA" : @"加蓬", + @"GN" : @"几内亚", + @"BF" : @"布基纳法索", + @"NE" : @"尼日尔", + @"TD" : @"乍得", + @"CF" : @"中非", + @"SS" : @"南苏丹", + @"SO" : @"索马里", + @"DJ" : @"吉布提", + @"ER" : @"厄立特里亚", + @"MG" : @"马达加斯加", + @"MU" : @"毛里求斯", + @"SC" : @"塞舌尔", + @"RE" : @"留尼汪", + @"MW" : @"马拉维", + @"LS" : @"莱索托", + @"SZ" : @"斯威士兰", + // 大洋洲 + @"AU" : @"澳大利亚", + @"NZ" : @"新西兰", + @"PG" : @"巴布亚新几内亚", + @"FJ" : @"斐济", + @"WS" : @"萨摩亚", + @"TO" : @"汤加", + @"VU" : @"瓦努阿图", + @"KI" : @"基里巴斯", + @"SB" : @"所罗门群岛", + @"TV" : @"图瓦卢", + @"NR" : @"瑙鲁", + @"PW" : @"帕劳", + @"FM" : @"密克罗尼西亚", + @"MH" : @"马绍尔群岛", + @"NC" : @"新喀里多尼亚", + @"PF" : @"法属波利尼西亚", + @"GU" : @"关岛", + @"AS" : @"美属萨摩亚", + // 欧洲小国和其他 + @"MC" : @"摩纳哥", + @"AD" : @"安道尔", + @"LI" : @"列支敦士登", + @"SM" : @"圣马力诺", + @"VA" : @"梵蒂冈", + @"MT" : @"马耳他", + @"XK" : @"科索沃", + }; +} + +- (NSString *)getCountryNameWithCode:(NSString *)code { + if (!code || code.length == 0) { + return nil; + } + + NSString *upperCode = [code uppercaseString]; + return self.countryCodeMap[upperCode]; +} + + (void)fetchLocationWithGeonameId:(NSString *)geonameId completionHandler:(void (^)(NSDictionary *locationInfo, NSError *error))completionHandler { if (geonameId.length == 0) { if (completionHandler) { @@ -481,7 +730,11 @@ + (void)fetchLocationWithGeonameId:(NSString *)geonameId completionHandler:(void NSString *username = [[NSUserDefaults standardUserDefaults] stringForKey:@"DYYYGeonamesUsername"]; if (!username || [username length] == 0) { - username = @"your_username"; + if (completionHandler) { + NSError *noAccountError = [NSError errorWithDomain:DYYYGeonamesErrorDomain code:-4 userInfo:@{NSLocalizedDescriptionKey : @"未配置 GeoNames 账号"}]; + completionHandler(nil, noAccountError); + } + return; } NSCharacterSet *allowedSet = [NSCharacterSet URLQueryAllowedCharacterSet]; @@ -507,7 +760,10 @@ + (void)fetchLocationWithGeonameId:(NSString *)geonameId completionHandler:(void NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; if (httpResponse.statusCode != 200) { - completionHandler(nil, [NSError errorWithDomain:@"com.dyyy.api" code:httpResponse.statusCode userInfo:nil]); + NSError *httpError = [NSError errorWithDomain:@"com.dyyy.api" + code:httpResponse.statusCode + userInfo:@{NSLocalizedDescriptionKey : @"HTTP 请求失败"}]; + completionHandler(nil, httpError); return; } @@ -523,7 +779,7 @@ + (void)fetchLocationWithGeonameId:(NSString *)geonameId completionHandler:(void if (status && [status isKindOfClass:[NSDictionary class]]) { NSNumber *value = status[@"value"]; NSInteger statusCode = value != nil ? value.integerValue : -1; - NSString *message = status[@"message"] ?: @"the geoname feature does not exist."; + NSString *message = status[@"message"] ?: @"Geonames API 返回错误"; NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; userInfo[NSLocalizedDescriptionKey] = message; diff --git a/DYYY.xm b/DYYY.xm index 787c88346..281c28ee9 100644 --- a/DYYY.xm +++ b/DYYY.xm @@ -12,6 +12,7 @@ #import #import "AwemeHeaders.h" +#import "CityManager.h" #import "DYYYBottomAlertView.h" #import "DYYYManager.h" @@ -1089,27 +1090,158 @@ static CGFloat rightLabelRightMargin = -1; - (id)timestampLabel { UILabel *label = %orig; + BOOL isEnableArea = DYYYGetBool(@"DYYYEnableArea"); + if (!isEnableArea) { + return label; + } + NSString *labelColorHex = [[NSUserDefaults standardUserDefaults] objectForKey:@"DYYYLabelColor"]; if (DYYYGetBool(@"DYYYEnableRandomGradient")) { labelColorHex = @"random_gradient"; } - if (DYYYGetBool(@"DYYYEnableArea")) { - [DYYYUtils processAndApplyIPLocationToLabel:label forModel:self.model withLabelColor:labelColorHex]; + + BOOL boldEnabled = DYYYGetBool(@"DYYYBoldTimestamp"); + if (boldEnabled && label.font) { + UIFont *boldFont = [UIFont boldSystemFontOfSize:label.font.pointSize]; + label.font = boldFont; + } + + NSString *cityCode = self.model.cityCode; + NSString *regionCode = nil; + if ([self.model respondsToSelector:@selector(region)]) { + regionCode = [self.model performSelector:@selector(region)]; + } + + if (cityCode && ([cityCode isEqualToString:@"0"] || [cityCode integerValue] == 0)) { + cityCode = nil; + } + + static NSCache *locationCache; + static NSMutableSet *inFlight; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + locationCache = [[NSCache alloc] init]; + locationCache.countLimit = 100; + inFlight = [[NSMutableSet alloc] init]; + }); + + void (^updateLabelWithLocation)(UILabel *, NSString *) = ^(UILabel *lbl, NSString *location) { + if (location.length == 0) return; + + NSString *currentText = lbl.text ?: @""; + if ([currentText containsString:location]) return; + + if ([currentText containsString:@"IP属地:"]) { + NSRange range = [currentText rangeOfString:@"IP属地:"]; + NSString *baseText = [currentText substringToIndex:range.location]; + lbl.text = [NSString stringWithFormat:@"%@IP属地:%@", baseText, location]; + } else if (currentText.length > 0) { + lbl.text = [NSString stringWithFormat:@"%@ IP属地:%@", currentText, location]; + } + + [DYYYUtils applyColorSettingsToLabel:lbl colorHexString:labelColorHex]; + }; + + if (cityCode.length == 0 && regionCode.length == 0) { + updateLabelWithLocation(label, @"未知地区"); + return label; + } + + NSString *cacheKey = cityCode.length > 0 ? cityCode : regionCode; + + NSString *cachedLocation = [locationCache objectForKey:cacheKey]; + if (cachedLocation) { + updateLabelWithLocation(label, cachedLocation); + + NSString *ipScaleValue = [[NSUserDefaults standardUserDefaults] objectForKey:@"DYYYNicknameScale"]; + if (ipScaleValue.length > 0) { + UIFont *originalFont = label.font; + CGFloat offset = DYYYGetFloat(@"DYYYIPLabelVerticalOffset"); + if (offset > 0) { + label.transform = CGAffineTransformMakeTranslation(0, -offset); + } else { + label.transform = CGAffineTransformMakeTranslation(0, -3); + } + label.font = originalFont; + } + return label; + } + + NSString *displayLocation = nil; + + if (cityCode.length > 0) { + displayLocation = [CityManager.sharedInstance getCityNameWithCode:cityCode]; + + if (!displayLocation && regionCode.length > 0) { + displayLocation = [CityManager.sharedInstance getCountryNameWithCode:regionCode]; + } + + if (!displayLocation) { + @synchronized(inFlight) { + if ([inFlight containsObject:cityCode]) { + return label; + } + [inFlight addObject:cityCode]; + } + + [CityManager fetchLocationWithGeonameId:cityCode completionHandler:^(NSDictionary *locationInfo, NSError *error) { + dispatch_async(dispatch_get_main_queue(), ^{ + @synchronized(inFlight) { + [inFlight removeObject:cityCode]; + } + + NSString *apiLocation = nil; + + if (!error && locationInfo) { + NSString *cityName = locationInfo[@"adminName1"]; + NSString *countryName = locationInfo[@"countryName"]; + + if (cityName && countryName) { + if ([cityName isEqualToString:countryName]) { + apiLocation = countryName; + } else { + apiLocation = [NSString stringWithFormat:@"%@ %@", countryName, cityName]; + } + } else if (countryName) { + apiLocation = countryName; + } else if (cityName) { + apiLocation = cityName; + } + } + + if (apiLocation) { + [locationCache setObject:apiLocation forKey:cacheKey]; + updateLabelWithLocation(label, apiLocation); + } + }); + }]; + + return label; + } } - // 应用IP属地标签上移 + + if (!displayLocation && !cityCode && regionCode.length > 0) { + displayLocation = [CityManager.sharedInstance getCountryNameWithCode:regionCode]; + } + + if (!displayLocation) { + displayLocation = @"未知地区"; + updateLabelWithLocation(label, displayLocation); + return label; + } + + [locationCache setObject:displayLocation forKey:cacheKey]; + updateLabelWithLocation(label, displayLocation); + NSString *ipScaleValue = [[NSUserDefaults standardUserDefaults] objectForKey:@"DYYYNicknameScale"]; if (ipScaleValue.length > 0) { UIFont *originalFont = label.font; - CGRect originalFrame = label.frame; CGFloat offset = DYYYGetFloat(@"DYYYIPLabelVerticalOffset"); if (offset > 0) { - CGAffineTransform translationTransform = CGAffineTransformMakeTranslation(0, -offset); - label.transform = translationTransform; + label.transform = CGAffineTransformMakeTranslation(0, -offset); } else { - CGAffineTransform translationTransform = CGAffineTransformMakeTranslation(0, -3); - label.transform = translationTransform; + label.transform = CGAffineTransformMakeTranslation(0, -3); } - label.font = originalFont; } return label; @@ -2578,16 +2710,6 @@ static NSArray *DYYYIMMenuItemsByAddingDownloadAction(NSArray *menuItems, id cel } %end -// 移除共创头像列表 -%hook AWEPlayInteractionCoCreatorNewInfoView -- (void)layoutSubviews { - if (DYYYGetBool(@"DYYYHideGongChuang")) { - [self removeFromSuperview]; - return; - } - %orig; -} -%end // 隐藏右下音乐和取消静音按钮 %hook AFDCancelMuteAwemeView @@ -2768,42 +2890,7 @@ static NSArray *DYYYIMMenuItemsByAddingDownloadAction(NSArray *menuItems, id cel %end -%hook ACCGestureResponsibleStickerView - -- (void)layoutSubviews { - %orig; - if (DYYYGetBool(@"DYYYHideEditTags")) { - for (UIView *subview in self.subviews) { - if ([subview isKindOfClass:NSClassFromString(@"ACCEditTagStickerView")]) { - self.hidden = YES; - return; - } - } - } - - if (DYYYGetBool(@"DYYYHideChallengeStickers")) { - for (UIView *subview in self.subviews) { - if ([subview isKindOfClass:NSClassFromString(@"ACCMordernQuickFlashStickerView")]) { - self.hidden = YES; - return; - } - } - } -} - -%end - -// 去除"我的"加入挑战横幅 -%hook AWEPostWorkViewController -- (BOOL)isDouGuideTipViewShow { - BOOL r = %orig; - if (DYYYGetBool(@"DYYYHideChallengeStickers")) { - return YES; - } - return r; -} -%end // 隐藏消息页顶栏头像气泡 %hook AFDSkylightCellBubble @@ -2854,39 +2941,6 @@ static NSArray *DYYYIMMenuItemsByAddingDownloadAction(NSArray *menuItems, id cel } %end -// 隐藏合集和声明 -%hook AWEAntiAddictedNoticeBarView -- (void)layoutSubviews { - %orig; - - // 获取 tipsLabel 属性 - UILabel *tipsLabel = [self valueForKey:@"tipsLabel"]; - - if (tipsLabel && [tipsLabel isKindOfClass:%c(UILabel)]) { - NSString *labelText = tipsLabel.text; - - if (labelText) { - // 明确判断是合集还是作者声明 - if ([labelText containsString:@"合集"]) { - // 如果是合集,只检查合集的开关 - if (DYYYGetBool(@"DYYYHideTemplateVideo")) { - [self removeFromSuperview]; - return; - } else if (DYYYGetBool(@"DYYYEnableFullScreen")) { - self.backgroundColor = [UIColor clearColor]; - } - } else { - // 如果不是合集(即作者声明),只检查声明的开关 - if (DYYYGetBool(@"DYYYHideAntiAddictedNotice")) { - [self removeFromSuperview]; - return; - } - } - } - } -} -%end - // 隐藏我的添加朋友 %hook AWEProfileNavigationButton - (void)setupUI { @@ -2936,24 +2990,6 @@ static NSArray *DYYYIMMenuItemsByAddingDownloadAction(NSArray *menuItems, id cel %end -// 移除下面推荐框黑条 -%hook AWEPlayInteractionRelatedVideoView -- (void)layoutSubviews { - %orig; - if (DYYYGetBool(@"DYYYHideBottomRelated")) { - [self removeFromSuperview]; - } -} -%end - -%hook AWEFeedRelatedSearchTipView -- (void)layoutSubviews { - %orig; - if (DYYYGetBool(@"DYYYHideBottomRelated")) { - [self removeFromSuperview]; - } -} -%end %hook AWELeftSideBarEntranceView @@ -3351,64 +3387,7 @@ static NSArray *DYYYIMMenuItemsByAddingDownloadAction(NSArray *menuItems, id cel } %end -// 隐藏昵称上方元素 -%hook AWEFeedAnchorContainerView - -- (void)layoutSubviews { - %orig; - BOOL hideFeedAnchor = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); - BOOL hideLocation = DYYYGetBool(@"DYYYHideLocation"); - if (hideFeedAnchor && hideLocation) { - self.hidden = YES; - return; - } else if (hideFeedAnchor || hideLocation) { - BOOL isLocation = NO; - for (UIView *subview in self.subviews) { - if ([subview isKindOfClass:%c(AWEFeedTemplateAnchorView)] || [subview isKindOfClass:%c(AWEPOITradeEntryAnchorView)]) { - isLocation = YES; - break; - } - } - if ((isLocation && hideLocation) || (!isLocation && hideFeedAnchor)) { - self.hidden = YES; - return; - } - } -} - -%end - -%hook AWEFeedTemplateAnchorView - -- (void)layoutSubviews { - %orig; - - BOOL hideFeedAnchor = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); - BOOL hideLocation = DYYYGetBool(@"DYYYHideLocation"); - - if (!hideFeedAnchor && !hideLocation) - return; - - AWECodeGenCommonAnchorBasicInfoModel *anchorInfo = [self valueForKey:@"templateAnchorInfo"]; - if (!anchorInfo || ![anchorInfo respondsToSelector:@selector(name)]) - return; - - NSString *name = [anchorInfo valueForKey:@"name"]; - BOOL isPoi = [name isEqualToString:@"poi_poi"]; - - if ((hideFeedAnchor && !isPoi) || (hideLocation && isPoi)) { - UIView *parentView = self.superview; - if (parentView) { - UIView *grandparentView = parentView.superview; - if (grandparentView && [grandparentView isKindOfClass:%c(AWEBaseElementView)]) { - [grandparentView removeFromSuperview]; - return; - } - } - } -} -%end %hook AWEPlayInteractionSearchAnchorView @@ -3422,20 +3401,6 @@ static NSArray *DYYYIMMenuItemsByAddingDownloadAction(NSArray *menuItems, id cel %end -%hook AWEAwemeMusicInfoView - -- (void)layoutSubviews { - if (DYYYGetBool(@"DYYYHideQuqishuiting")) { - UIView *parentView = self.superview; - if (parentView) { - [parentView removeFromSuperview]; - } - return; - } - %orig; -} - -%end // 隐藏暂停关键词 %hook AWEFeedPauseRelatedWordComponent @@ -3479,17 +3444,6 @@ static NSArray *DYYYIMMenuItemsByAddingDownloadAction(NSArray *menuItems, id cel %end -// 隐藏短剧合集 -%hook AWETemplatePlayletView - -- (void)layoutSubviews { - %orig; - if (DYYYGetBool(@"DYYYHideTemplatePlaylet")) { - [self removeFromSuperview]; - } -} -%end - // 隐藏视频顶部搜索框、隐藏搜索框背景、应用全局透明 %hook AWESearchEntranceView @@ -3572,40 +3526,7 @@ static NSArray *DYYYIMMenuItemsByAddingDownloadAction(NSArray *menuItems, id cel %end -// 隐藏下面底部热点框 - -%hook AWETemplateHotspotView -- (void)layoutSubviews { - %orig; - if (DYYYGetBool(@"DYYYHideHotspot")) { - [self removeFromSuperview]; - return; - } -} - -%end - -%hook AWEHomePageBubbleLiveHeadLabelContentView -- (void)layoutSubviews { - %orig; - if (DYYYGetBool(@"DYYYHideConcernCapsuleView")) { - UIView *parentView = self.superview; - UIView *grandparentView = parentView.superview; - - if (grandparentView) { - grandparentView.hidden = YES; - return; - } else if (parentView) { - parentView.hidden = YES; - return; - } else { - self.hidden = YES; - return; - } - } -} -%end // 隐藏直播发现 %hook AWEFeedLiveTabRevisitControlView @@ -4407,74 +4328,6 @@ static NSHashTable *processedParentViews = nil; } %end -// 屏蔽青少年模式弹窗 -%hook AWEChildModeModuleService -- (BOOL)shouldShowTeenModeAlert { - if (DYYYGetBool(@"DYYYHideTeenMode")) { - return NO; - } - return %orig; -} -%end - -%hook AWEDigitalWellbeingAlertManager -- (BOOL)teenModeShouldAlertInFeed { - if (DYYYGetBool(@"DYYYHideTeenMode")) { - return NO; - } - return %orig; -} - -- (BOOL)teenModeShouldAlertInFirstPage { - if (DYYYGetBool(@"DYYYHideTeenMode")) { - return NO; - } - return %orig; -} - -- (BOOL)teenModeShouldAlertInTime { - if (DYYYGetBool(@"DYYYHideTeenMode")) { - return NO; - } - return %orig; -} - -- (BOOL)teenModeShouldAlertAfterRandom { - if (DYYYGetBool(@"DYYYHideTeenMode")) { - return NO; - } - return %orig; -} - -- (BOOL)shouldShowTeenModeIntroductionAlert { - if (DYYYGetBool(@"DYYYHideTeenMode")) { - return NO; - } - return %orig; -} - -- (void)showTeenModeIntroductionAlert { - if (DYYYGetBool(@"DYYYHideTeenMode")) { - return; - } - %orig; -} - -- (void)showTeenModeSimpleStyleIntroductionAlert { - if (DYYYGetBool(@"DYYYHideTeenMode")) { - return; - } - %orig; -} - -- (void)showTeenModeIntroductionAlertWithPolling { - if (DYYYGetBool(@"DYYYHideTeenMode")) { - return; - } - %orig; -} -%end - %hook AWEAwemeModel - (id)initWithDictionary:(id)arg1 error:(id *)arg2 { @@ -4498,8 +4351,8 @@ static NSHashTable *processedParentViews = nil; BOOL shouldFilterHotSpot = skipHotSpot && self.hotSpotLynxCardModel; BOOL shouldFilterRecLive = skipLive && (self.cellRoom != nil); BOOL shouldFilterAllLive = skipAllLive && [self.videoFeedTag isEqualToString:@"直播中"]; - BOOL shouldskipPhoto = skipPhoto && (self.awemeType == 68) && self.shareRecExtra; - BOOL shouldskipPhotoText = skipPhotoText && self.isNewTextMode && self.shareRecExtra; + BOOL shouldskipPhoto = skipPhoto && (self.awemeType == 68) && [self.referString isEqualToString:@"homepage_hot"]; + BOOL shouldskipPhotoText = skipPhotoText && self.isNewTextMode && [self.referString isEqualToString:@"homepage_hot"]; BOOL shouldFilterHDR = NO; BOOL shouldFilterLowLikes = NO; BOOL shouldFilterKeywords = NO; @@ -4527,7 +4380,7 @@ static NSHashTable *processedParentViews = nil; NSString *filterUsers = [[NSUserDefaults standardUserDefaults] objectForKey:@"DYYYFilterUsers"]; // 检查是否需要过滤特定用户 - if (self.shareRecExtra && ![self.shareRecExtra isEqual:@""] && filterUsers.length > 0 && self.author) { + if ([self.referString isEqualToString:@"homepage_hot"] && filterUsers.length > 0 && self.author) { NSArray *usersList = [filterUsers componentsSeparatedByString:@","]; NSString *currentShortID = self.author.shortID; NSString *currentNickname = self.author.nickname; @@ -4550,7 +4403,7 @@ static NSHashTable *processedParentViews = nil; } // 只有当shareRecExtra不为空时才过滤点赞量低的视频和关键词 - if (self.shareRecExtra && ![self.shareRecExtra isEqual:@""]) { + if ([self.referString isEqualToString:@"homepage_hot"]) { NSInteger filterLowLikesThreshold = DYYYGetInteger(@"DYYYFilterLowLikes"); // 过滤低点赞量视频 if (filterLowLikesThreshold > 0) { @@ -4659,10 +4512,6 @@ static NSHashTable *processedParentViews = nil; %orig(extras); } -- (BOOL)preventDownload { - return NO; -} - // 固定设置为 1,启用自定义背景色 - (NSUInteger)awe_playerBackgroundViewShowType { if ([[NSUserDefaults standardUserDefaults] objectForKey:@"DYYYVideoBGColor"]) { @@ -4682,8 +4531,635 @@ static NSHashTable *processedParentViews = nil; return %orig; } +//屏蔽章节要点数据 +- (NSArray *)chapterList { + BOOL hideChapterList = DYYYGetBool(@"DYYYHideChapterProgress"); + if (hideChapterList) { + return @[]; // 返回空数组 + } + return %orig; +} + +// 屏蔽共创数据 +- (id)acceptedCoCreators { + BOOL DYYYHideGongChuang = DYYYGetBool(@"DYYYHideGongChuang"); + if (DYYYHideGongChuang) { + return @[]; // 永远为空 + } + return %orig; +} + +- (id)unAcceptedCoCreators { + BOOL DYYYHideGongChuang = DYYYGetBool(@"DYYYHideGongChuang"); + if (DYYYHideGongChuang) { + return @[]; + } + return %orig; +} + +- (NSInteger)acceptedCoCreatorsNums { + BOOL DYYYHideGongChuang = DYYYGetBool(@"DYYYHideGongChuang"); + if (DYYYHideGongChuang) { + return 0; + } + return %orig; +} + +- (id)awe_coCreatorPoster { + BOOL DYYYHideGongChuang = DYYYGetBool(@"DYYYHideGongChuang"); + if (DYYYHideGongChuang) { + return nil; + } + return %orig; +} + +- (id)awe_coCreatorFromAuthor { + BOOL DYYYHideGongChuang = DYYYGetBool(@"DYYYHideGongChuang"); + if (DYYYHideGongChuang) { + return nil; + } + return %orig; +} + +- (id)awe_userModelWithCoCreator:(id)creator { + BOOL DYYYHideGongChuang = DYYYGetBool(@"DYYYHideGongChuang"); + if (DYYYHideGongChuang) { + return nil; + } + return %orig; +} + + +// 屏蔽相关视频推荐 +- (id)relatedVideoExtra { + BOOL DYYYHideBottomRelated = DYYYGetBool(@"DYYYHideBottomRelated"); + if (DYYYHideBottomRelated) { + return nil; + } + return %orig; +} + +- (id)relatedVideo { + BOOL DYYYHideBottomRelated = DYYYGetBool(@"DYYYHideBottomRelated"); + if (DYYYHideBottomRelated) { + return nil; + } + return %orig; +} + +- (id)playletRelatedVideoInfoModel { + BOOL DYYYHideBottomRelated = DYYYGetBool(@"DYYYHideBottomRelated"); + if (DYYYHideBottomRelated) { + return nil; + } + return %orig; +} + +// 屏蔽评论搜索锚点 +- (id)commonSearchAnchor { + BOOL DYYYHideCommentLongPressSearch = DYYYGetBool(@"DYYYHideCommentLongPressSearch"); + if (DYYYHideCommentLongPressSearch) { + return nil; + } + return %orig; +} + +- (void)setCommonSearchAnchor:(id)arg { + BOOL DYYYHideCommentLongPressSearch = DYYYGetBool(@"DYYYHideCommentLongPressSearch"); + if (DYYYHideCommentLongPressSearch) { + %orig(nil); + return; + } + %orig; +} + +// 屏蔽汽水音乐锚点 +- (id)relatedMusicAnchor { + BOOL DYYYHideQuqishuiting = DYYYGetBool(@"DYYYHideQuqishuiting"); + if (DYYYHideQuqishuiting) { + return nil; + } + return %orig; +} + +- (void)setRelatedMusicAnchor:(id)anchor { + BOOL DYYYHideQuqishuiting = DYYYGetBool(@"DYYYHideQuqishuiting"); + if (DYYYHideQuqishuiting) { + %orig(nil); + return; + } + %orig; +} + +// 屏蔽底栏热点 +- (id)hotSpotRawData { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return nil; + } + return %orig; +} + +- (void)setHotSpotRawData:(id)data { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + %orig(nil); + return; + } + %orig; +} + +- (id)hotSpotListModel { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return nil; + } + return %orig; +} + +- (void)setHotSpotListModel:(id)model { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + %orig(nil); + return; + } + %orig; +} + +- (NSString *)templateBarsString { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return @""; + } + return %orig; +} + +- (void)setTemplateBarsString:(NSString *)string { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + %orig(@""); + return; + } + %orig; +} + +// 屏蔽底部合集(只对推荐页生效) +- (id)mixInfo { + BOOL DYYYHideTemplateVideo = DYYYGetBool(@"DYYYHideTemplateVideo"); + if (DYYYHideTemplateVideo && [self.referString isEqualToString:@"homepage_hot"]) { + return nil; + } + return %orig; +} + +// 屏蔽短剧信息(复用屏蔽合集开关,只对推荐页生效) +- (id)playletInfoModel { + BOOL DYYYHideTemplatePlaylet = DYYYGetBool(@"DYYYHideTemplatePlaylet"); + if (DYYYHideTemplatePlaylet && [self.referString isEqualToString:@"homepage_hot"]) { + return nil; + } + return %orig; +} + +// 屏蔽锚点信息 +- (id)anchorInfo { + BOOL DYYYHideFeedAnchorContainer = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); + if (DYYYHideFeedAnchorContainer) { + return nil; + } + return %orig; +} + +- (void)setAnchorInfo:(id)info { + BOOL DYYYHideFeedAnchorContainer = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); + if (DYYYHideFeedAnchorContainer) { + %orig(nil); + return; + } + %orig; +} + +- (id)localLifeAnchorInfo { + BOOL DYYYHideFeedAnchorContainer = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); + if (DYYYHideFeedAnchorContainer) { + return nil; + } + return %orig; +} + +- (void)setLocalLifeAnchorInfo:(id)info { + BOOL DYYYHideFeedAnchorContainer = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); + if (DYYYHideFeedAnchorContainer) { + %orig(nil); + return; + } + %orig; +} + +- (id)nearbyFeedDualAnchorInfo { + BOOL DYYYHideFeedAnchorContainer = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); + if (DYYYHideFeedAnchorContainer) { + return nil; + } + return %orig; +} + +- (void)setNearbyFeedDualAnchorInfo:(id)info { + BOOL DYYYHideFeedAnchorContainer = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); + if (DYYYHideFeedAnchorContainer) { + %orig(nil); + return; + } + %orig; +} + +- (id)minorAnchorInfo { + BOOL DYYYHideFeedAnchorContainer = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); + if (DYYYHideFeedAnchorContainer) { + return nil; + } + return %orig; +} + +- (void)setMinorAnchorInfo:(id)info { + BOOL DYYYHideFeedAnchorContainer = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); + if (DYYYHideFeedAnchorContainer) { + %orig(nil); + return; + } + %orig; +} + +// 屏蔽通用锚点(合并到锚点信息) +- (id)commonAnchor { + BOOL DYYYHideFeedAnchorContainer = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); + if (DYYYHideFeedAnchorContainer) { + return nil; + } + return %orig; +} + +- (void)setCommonAnchor:(id)anchor { + BOOL DYYYHideFeedAnchorContainer = DYYYGetBool(@"DYYYHideFeedAnchorContainer"); + if (DYYYHideFeedAnchorContainer) { + %orig(nil); + return; + } + %orig; +} + +// 屏蔽作者声明及风险提示 +- (id)riskInfoModel { + BOOL DYYYHideAntiAddictedNotice = DYYYGetBool(@"DYYYHideAntiAddictedNotice"); + if (DYYYHideAntiAddictedNotice) { + return nil; + } + return %orig; +} + +- (void)setRiskInfoModel:(id)model { + BOOL DYYYHideAntiAddictedNotice = DYYYGetBool(@"DYYYHideAntiAddictedNotice"); + if (DYYYHideAntiAddictedNotice) { + %orig(nil); + return; + } + %orig; +} + %end + + +//以下部分为新增 +// 屏蔽头像光圈 +%hook AWEUserModel + +- (id)storyRing { + BOOL DYYYHideAvatarRing = DYYYGetBool(@"DYYYHideAvatarRing"); + if (DYYYHideAvatarRing) { + return nil; + } + return %orig; +} + +- (void)setStoryRing:(id)ring { + BOOL DYYYHideAvatarRing = DYYYGetBool(@"DYYYHideAvatarRing"); + if (DYYYHideAvatarRing) { + %orig(nil); + return; + } + %orig; +} + +%end + +%hook AWECodeGenStoryRingInfoModel + +- (NSArray *)storyRingsModelArray { + BOOL DYYYHideAvatarRing = DYYYGetBool(@"DYYYHideAvatarRing"); + if (DYYYHideAvatarRing) { + return @[]; + } + return %orig; +} + +- (void)setStoryRingsModelArray:(NSArray *)array { + BOOL DYYYHideAvatarRing = DYYYGetBool(@"DYYYHideAvatarRing"); + if (DYYYHideAvatarRing) { + %orig(@[]); + return; + } + %orig; +} + +%end + +// 屏蔽挑战贴纸 +%hook AWEInteractionHashtagStickerModel + +- (id)hashtagInfo { + BOOL DYYYHideChallengeStickers = DYYYGetBool(@"DYYYHideChallengeStickers"); + if (DYYYHideChallengeStickers) { + return nil; + } + return %orig; +} + +- (void)setHashtagInfo:(id)info { + BOOL DYYYHideChallengeStickers = DYYYGetBool(@"DYYYHideChallengeStickers"); + if (DYYYHideChallengeStickers) { + %orig(nil); + return; + } + %orig; +} + +- (id)hashtagId { + BOOL DYYYHideChallengeStickers = DYYYGetBool(@"DYYYHideChallengeStickers"); + if (DYYYHideChallengeStickers) { + return nil; + } + return %orig; +} + +- (id)hashtagName { + BOOL DYYYHideChallengeStickers = DYYYGetBool(@"DYYYHideChallengeStickers"); + if (DYYYHideChallengeStickers) { + return nil; + } + return %orig; +} + +%end + +// 屏蔽互动贴纸(复用挑战贴纸开关) +%hook AWEInteractionEditTagStickerModel + +- (id)editTagInfo { + BOOL DYYYHideChallengeStickers = DYYYGetBool(@"DYYYHideChallengeStickers"); + if (DYYYHideChallengeStickers) { + return nil; + } + return %orig; +} + +- (void)setEditTagInfo:(id)info { + BOOL DYYYHideChallengeStickers = DYYYGetBool(@"DYYYHideChallengeStickers"); + if (DYYYHideChallengeStickers) { + %orig(nil); + return; + } + %orig; +} + +%end + + +// 隐藏下面底部热点框 +%hook AWEHotSpotListModel + +- (BOOL)disableDisplay { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return YES; + } + return %orig; +} + +- (BOOL)disableDisplayInner { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return YES; + } + return %orig; +} + +- (NSString *)hotSpotTipTitleHeader { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return @""; + } + return %orig; +} + +- (NSString *)hotSpotTipTitle { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return @""; + } + return %orig; +} + +- (NSString *)hotSpotTipTitleFooter { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return @""; + } + return %orig; +} + +- (NSString *)hotInfoWord { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return @""; + } + return %orig; +} + +- (NSString *)i18NTipTitle { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return @""; + } + return %orig; +} + +- (NSString *)tipSchema { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return nil; + } + return %orig; +} + +- (NSDictionary *)extraDictionary { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return @{}; + } + return %orig; +} + +- (NSDictionary *)relativityExtra { + BOOL DYYYHideHotspot = DYYYGetBool(@"DYYYHideHotspot"); + if (DYYYHideHotspot) { + return @{}; + } + return %orig; +} + +%end + +// 屏蔽汽水音乐锚点 - hook AWERelatedMusicAnchorModel +%hook AWERelatedMusicAnchorModel + +- (instancetype)init { + BOOL DYYYHideQuqishuiting = DYYYGetBool(@"DYYYHideQuqishuiting"); + if (DYYYHideQuqishuiting) { + return nil; + } + return %orig; +} + +- (instancetype)initWithDictionary:(id)dict error:(NSError **)error { + BOOL DYYYHideQuqishuiting = DYYYGetBool(@"DYYYHideQuqishuiting"); + if (DYYYHideQuqishuiting) { + return nil; + } + return %orig; +} + +%end + +// 屏蔽汽水音乐 - 清空 commentTopBarInfo +%hook AWEMusicExtraModel + +- (id)commentTopBarInfo { + BOOL DYYYHideQuqishuiting = DYYYGetBool(@"DYYYHideQuqishuiting"); + if (DYYYHideQuqishuiting) { + return nil; + } + return %orig; +} + +- (void)setCommentTopBarInfo:(id)info { + BOOL DYYYHideQuqishuiting = DYYYGetBool(@"DYYYHideQuqishuiting"); + if (DYYYHideQuqishuiting) { + %orig(nil); + return; + } + %orig; +} + +%end + + +// 拦截开屏广告 - hook TTAdSplashModel,直接返回 nil +%hook TTAdSplashModel + ++ (id)alloc { + if (DYYYGetBool(@"DYYYNoAds")) { + return nil; // 直接返回 nil,阻止对象创建 + } + return %orig; +} + +%end + +%hook AWEOriginalAdModel +- (instancetype)init { + BOOL noAds = DYYYGetBool(@"DYYYNoAds"); + if (noAds) { + return nil; // 阻止创建,直接返回 nil + } + return %orig; +} + +- (instancetype)initWithDictionary:(id)dict error:(NSError **)error { + BOOL noAds = DYYYGetBool(@"DYYYNoAds"); + if (noAds) { + return nil; // 阻止创建,直接返回 nil + } + return %orig; +} +%end + +// 屏蔽 AWEGeneralSearchModel 中的广告卡(强判定) +%hook AWEGeneralSearchModel +- (instancetype)initWithDictionary:(id)dict error:(NSError **)error { + id orig = %orig; + + BOOL noAds = DYYYGetBool(@"DYYYNoAds"); + if (!noAds || !orig) { + return orig; + } + + // 强判定:检查是否为广告卡(检查 commonDynamicPatchModel.is_ad == 1) + if ([[orig valueForKeyPath:@"commonDynamicPatchModel.is_ad"] integerValue] == 1) { + return nil; + } + + return orig; +} +%end + +// 去除启动视频广告 +%hook AWEAwesomeSplashFeedCellOldAccessoryView + +// 在方法入口处添加控制逻辑 +- (id)ddExtraView { + if (DYYYGetBool(@"DYYYNoAds")) { + return NULL; // 返回空视图 + } + + // 正常模式调用原始方法 + return %orig; +} + +%end + +// 屏蔽青少年模式弹窗 +%hook AWETeenModeAlertView +- (BOOL)show { + if (DYYYGetBool(@"DYYYHideTeenMode")) { + return NO; + } + return %orig; +} +%end + +// 屏蔽青少年模式弹窗 +%hook AWETeenModeSimpleAlertView +- (BOOL)show { + if (DYYYGetBool(@"DYYYHideTeenMode")) { + return NO; + } + return %orig; +} +%end + + + + + + + + + + + + + %hook AWEFeedCommentConfigModel - (void)setCommentInputConfigText:(NSString *)text { NSString *customText = [[NSUserDefaults standardUserDefaults] objectForKey:@"DYYYCommentContent"]; @@ -4722,23 +5198,6 @@ static NSHashTable *processedParentViews = nil; %end -// 阻止开屏 AD -%hook BDASplashManager -- (void)showSplashControllerViewOnKeyWindow:(id)keyWindow model:(id)model { - if (DYYYGetBool(@"DYYYNoAds")) { - if (![NSThread isMainThread]) { - dispatch_async(dispatch_get_main_queue(), ^{ - [self splashViewShowFinished]; - }); - } else { - [self splashViewShowFinished]; - } - return; - } - %orig; -} -%end - %hook AWEPlayInteractionUserAvatarView - (void)layoutSubviews { %orig; @@ -7583,18 +8042,6 @@ static Class TagViewClass = nil; %end -// 隐藏章节进度条 -%hook AWEDemaciaChapterProgressSlider - -- (void)layoutSubviews { - %orig; - if (DYYYGetBool(@"DYYYHideChapterProgress")) { - [self removeFromSuperview]; - } -} - -%end - // 隐藏上次看到 %hook DUXPopover - (void)layoutSubviews { @@ -7734,35 +8181,35 @@ static NSString *const kHideRecentUsersKey = @"DYYYHideSidebarRecentUsers"; @end // 修复 ios26 模态透明效果 -%hook UIDropShadowView - -- (void)didMoveToSuperview { - %orig; - - if (@available(iOS 26.0, *)) { - self.backgroundColor = UIColor.clearColor; - self.opaque = NO; - } -} - -- (void)layoutSubviews { - %orig; - - if (@available(iOS 26.0, *)) { - self.backgroundColor = UIColor.clearColor; - self.opaque = NO; - } -} - -- (void)setBackgroundColor:(UIColor *)color { - if (@available(iOS 26.0, *)) { - %orig(UIColor.clearColor); - return; - } - %orig; -} - -%end +// %hook UIDropShadowView + +// - (void)didMoveToSuperview { +// %orig; + +// if (@available(iOS 26.0, *)) { +// self.backgroundColor = UIColor.clearColor; +// self.opaque = NO; +// } +// } + +// - (void)layoutSubviews { +// %orig; + +// if (@available(iOS 26.0, *)) { +// self.backgroundColor = UIColor.clearColor; +// self.opaque = NO; +// } +// } + +// - (void)setBackgroundColor:(UIColor *)color { +// if (@available(iOS 26.0, *)) { +// %orig(UIColor.clearColor); +// return; +// } +// %orig; +// } + +// %end %group CommentLongPressPanelReportElementGroup diff --git a/DYYYLongPressPanel.xm b/DYYYLongPressPanel.xm index 2d795f474..fcbe4fedc 100644 --- a/DYYYLongPressPanel.xm +++ b/DYYYLongPressPanel.xm @@ -15,127 +15,112 @@ // Modern风格长按面板(新版UI) %hook AWEModernLongPressPanelTableViewController - (NSArray *)dataArray { + // 检查是否开启精简模式 + BOOL simplifyPanel = DYYYGetBool(@"DYYYSimplifyLongPressPanel"); + NSArray *originalArray = %orig; if (!originalArray) { originalArray = @[]; } - // 检查是否启用了任意长按功能 - BOOL hasAnyFeatureEnabled = NO; - // 检查各个单独的功能开关 - BOOL enableSaveVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressSaveVideo"]; - BOOL enableSaveCover = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressSaveCover"]; - BOOL enableSaveAudio = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressSaveAudio"]; - BOOL enableSaveCurrentImage = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressSaveCurrentImage"]; - BOOL enableSaveAllImages = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressSaveAllImages"]; - BOOL enableCopyText = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressCopyText"]; - BOOL enableCopyLink = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressCopyLink"]; - BOOL enableApiDownload = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressApiDownload"]; - BOOL enableFilterUser = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressFilterUser"]; - BOOL enableFilterKeyword = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressFilterTitle"]; - BOOL enableTimerClose = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressTimerClose"]; - BOOL enableCreateVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressCreateVideo"]; + // 如果开启精简模式,直接跳过原始面板处理,只返回自定义选项 + if (simplifyPanel) { + originalArray = @[]; // 清空原始数组 + } else { + // 获取需要隐藏的按钮设置(从文本输入框读取,逗号分隔) + NSString *hidePanelItems = DYYYGetString(@"DYYYHidePanelItems"); + NSMutableSet *hideItemsLowerSet = [NSMutableSet set]; + + if (hidePanelItems && hidePanelItems.length > 0) { + // 支持中英文逗号分隔 + NSString *normalizedItems = [hidePanelItems stringByReplacingOccurrencesOfString:@"," withString:@","]; + NSArray *items = [normalizedItems componentsSeparatedByString:@","]; + for (NSString *item in items) { + NSString *trimmedItem = [item stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if (trimmedItem.length > 0) { + [hideItemsLowerSet addObject:[trimmedItem lowercaseString]]; + } + } + } - // 检查是否有任何功能启用 - hasAnyFeatureEnabled = enableSaveVideo || enableSaveCover || enableSaveAudio || enableSaveCurrentImage || enableSaveAllImages || enableCopyText || enableCopyLink || enableApiDownload || - enableFilterUser || enableFilterKeyword || enableTimerClose || enableCreateVideo; + // 如果有需要隐藏的项目,才进行过滤 + if (hideItemsLowerSet.count > 0) { + NSMutableArray *modifiedOriginalGroups = [NSMutableArray array]; + + for (id group in originalArray) { + if ([group isKindOfClass:%c(AWELongPressPanelViewGroupModel)]) { + AWELongPressPanelViewGroupModel *groupModel = (AWELongPressPanelViewGroupModel *)group; + NSMutableArray *filteredGroupArr = [NSMutableArray array]; + + for (id item in groupModel.groupArr) { + if ([item isKindOfClass:%c(AWELongPressPanelBaseViewModel)]) { + AWELongPressPanelBaseViewModel *viewModel = (AWELongPressPanelBaseViewModel *)item; + NSString *descString = viewModel.describeString; + + BOOL shouldHide = NO; + if (descString && descString.length > 0) { + NSString *descLower = [descString lowercaseString]; + + // 精确匹配 + if ([hideItemsLowerSet containsObject:descLower]) { + shouldHide = YES; + } else { + // 部分匹配 + for (NSString *hideItemLower in hideItemsLowerSet) { + if ([descLower containsString:hideItemLower] || [hideItemLower containsString:descLower]) { + shouldHide = YES; + break; + } + } + } + } - // 获取需要隐藏的按钮设置 - BOOL hideDaily = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelDaily"]; - BOOL hideRecommend = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelRecommend"]; - BOOL hideNotInterested = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelNotInterested"]; - BOOL hideReport = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelReport"]; - BOOL hideSpeed = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelSpeed"]; - BOOL hideClearScreen = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelClearScreen"]; - BOOL hideFavorite = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelFavorite"]; - BOOL hideLater = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelLater"]; - BOOL hideCast = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelCast"]; - BOOL hideOpenInPC = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelOpenInPC"]; - BOOL hideSubtitle = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelSubtitle"]; - BOOL hideAutoPlay = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelAutoPlay"]; - BOOL hideSearchImage = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelSearchImage"]; - BOOL hideListenDouyin = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelListenDouyin"]; - BOOL hideBackgroundPlay = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelBackgroundPlay"]; - BOOL hideBiserial = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelBiserial"]; - BOOL hideTimerclose = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelTimerClose"]; - - // 存储处理后的原始组 - NSMutableArray *modifiedOriginalGroups = [NSMutableArray array]; - - // 处理原始面板,收集所有未被隐藏的官方按钮 - for (id group in originalArray) { - if ([group isKindOfClass:%c(AWELongPressPanelViewGroupModel)]) { - AWELongPressPanelViewGroupModel *groupModel = (AWELongPressPanelViewGroupModel *)group; - NSMutableArray *filteredGroupArr = [NSMutableArray array]; - - for (id item in groupModel.groupArr) { - if ([item isKindOfClass:%c(AWELongPressPanelBaseViewModel)]) { - AWELongPressPanelBaseViewModel *viewModel = (AWELongPressPanelBaseViewModel *)item; - NSString *descString = viewModel.describeString; - // 根据描述字符串判断按钮类型并决定是否保留 - BOOL shouldHide = NO; - if (([descString isEqualToString:@"转发到日常"] || [descString isEqualToString:@"分享到日常"]) && hideDaily) { - shouldHide = YES; - } else if (([descString isEqualToString:@"推荐"] || [descString isEqualToString:@"取消推荐"]) && hideRecommend) { - shouldHide = YES; - } else if ([descString isEqualToString:@"不感兴趣"] && hideNotInterested) { - shouldHide = YES; - } else if ([descString isEqualToString:@"举报"] && hideReport) { - shouldHide = YES; - } else if ([descString isEqualToString:@"倍速"] && hideSpeed) { - shouldHide = YES; - } else if ([descString isEqualToString:@"清屏播放"] && hideClearScreen) { - shouldHide = YES; - } else if ([descString isEqualToString:@"缓存视频"] && hideFavorite) { - shouldHide = YES; - } else if ([descString isEqualToString:@"添加至稍后再看"] && hideLater) { - shouldHide = YES; - } else if ([descString isEqualToString:@"投屏"] && hideCast) { - shouldHide = YES; - } else if ([descString isEqualToString:@"电脑/Pad打开"] && hideOpenInPC) { - shouldHide = YES; - } else if ([descString isEqualToString:@"弹幕"] && hideSubtitle) { - shouldHide = YES; - } else if ([descString isEqualToString:@"弹幕开关"] && hideSubtitle) { - shouldHide = YES; - } else if ([descString isEqualToString:@"弹幕设置"] && hideSubtitle) { - shouldHide = YES; - } else if ([descString isEqualToString:@"自动连播"] && hideAutoPlay) { - shouldHide = YES; - } else if ([descString isEqualToString:@"识别图片"] && hideSearchImage) { - shouldHide = YES; - } else if (([descString isEqualToString:@"听抖音"] || [descString isEqualToString:@"后台听"] || [descString isEqualToString:@"听视频"]) && hideListenDouyin) { - shouldHide = YES; - } else if ([descString isEqualToString:@"后台播放设置"] && hideBackgroundPlay) { - shouldHide = YES; - } else if ([descString isEqualToString:@"首页双列快捷入口"] && hideBiserial) { - shouldHide = YES; - } else if ([descString isEqualToString:@"定时关闭"] && hideTimerclose) { - shouldHide = YES; + if (!shouldHide) { + [filteredGroupArr addObject:item]; + } + } else { + [filteredGroupArr addObject:item]; + } } - if (!shouldHide) { - [filteredGroupArr addObject:viewModel]; + if (filteredGroupArr.count > 0) { + AWELongPressPanelViewGroupModel *filteredGroup = [[%c(AWELongPressPanelViewGroupModel) alloc] init]; + filteredGroup.groupType = groupModel.groupType; + filteredGroup.isModern = groupModel.isModern; + filteredGroup.groupArr = filteredGroupArr; + [modifiedOriginalGroups addObject:filteredGroup]; } + } else { + [modifiedOriginalGroups addObject:group]; } } - - // 如果过滤后的组不为空,则保存原始组结构 - if (filteredGroupArr.count > 0) { - AWELongPressPanelViewGroupModel *newGroup = [[%c(AWELongPressPanelViewGroupModel) alloc] init]; - newGroup.isDYYYCustomGroup = YES; - newGroup.groupType = groupModel.groupType; - newGroup.isModern = YES; - newGroup.groupArr = filteredGroupArr; - [modifiedOriginalGroups addObject:newGroup]; - } + originalArray = modifiedOriginalGroups; } } + // 检查是否启用了任意长按功能 + BOOL hasAnyFeatureEnabled = NO; + // 检查各个单独的功能开关 + BOOL enableSaveVideo = DYYYGetBool(@"DYYYLongPressSaveVideo"); + BOOL enableSaveCover = DYYYGetBool(@"DYYYLongPressSaveCover"); + BOOL enableSaveAudio = DYYYGetBool(@"DYYYLongPressSaveAudio"); + BOOL enableSaveCurrentImage = DYYYGetBool(@"DYYYLongPressSaveCurrentImage"); + BOOL enableSaveAllImages = DYYYGetBool(@"DYYYLongPressSaveAllImages"); + BOOL enableCopyText = DYYYGetBool(@"DYYYLongPressCopyText"); + BOOL enableCopyLink = DYYYGetBool(@"DYYYLongPressCopyLink"); + BOOL enableApiDownload = DYYYGetBool(@"DYYYLongPressApiDownload"); + BOOL enableFilterUser = DYYYGetBool(@"DYYYLongPressFilterUser"); + BOOL enableFilterKeyword = DYYYGetBool(@"DYYYLongPressFilterTitle"); + BOOL enableTimerClose = DYYYGetBool(@"DYYYLongPressTimerClose"); + BOOL enableCreateVideo = DYYYGetBool(@"DYYYLongPressCreateVideo"); + + // 检查是否有任何功能启用 + hasAnyFeatureEnabled = enableSaveVideo || enableSaveCover || enableSaveAudio || enableSaveCurrentImage || enableSaveAllImages || enableCopyText || enableCopyLink || enableApiDownload || + enableFilterUser || enableFilterKeyword || enableTimerClose || enableCreateVideo; + // 如果没有任何功能启用,仅使用官方按钮 if (!hasAnyFeatureEnabled) { - // 直接返回修改后的原始组 - return modifiedOriginalGroups; + return originalArray; } // 创建自定义功能按钮 @@ -755,13 +740,7 @@ [customGroups addObject:secondRowGroup]; } - // 准备最终结果数组 - NSMutableArray *resultArray = [NSMutableArray arrayWithArray:customGroups]; - - // 添加修改后的原始组 - [resultArray addObjectsFromArray:modifiedOriginalGroups]; - - return resultArray; + return [customGroups arrayByAddingObjectsFromArray:originalArray]; } %end @@ -808,125 +787,106 @@ return originalArray; } - // 检查是否启用了任意长按功能 - BOOL hasAnyFeatureEnabled = NO; + // 检查是否开启精简模式 + BOOL simplifyPanel = DYYYGetBool(@"DYYYSimplifyLongPressPanel"); - // 检查各个单独的功能开关 - BOOL enableSaveVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressSaveVideo"]; - BOOL enableSaveCover = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressSaveCover"]; - BOOL enableSaveAudio = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressSaveAudio"]; - BOOL enableSaveCurrentImage = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressSaveCurrentImage"]; - BOOL enableSaveAllImages = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressSaveAllImages"]; - BOOL enableCopyText = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressCopyText"]; - BOOL enableCopyLink = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressCopyLink"]; - BOOL enableApiDownload = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressApiDownload"]; - BOOL enableFilterUser = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressFilterUser"]; - BOOL enableFilterKeyword = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressFilterTitle"]; - BOOL enableTimerClose = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressTimerClose"]; - BOOL enableCreateVideo = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYLongPressCreateVideo"]; + // 如果开启精简模式,直接跳过原始面板处理,只返回自定义选项 + if (simplifyPanel) { + originalArray = @[]; // 清空原始数组 + } else { + // 获取需要隐藏的按钮设置(从文本输入框读取,逗号分隔) + NSString *hidePanelItems = DYYYGetString(@"DYYYHidePanelItems"); + NSMutableSet *hideItemsLowerSet = [NSMutableSet set]; + + if (hidePanelItems && hidePanelItems.length > 0) { + // 支持中英文逗号分隔 + NSString *normalizedItems = [hidePanelItems stringByReplacingOccurrencesOfString:@"," withString:@","]; + NSArray *items = [normalizedItems componentsSeparatedByString:@","]; + for (NSString *item in items) { + NSString *trimmedItem = [item stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + if (trimmedItem.length > 0) { + [hideItemsLowerSet addObject:[trimmedItem lowercaseString]]; + } + } + } - // 检查是否有任何功能启用 - hasAnyFeatureEnabled = enableSaveVideo || enableSaveCover || enableSaveAudio || enableSaveCurrentImage || enableSaveAllImages || enableCopyText || enableCopyLink || enableApiDownload || - enableFilterUser || enableFilterKeyword || enableTimerClose || enableCreateVideo; + // 如果有需要隐藏的项目,才进行过滤 + if (hideItemsLowerSet.count > 0) { + NSMutableArray *modifiedOriginalGroups = [NSMutableArray array]; + + for (id group in originalArray) { + if ([group isKindOfClass:%c(AWELongPressPanelViewGroupModel)]) { + AWELongPressPanelViewGroupModel *groupModel = (AWELongPressPanelViewGroupModel *)group; + NSMutableArray *filteredGroupArr = [NSMutableArray array]; + + for (id item in groupModel.groupArr) { + if ([item isKindOfClass:%c(AWELongPressPanelBaseViewModel)]) { + AWELongPressPanelBaseViewModel *viewModel = (AWELongPressPanelBaseViewModel *)item; + NSString *descString = viewModel.describeString; - // 处理原始面板按钮的显示/隐藏 - NSMutableArray *modifiedArray = [NSMutableArray array]; - - // 获取需要隐藏的按钮设置 - BOOL hideDaily = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelDaily"]; - BOOL hideRecommend = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelRecommend"]; - BOOL hideNotInterested = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelNotInterested"]; - BOOL hideReport = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelReport"]; - BOOL hideSpeed = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelSpeed"]; - BOOL hideClearScreen = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelClearScreen"]; - BOOL hideFavorite = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelFavorite"]; - BOOL hideLater = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelLater"]; - BOOL hideCast = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelCast"]; - BOOL hideOpenInPC = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelOpenInPC"]; - BOOL hideSubtitle = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelSubtitle"]; - BOOL hideAutoPlay = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelAutoPlay"]; - BOOL hideSearchImage = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelSearchImage"]; - BOOL hideListenDouyin = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelListenDouyin"]; - BOOL hideBackgroundPlay = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelBackgroundPlay"]; - BOOL hideBiserial = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelBiserial"]; - BOOL hideTimerclose = [[NSUserDefaults standardUserDefaults] boolForKey:@"DYYYHidePanelTimerClose"]; - - // 处理原始面板 - for (id group in originalArray) { - // 检查是否为视图组模型 - if ([group isKindOfClass:%c(AWELongPressPanelViewGroupModel)]) { - AWELongPressPanelViewGroupModel *groupModel = (AWELongPressPanelViewGroupModel *)group; - NSMutableArray *filteredGroupArr = [NSMutableArray array]; - for (id item in groupModel.groupArr) { - // 检查是否为基础视图模型 - if ([item isKindOfClass:%c(AWELongPressPanelBaseViewModel)]) { - AWELongPressPanelBaseViewModel *viewModel = (AWELongPressPanelBaseViewModel *)item; - NSString *descString = viewModel.describeString; - // 根据描述字符串判断按钮类型并决定是否隐藏 - BOOL shouldHide = NO; - if ([descString isEqualToString:@"转发到日常"] && hideDaily) { - shouldHide = YES; - } else if (([descString isEqualToString:@"推荐"] || [descString isEqualToString:@"取消推荐"]) && hideRecommend) { - shouldHide = YES; - } else if ([descString isEqualToString:@"不感兴趣"] && hideNotInterested) { - shouldHide = YES; - } else if ([descString isEqualToString:@"举报"] && hideReport) { - shouldHide = YES; - } else if ([descString isEqualToString:@"倍速"] && hideSpeed) { - shouldHide = YES; - } else if ([descString isEqualToString:@"清屏播放"] && hideClearScreen) { - shouldHide = YES; - } else if ([descString isEqualToString:@"缓存视频"] && hideFavorite) { - shouldHide = YES; - } else if ([descString isEqualToString:@"添加至稍后再看"] && hideLater) { - shouldHide = YES; - } else if ([descString isEqualToString:@"投屏"] && hideCast) { - shouldHide = YES; - } else if ([descString isEqualToString:@"电脑/Pad打开"] && hideOpenInPC) { - shouldHide = YES; - } else if ([descString isEqualToString:@"弹幕"] && hideSubtitle) { - shouldHide = YES; - } else if ([descString isEqualToString:@"弹幕开关"] && hideSubtitle) { - shouldHide = YES; - } else if ([descString isEqualToString:@"弹幕设置"] && hideSubtitle) { - shouldHide = YES; - } else if ([descString isEqualToString:@"自动连播"] && hideAutoPlay) { - shouldHide = YES; - } else if ([descString isEqualToString:@"识别图片"] && hideSearchImage) { - shouldHide = YES; - } else if (([descString isEqualToString:@"听抖音"] || [descString isEqualToString:@"后台听"] || [descString isEqualToString:@"听视频"]) && hideListenDouyin) { - shouldHide = YES; - } else if ([descString isEqualToString:@"后台播放设置"] && hideBackgroundPlay) { - shouldHide = YES; - } else if ([descString isEqualToString:@"首页双列快捷入口"] && hideBiserial) { - shouldHide = YES; - } else if ([descString isEqualToString:@"定时关闭"] && hideTimerclose) { - shouldHide = YES; + BOOL shouldHide = NO; + if (descString && descString.length > 0) { + NSString *descLower = [descString lowercaseString]; + + // 精确匹配 + if ([hideItemsLowerSet containsObject:descLower]) { + shouldHide = YES; + } else { + // 部分匹配 + for (NSString *hideItemLower in hideItemsLowerSet) { + if ([descLower containsString:hideItemLower] || [hideItemLower containsString:descLower]) { + shouldHide = YES; + break; + } + } + } + } + + if (!shouldHide) { + [filteredGroupArr addObject:item]; + } + } else { + [filteredGroupArr addObject:item]; + } } - if (!shouldHide) { - [filteredGroupArr addObject:viewModel]; + if (filteredGroupArr.count > 0) { + AWELongPressPanelViewGroupModel *filteredGroup = [[%c(AWELongPressPanelViewGroupModel) alloc] init]; + filteredGroup.groupType = groupModel.groupType; + filteredGroup.groupArr = filteredGroupArr; + [modifiedOriginalGroups addObject:filteredGroup]; } } else { - // 不是视图模型的,直接添加 - [filteredGroupArr addObject:item]; + [modifiedOriginalGroups addObject:group]; } } - // 如果过滤后的数组不为空,则保留原始结构 - if (filteredGroupArr.count > 0) { - AWELongPressPanelViewGroupModel *newGroup = [[%c(AWELongPressPanelViewGroupModel) alloc] init]; - newGroup.groupType = groupModel.groupType; - newGroup.groupArr = filteredGroupArr; - [modifiedArray addObject:newGroup]; - } - } else { - // 不是组模型的,直接添加 - [modifiedArray addObject:group]; + originalArray = modifiedOriginalGroups; } } + // 检查是否启用了任意长按功能 + BOOL hasAnyFeatureEnabled = NO; + + // 检查各个单独的功能开关 + BOOL enableSaveVideo = DYYYGetBool(@"DYYYLongPressSaveVideo"); + BOOL enableSaveCover = DYYYGetBool(@"DYYYLongPressSaveCover"); + BOOL enableSaveAudio = DYYYGetBool(@"DYYYLongPressSaveAudio"); + BOOL enableSaveCurrentImage = DYYYGetBool(@"DYYYLongPressSaveCurrentImage"); + BOOL enableSaveAllImages = DYYYGetBool(@"DYYYLongPressSaveAllImages"); + BOOL enableCopyText = DYYYGetBool(@"DYYYLongPressCopyText"); + BOOL enableCopyLink = DYYYGetBool(@"DYYYLongPressCopyLink"); + BOOL enableApiDownload = DYYYGetBool(@"DYYYLongPressApiDownload"); + BOOL enableFilterUser = DYYYGetBool(@"DYYYLongPressFilterUser"); + BOOL enableFilterKeyword = DYYYGetBool(@"DYYYLongPressFilterTitle"); + BOOL enableTimerClose = DYYYGetBool(@"DYYYLongPressTimerClose"); + BOOL enableCreateVideo = DYYYGetBool(@"DYYYLongPressCreateVideo"); + + // 检查是否有任何功能启用 + hasAnyFeatureEnabled = enableSaveVideo || enableSaveCover || enableSaveAudio || enableSaveCurrentImage || enableSaveAllImages || enableCopyText || enableCopyLink || enableApiDownload || + enableFilterUser || enableFilterKeyword || enableTimerClose || enableCreateVideo; + if (!hasAnyFeatureEnabled) { - return modifiedArray; + return originalArray; } // 创建自定义功能组 @@ -1503,8 +1463,8 @@ newGroupModel.groupArr = viewModels; // 返回自定义组+原始组的结果 - if (modifiedArray.count > 0) { - NSMutableArray *resultArray = [modifiedArray mutableCopy]; + if (originalArray.count > 0) { + NSMutableArray *resultArray = [originalArray mutableCopy]; [resultArray insertObject:newGroupModel atIndex:0]; return [resultArray copy]; } else { diff --git a/DYYYSettingViewController.m b/DYYYSettingViewController.m index cec1b4be9..ebf28b49f 100644 --- a/DYYYSettingViewController.m +++ b/DYYYSettingViewController.m @@ -159,7 +159,7 @@ - (void)setupSettingItems { [DYYYSettingItem itemWithTitle:@"毛玻璃透明度" key:@"DYYYCommentBlurTransparent" type:DYYYSettingItemTypeTextField placeholder:@"0-1小数"], [DYYYSettingItem itemWithTitle:@"通知圆角半径" key:@"DYYYNotificationCornerRadius" type:DYYYSettingItemTypeTextField placeholder:@"默认12"], [DYYYSettingItem itemWithTitle:@"时间属地显示" key:@"DYYYEnableArea" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"国外解析账号" key:@"DYYYGeonamesUsername" type:DYYYSettingItemTypeTextField placeholder:@"不填默认"], + [DYYYSettingItem itemWithTitle:@"国外解析账号" key:@"DYYYGeonamesUsername" type:DYYYSettingItemTypeTextField placeholder:@"需填写才能解析国外"], [DYYYSettingItem itemWithTitle:@"时间标签颜色" key:@"DYYYLabelColor" type:DYYYSettingItemTypeTextField placeholder:@"十六进制"], [DYYYSettingItem itemWithTitle:@"属地随机渐变" key:@"DYYYEnableRandomGradient" type:DYYYSettingItemTypeSwitch], [DYYYSettingItem itemWithTitle:@"隐藏系统顶栏" key:@"DYYYHideStatusbar" type:DYYYSettingItemTypeSwitch], @@ -301,23 +301,8 @@ - (void)setupSettingItems { [DYYYSettingItem itemWithTitle:@"移除长视频" key:@"DYYYHideMediumVideo" type:DYYYSettingItemTypeSwitch] ], @[ - [DYYYSettingItem itemWithTitle:@"隐藏面板日常" key:@"DYYYHidePanelDaily" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板推荐" key:@"DYYYHidePanelRecommend" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板举报" key:@"DYYYHidePanelReport" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板倍速" key:@"DYYYHidePanelSpeed" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板清屏" key:@"DYYYHidePanelClearScreen" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板缓存" key:@"DYYYHidePanelFavorite" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板投屏" key:@"DYYYHidePanelCast" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板弹幕" key:@"DYYYHidePanelSubtitle" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板识图" key:@"DYYYHidePanelSearchImage" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板听抖音" key:@"DYYYHidePanelListenDouyin" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏电脑Pad打开" key:@"DYYYHidePanelOpenInPC" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板稍后再看" key:@"DYYYHidePanelLater" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板自动连播" key:@"DYYYHidePanelAutoPlay" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板不感兴趣" key:@"DYYYHidePanelNotInterested" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板后台播放" key:@"DYYYHidePanelBackgroundPlay" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏面板定时关闭" key:@"DYYYHidePanelTimerClose" type:DYYYSettingItemTypeSwitch], - [DYYYSettingItem itemWithTitle:@"隐藏双列快捷入口" key:@"DYYYHidePanelBiserial" type:DYYYSettingItemTypeSwitch], + [DYYYSettingItem itemWithTitle:@"精简长按面板" key:@"DYYYSimplifyLongPressPanel" type:DYYYSettingItemTypeSwitch], + [DYYYSettingItem itemWithTitle:@"隐藏面板项目" key:@"DYYYHidePanelItems" type:DYYYSettingItemTypeTextField placeholder:@"逗号分隔按钮名"], [DYYYSettingItem itemWithTitle:@"隐藏评论分享" key:@"DYYYHideCommentShareToFriends" type:DYYYSettingItemTypeSwitch], [DYYYSettingItem itemWithTitle:@"隐藏评论复制" key:@"DYYYHideCommentLongPressCopy" type:DYYYSettingItemTypeSwitch], [DYYYSettingItem itemWithTitle:@"隐藏评论保存" key:@"DYYYHideCommentLongPressSaveImage" type:DYYYSettingItemTypeSwitch], diff --git a/DYYYSettings.xm b/DYYYSettings.xm index f68cc2d8a..facbec3e4 100644 --- a/DYYYSettings.xm +++ b/DYYYSettings.xm @@ -1107,6 +1107,11 @@ void showDYYYSettingsVC(UIViewController *rootVC, BOOL hasAgreed) { @"detail" : @"", @"cellType" : @6, @"imageName" : @"ic_eyeslash_outlined_16"}, + @{@"identifier" : @"DYYYHideAvatarRing", + @"title" : @"隐藏头像光圈", + @"detail" : @"", + @"cellType" : @6, + @"imageName" : @"ic_eyeslash_outlined_16"}, @{@"identifier" : @"DYYYHideMusicButton", @"title" : @"隐藏音乐按钮", @"detail" : @"", @@ -1311,7 +1316,7 @@ void showDYYYSettingsVC(UIViewController *rootVC, BOOL hasAgreed) { @"cellType" : @6, @"imageName" : @"ic_eyeslash_outlined_16"}, @{@"identifier" : @"DYYYHideGongChuang", - @"title" : @"隐藏共创头像", + @"title" : @"屏蔽共创信息", @"detail" : @"", @"cellType" : @6, @"imageName" : @"ic_eyeslash_outlined_16"}, @@ -1336,14 +1341,13 @@ void showDYYYSettingsVC(UIViewController *rootVC, BOOL hasAgreed) { @"cellType" : @6, @"imageName" : @"ic_eyeslash_outlined_16"}, @{@"identifier" : @"DYYYHideAntiAddictedNotice", - @"title" : @"隐藏作者声明", + @"title" : @"隐藏作者声明及风险提示", @"detail" : @"", @"cellType" : @6, @"imageName" : @"ic_eyeslash_outlined_16"}, @{ @"identifier" : @"DYYYHideFeedAnchorContainer", @"title" : @"隐藏视频锚点", - @"subTitle" : @"包括昵称上方的拍摄同款、抖音精选、游戏、轻颜等供稿链接,不包括视频定位", @"detail" : @"", @"cellType" : @37, @"imageName" : @"ic_eyeslash_outlined_16" @@ -1635,95 +1639,48 @@ void showDYYYSettingsVC(UIViewController *rootVC, BOOL hasAgreed) { // 【长按面板】分类 NSMutableArray *modernpanels = [NSMutableArray array]; NSArray *modernpanelSettings = @[ - @{@"identifier" : @"DYYYHidePanelDaily", - @"title" : @"隐藏面板日常", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelRecommend", - @"title" : @"隐藏面板推荐", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelReport", - @"title" : @"隐藏面板举报", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelSpeed", - @"title" : @"隐藏面板倍速", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelClearScreen", - @"title" : @"隐藏面板清屏", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelFavorite", - @"title" : @"隐藏面板缓存", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelCast", - @"title" : @"隐藏面板投屏", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelSubtitle", - @"title" : @"隐藏面板弹幕", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelSearchImage", - @"title" : @"隐藏面板识图", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelListenDouyin", - @"title" : @"隐藏面板听抖音", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelOpenInPC", - @"title" : @"隐藏电脑Pad打开", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelLater", - @"title" : @"隐藏面板稍后再看", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelAutoPlay", - @"title" : @"隐藏面板自动连播", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelNotInterested", - @"title" : @"隐藏面板不感兴趣", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelBackgroundPlay", - @"title" : @"隐藏面板后台播放", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelTimerClose", - @"title" : @"隐藏面板定时关闭", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"}, - @{@"identifier" : @"DYYYHidePanelBiserial", - @"title" : @"隐藏双列快捷入口", - @"detail" : @"", - @"cellType" : @6, - @"imageName" : @"ic_eyeslash_outlined_16"} + @{ + @"identifier" : @"DYYYSimplifyLongPressPanel", + @"title" : @"精简长按面板", + @"subTitle" : @"开启后将隐藏所有原始面板选项,只保留 DYYY 自定义功能", + @"detail" : @"", + @"cellType" : @37, + @"imageName" : @"ic_eyeslash_outlined_16" + }, + @{ + @"identifier" : @"DYYYHidePanelItems", + @"title" : @"隐藏面板项目", + @"subTitle" : @"输入要隐藏的按钮名称,多个用逗号分隔\n支持精确匹配和部分匹配,不区分大小写\n例如:举报,倍速,投屏,弹幕", + @"detail" : @"逗号分隔按钮名", + @"cellType" : @20, + @"imageName" : @"ic_eyeslash_outlined_16" + } ]; for (NSDictionary *dict in modernpanelSettings) { AWESettingItemModel *item = [DYYYSettingsHelper createSettingItem:dict]; + + // 特殊处理隐藏面板项目选项(文本输入) + if ([item.identifier isEqualToString:@"DYYYHidePanelItems"]) { + NSString *savedItems = [[NSUserDefaults standardUserDefaults] objectForKey:@"DYYYHidePanelItems"]; + item.detail = savedItems.length > 0 ? savedItems : @"逗号分隔按钮名"; + + item.cellTappedBlock = ^{ + if (!item.isEnable) return; + NSString *defaultText = [item.detail isEqualToString:@"逗号分隔按钮名"] ? @"" : item.detail; + [DYYYSettingsHelper showTextInputAlert:@"隐藏面板项目" + defaultText:defaultText + placeholder:@"例如:举报,倍速,投屏,弹幕" + onConfirm:^(NSString *text) { + NSString *trimmedText = [text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; + [DYYYSettingsHelper setUserDefaults:trimmedText forKey:@"DYYYHidePanelItems"]; + item.detail = trimmedText.length > 0 ? trimmedText : @"逗号分隔按钮名"; + [item refreshCell]; + } + onCancel:nil]; + }; + } + [modernpanels addObject:item]; }