精华内容
下载资源
问答
  • 2021-06-04 12:13:23

    自动亮屏app是一款实用系统软件,是个用于管理亮屏超时的手机工具。通过KinScreen自动亮屏软件你可体验自动常亮、自动关屏服务,通过动作感应来保持常亮等。

    基本简介

    KinScreen自动亮屏app是个精简的用于管理亮屏超时的工具。KinScreen自动亮屏app将在你需要的时候保持屏幕常亮,以及在不需要的时候灭屏幕。以后不再于阅读或思考时受到常亮超时的干扰!

    0fa1fd73634224e702776043fce2ff20.jpg

    功能介绍

    KinScreen

    通过手机的陀螺仪和光线传感器控制屏幕的开关,可以方便实现按需打开、自动常亮、自动关屏等功能。虽然不少手机已经内置了其中一些设计,但是 KinScreen

    更全面也更有效,而且耗电量基本可以忽略(实测)。

    动作 - 屏幕将会通过动作感应来保持常亮。即使握住手机的话也是会有小动作的。屏幕将会在捕捉不到移动的时候关闭屏幕并节省电池。

    距离-

    屏幕将会在距离传感器被遮盖的时候快速关闭,无论是否获取得到动作。注意在横向握住手机的时候不要遮盖距离传感器!屏幕也可以通过在距离传感器上挥动打开。

    79d49794c9306bab6e1b26ff70dcc6b4.jpg

    注意事项

    注意,要使其生效,必须允许将其加入可自启动程序列表以免被后台杀掉(安卓6.0以上)。如果希望在免打扰期间也起作用,请在通知设置中进行设定。

    更多相关内容
  • 高仿天猫App商品列表布局切换效果,切换顺畅,采用多布局完美实现,并添加了切换的动画效果!
  • 这次的分享是关于如何在 AppStore 实现 App 的自动下载,理想中的目标是只需要一部手机,不需要人来干预,就可以模拟用户的真实下载,并在下载完成以后,可以自动更改手机参数,使之变为另外一部苹果手机,进行...

    这次的分享是关于如何在 AppStore 实现 App 的自动下载,理想中的目标是只需要一部手机,不需要人来干预,就可以模拟用户的真实下载,并在下载完成以后,可以自动更改手机参数,使之变为另外一部苹果手机,进行周而复始的下载工作。但是呢,本文的内容只包含如何去模拟用户的操作来完成下载,并不涉及抹机、IP 更换等内容。

    为什么做这个呢?

    可能会有人问,为什么要做这么一个项目。主要是两点原因吧,第一点呢,是出于个人兴趣,逆向其实在开发中的用处还是蛮大的,比如帮助我们分析 Apple 操作系统,帮我们做好安全防御。通过这么一个项目的实践,可以加深自己对逆向开发的理解,第二点呢,就是 App Search Optimization 是一个一直比较热门的话题,有白帽子和黑帽子 ASO 之分,通过关键字和标题优化等手段来进行 ASO 的属于白帽子 ASO,而通过刷榜程序来进行 ASO 的属于黑帽子 ASO,ASO 的刷榜脚本是价值不菲的,可能价值几十万甚至几百万。通过这个项目也是小试牛刀,了解下灰产的一些技术手段。

    什么是 ASO

    ASO 的全称是 App Search Optimization,就是提升你 APP 在 AppStore 排行榜和搜索结果排名的过程。我们经常可以看到 AppStore 有一些奇怪的五星好评,也会遇到搜索关键字,排名第一的是一个看上去完全不相关的 App。这些都是 ASO 优化的手段,帮助提升产品的曝光量。
    这里写图片描述
    白帽子 ASO 常用的手段就是通过数据分析,来优化关键词、标题等,进而提高 App 的排名和曝光率。而黑帽子的手段则是,通过刷榜程序来实现 App 的大量搜索、下载、好评这一系列的过程来提升 App 的排名。

    常见的刷榜手段主要有两种,一种是机刷,就是通过触动精灵或者代码注入的方式来实现模拟用户的真实操作,进而完成搜索、下载、评论等操作。再一种协议刷,就是破解 AppStore 的登陆、下载相关的网络协议,通过模拟真实的网络请求来实现登陆、下载等行为。据说在刷榜过程中,苹果会校验你的 Apple ID、IP 等信息,所以需要购买大量的 Apple ID 和不断更换 IP 地址。

    如何实现 App 的自动下载

    想要的效果:

    进入 AppStore,切换 tab 到搜索界面
    设置搜索关键字、搜索
    进入列表页后,点击 App 进入详情页点击下载
    根据提示完成登陆、下载,并在下载完成以后跳转到推荐 Tab
    进入推荐 Tab 后,退出登陆

    大概实现步骤:

    准备越狱手机和 Mac 电脑
    砸壳 dumpdecrypted,通常 PP助手、iTools 下载的 App 是经过砸壳的,同时 AppStore App 不需要砸壳
    头文件获取:AppStore class-dump,系统库的头文件的获取:dyld_cache class-dump
    定位关键函数:Reveal、Cycript、lldb
    tweak 的注入

    砸壳

    我们的 App 上传到 AppStore 后,苹果会对 App 进行加密,要想去分析可执行文件,就必须要进行脱壳解密的操作,dumpdecrypted 是一款出色的脱壳工具,它的原理是将 App 运行起来,App 启动时,系统会对 Mach-O 文件进行加载,并完成对应的解密操作,dumpdecrypted 就可以在此时将解密后的 Mach-O dump 出来,从而达到解密的效果。

    如果为了省事可以直接从 PP 助手、iTools 上下载对应的 App,一般情况下是已经经过砸壳的。同时,对于 AppStore 这样的系统程序有些特殊,他们 并不需要进行砸壳,可以直接拿来进行分析。

    获取头文件

    拿到一个砸壳后的可执行文件后,就可以使用 class-dump 来获取可执行文件的所有头文件,class-dump 会对 Mach-O 的格式进行分析,并将信息提取出来形成我们想要的头文件。

    AppStore 的可执行文件也略有特殊,class dump之后会发现 AppStore 中包含的代码极少。App Store 的很多关键代码逻辑都不在 AppStore 这个可执行文件当中,而是在系统的动态库中,我们需要分析动态库的头文件信息进而定位到关键函数。可以获取对应系统dyld_cache 中的动态库,然后 dump 出头文件。AppStore UI 有关的逻辑都在 StoreKitUI 动态库中,这个动态库是分析的重点。

    Reveal

    Reveal 是一款 UI 调试工具,官方的定义是:See your iOS application’s view hierarchy at runtime with advanced 2D and 3D visualisations,当然对于逆向安全人员,查看自己 App 的布局是完全不够的,我们可以在 Cydia 中下载 Reveal Loader,在同一网段下,通过 Mac 的 Reveal 和 iOS 上的 Reveal Loader 就可以查看任意 App 的 UI 布局。
    这里写图片描述
    但是,有时候我们不仅想要去看这个 UI 布局,还想要去动态调试这个布局,去看它的 Controller 是谁,去挖掘界面下的真正的代码逻辑。这个就涉及到 Cycript 这个工具。

    Cycript

    Cycript 是由 Cydia 创始人 Saurik 推出的一款脚本语言,它混合了Objective-C 与 JavaScript 两种语法,很容易上手,我们可以通过 Cycript 来进行动态调试,比如查看函数运行的效果,寻找 View 的 Controller 等。
    这里写图片描述

    就拿上面 Reveal 详情页为例, Reveal 可以看到获取按钮是 SKUIOfferView,列表页是一个 SKUICollectionView ,那么就通过 Cycript 来看看控制这个 SKUICollectionView 的 Controller 是谁。首先通过 OpenSSH 来连接 iPhone,通过 cycript -p AppStore 来对 AppStore 进行注入调试,UIApp.keyWindow.recursiveDescription().toString() 来打印视图层级。(注:此截图和后面的地址对不上,因为不是同一次打印,大家了解下大概意思就成)
    这里写图片描述
    可以发现 SKUICollectionView,并且它的内存地址是 0x13fa00e00,可以通过 cycript 脚本来找到它的 Controller 是哪一个,有多种方案,比如通过它的 delegate 来找,或者通过 nextResponder 来找都可以。

    cy# [#0x13fa00e00 delegate]
    
    #"<SKUIStorePageSectionsViewController: 0x140167e00>"
    
    cy# [#0x13fa00e00 nextResponder]
    
    #"<UIView: 0x140f5f540; frame = (0 0; 320 568); autoresize = W+H; layer = <CALayer: 0x140f771c0>>"
    
    cy# [#0x140f5f540 nextResponder]
    
    #"<SKUIStorePageSectionsViewController: 0x140167e00>"

    同时也可以借助一些私有 API 来实现快速查找 ViewController,使用[[[UIWindow keyWindow] rootViewController] _printHierarchy].toString(),可以发现打印结果中同样可以找到 SKUIStorePageSectionsViewController

    cy# [[[UIWindow keyWindow] rootViewController] _printHierarchy].toString()
    `<SKUITabBarController 0x157815400>, state: appeared, view: <UILayoutContainerView 0x156db38e0>
       | <UINavigationController 0x15784d200>, state: disappeared, view: <UILayoutContainerView 0x156e6b240> not in the window
       |    | <SKUIDocumentContainerViewController 0x1578d3c00>, state: disappeared, view: <UIView 0x1580e1aa0> not in the window
       |    |    | <SKUIStackDocumentViewController 0x15812b740>, state: disappeared, view: <UIView 0x1580dc870> not in the window
       |    |    |    | <SKUIStorePageSectionsViewController 0x1578ec000>, state: disappeared, view: <UIView 0x1580f1a30> not in the window
       |    |    |    |    | <SKUIAccountButtonsViewController 0x158654180>, state: disappeared, view: <SKUIAccountButtonsView 0x158654f60> not in the window
       | <UINavigationController 0x157849c00>, state: disappeared, view: <UILayoutContainerView 0x156ec4df0> not in the window
       | <UINavigationController 0x157803600>, state: disappeared, view: <UILayoutContainerView 0x156e80de0> not in the window
       | <UINavigationController 0x15703ea00>, state: appeared, view: <UILayoutContainerView 0x156f114a0>
       |    | <SKUIDocumentContainerViewController 0x157ab2a00>, state: disappeared, view: <UIView 0x158a25930> not in the window
       |    |    | <SKUIStackDocumentViewController 0x158a50690>, state: disappeared, view: <UIView 0x158a2b360> not in the window
       |    |    |    | <SKUIStorePageSectionsViewController 0x1578e6000>, state: disappeared, view: <UIView 0x158a2d4b0> not in the window
       |    | <SKUIDocumentContainerViewController 0x157b5fa00>, state: appeared, view: <UIView 0x158cf70e0>
       |    |    | <SKUIStackDocumentViewController 0x158cf6690>, state: appeared, view: <UIView 0x158cf72b0>
       |    |    |    | <SKUIStorePageSectionsViewController 0x157b4ae00>, state: appeared, view: <UIView 0x158cfb1e0>
       | <UINavigationController 0x157028000>, state: disappeared, view: <UILayoutContainerView 0x156ef1300> not in the window
       |    | <ASUpdatesViewController 0x156f169e0>, state: disappeared, view: <UIView 0x156dbd590> not in the window`

    从上面的分析可以知道,SKUICollectionView 的控制器是 SKUIStorePageSectionsViewController,「获取」按钮的类是 SKUIOfferView,下一步是分析头文件,看看有没有可以比较明显的方法可以为我们所用。下载是最关键的一步,那么首先来看看 SKUIOfferView 类的情况,它的头文件大致如此。

    #import <StoreKitUI/SKUIItemOfferButtonDelegate-Protocol.h>
    #import <StoreKitUI/SKUIViewElementView-Protocol.h>
    @class NSMapTable, NSMutableArray, NSString;
    @protocol SKUIOfferViewDelegate;
    @interface SKUIOfferView : SKUIViewReuseView <SKUIItemOfferButtonDelegate, SKUIViewElementView> {
        unsigned long long _alignment;
        NSMapTable *_buttonElements;
        NSMapTable *_buyButtonDescriptorToButton;
        struct UIEdgeInsets _contentInset;
    }
    - (void)_buttonAction:(id)arg1;
    - (void)itemOfferButtonWillAnimateTransition:(id)arg1;
    - (void)itemOfferButtonDidAnimateTransition:(id)arg1;
    - (struct CGSize)sizeThatFits:(struct CGSize)arg1;

    可以从头文件中看到一个 _buttonAction 方法,感觉上是 「获取」按钮点击后的响应方法,对于这种猜测,可以使用 Cycript 来进行调试,测试一下这个函数执行的效果到底如何 在终端执行 [#0x156c69cc0 _buttonAction:#0x156cb4d20] 后查看效果如下,App 已经开始进行下载了,说明这个方法的效果我们猜对了,在调试过程中,可以多多使用 Cycript 提高效率。
    这里写图片描述

    lldb

    上面我们使用 Cycript 测试了 _buttonAction 的效果,但是这个方法有一个参数,我们要搞清楚它正确的参数类型,传入正确的值。这时候可以借助 LLDB ,来帮助我们找到这个参数的正确类型。 可以使用 b function 来针对 _buttonAction 方法打断点,然后打印它的参数。

    传统的做法是使用LLDB 和 IDA 等工具找到 ASLR 和 基地址等信息,然后计算出符号的地址,这样做起来比较繁琐,还是可以继续使用一些私有方法快速定位 _buttonAction 的符号地址来进行断点。

    我们想要断点的方法是 _buttonAction,它所在的类是 SKUIOfferView,那么可以使用 LLDB 输入 po [SKUIOfferView _shortMethodDescription] 来看下效果:(更多强大的黑科技私有函数可以参考这里:http://iosre.com/t/powerful-private-methods-for-debugging-in-cycript-lldb/3414

    (lldb) po [SKUIOfferView _shortMethodDescription]
    <SKUIOfferView: 0x1a096ddd8>:
    in SKUIOfferView:
        Class Methods:
            + (void) requestLayoutForViewElement:(id)arg1 width:(double)arg2 context:(id)arg3; (0x194719470)
            + (CGSize) sizeThatFitsWidth:(double)arg1 viewElement:(id)arg2 context:(id)arg3; (0x1947197a8)
        Properties:
            @property (weak, nonatomic) <SKUIOfferViewDelegate>* delegate;  (@synthesize delegate = _delegate;)
            @property (nonatomic) long metadataPosition;  (@synthesize metadataPosition = _metadataPosition;)
            @property (readonly, nonatomic, getter=isShowingConfirmation) BOOL showingConfirmation;  (@synthesize showingConfirmation = _isShowingConfirmation;)
        Instance Methods:
            - (BOOL) setImage:(id)arg1 forArtworkRequest:(id)arg2 context:(id)arg3; (0x19471a8c8)
            - (BOOL) updateWithItemState:(id)arg1 context:(id)arg2 animated:(BOOL)arg3; (0x19471a8d0)
            - (void) _buttonAction:(id)arg1; (0x19471bb5c)
            - (BOOL) _shouldHideNoticesWithBuyButtonDescriptor:(id)arg1 context:(id)arg2; (0x19471c368)
            - (void) _positionNoticeForItemOfferButton:(id)arg1; (0x19471c234)
    (SKUIViewReuseView ...)

    可以看到 - (void) _buttonAction:(id)arg1; (0x19471bb5c),那么直接使用 b 0x19471bb5c为 _buttonAction 加断点即可。断点到以后,再打印它的参数,对于 Objective-C 来说消息有两个隐含参数,也就是 self 和 _cmd,那么我们想要的参数就在第三个位置,可以通过 po $x2 来查看它的具体信息(ARM64 下函数的参数是存放在 X0 到 X7 这 8 个寄存器里面的,如果超过8个参数,就会入栈)。

    Process 7839 stopped
    * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1 2.1 3.1
        frame #0: 0x000000019471bb5c StoreKitUI`-[SKUIOfferView _buttonAction:]
    StoreKitUI`-[SKUIOfferView _buttonAction:]:
    ->  0x19471bb5c <+0>:  stp    x24, x23, [sp, #-0x40]!
        0x19471bb60 <+4>:  stp    x22, x21, [sp, #0x10]
        0x19471bb64 <+8>:  stp    x20, x19, [sp, #0x20]
        0x19471bb68 <+12>: stp    x29, x30, [sp, #0x30]
    Target 0: (AppStore) stopped.
    (lldb) po $x0
    <SKUIOfferView: 0x1596aae00; frame = (279 74; 26 26); layer = <CALayer: 0x1596676b0>>
    (lldb) po $x2
    <SKUIItemOfferButton: 0x1596ab260; baseClass = UIControl; frame = (0 0; 26 26); clipsToBounds = YES; alpha = 0.2; tintColor = UIDeviceRGBColorSpace 0.0862745 0.0156863 0.0156863 1; animations = { opacity=<CABasicAnimation: 0x1592e7b20>; }; layer = <CALayer: 0x15967d9c0>>

    由上可知,参数类型是 SKUIItemOfferButton,也就是 SKUIOfferView 的 subView,其实点击的是 SKUIItemOfferButton,只是 SKUIItemOfferButton 将处理往上抛而已。

    Tweak 注入

    Cydia 创始人 Saurik 同时为我们提供了一个 Cydia Substrate 这么一个工具,官方的定义是:The powerful code modification platform behind Cydia。我们可以基于 Cydia Substrate 来开发具有各种功能的代码注入程序。

    Cydia Substrate 由 MobileHooker、MobileLoader、Safe mode 三个模块组成。MobileHooker 主要用来替换函数的实现,可以想象成 Runtime 的 Method Swizzle。MobileLoader 是用来加载第三方 dylib 的,我们写的破解程序会在目标程序启动时注入到目标程序。Safe mode 就是安全模式,我们写 tweak 的时候可能会造成 Crash,比如万一造成 SpringBoard 无限 Crash 手机岂不是就没法用了,所以提供了这么一个安全模式。

    MobileHooker 提供了一些函数来让我们完成 Hook 的工作,但是我们不直接使用 它们,我们使用基于他们封装的 Logos 工具,Logos 的语法很简单直观,易于上手。比如 %hook 可以指定要 Hook 的类、%orig 可以执行被钩住的函数的原始实现、%new 给一个现成的 class 添加新函数(效果与 class_addMethod 类似)。

    Tweak AppStore

    那我们来使用 Logos 实现下载的功能,当进入 SKUIStorePageSectionsViewController 页面后,找到下载按钮,然后点击下载,当下载按钮的文字由「获取」变为「打开」,代表下载已完成,然后继续执行后续操作。

    %hook SKUIStorePageSectionsViewController
    - (void)viewDidAppear:(BOOL)animated {    
        %log;
        %orig;
        // 遍历所有子 View,找到 offerButton 、offerView
        [self findAllSubviews:self.view];
        if (offerButton && offerView) {
            // 执行下载操作
            [offerView _buttonAction:offerButton];
            // 每秒去 check 一下,是否下载完成
            downloadTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
        }       
    }
    %new
    -(void)timerAction {
        if ([offerButton.title isEqualToString:@"打开"]) {
            // 发送下载完成的通知
            [[NSNotificationCenter defaultCenter] postNotificationName:@"textChangedAction" object:nil];
            downloadTimer = nil;
        }
    }
    %new
    -(void)findAllSubviews:(UIView *)view
     {
        for (UIView *subView in view.subviews) {
            if (subView.subviews.count) {
                [self findAllSubviews:subView];
            }
            if ([subView isKindOfClass:NSClassFromString(@"SKUIOfferView")]) {
                offerView = (SKUIOfferView*)subView;
            }
            if ([subView isKindOfClass:NSClassFromString(@"SKUIItemOfferButton")]) {
                offerButton = (SKUIItemOfferButton*)subView;
            }
        }
    }
    %end

    其他的操作,与上述其实很类似,比如搜索、跳转都是利用静态或者动态分析找到关键函数,通过 tweak 来实现想要的效果即可。其中还有一个较难的点,就是弹窗提示我们登陆怎么办?如何实现自动登录功能?

    Tweak SpringBoard

    首先,想到的就是在 AppStore App 中注入代码,Hook UIAlertAction 和 UIAlertController 的代码,会发现并没有产生作用。AppStore 中的弹窗不是它来控制的,而是另外一个进程 SpringBoard,所以要想实现 Hook AppStore 的弹窗,必须对 SpringBoard 进行代码注入。
    这里写图片描述
    我们正常如果要实现一个这种弹窗,代码一般是这么写

    UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:@"标题" message:@"注释信息" preferredStyle:UIAlertControllerStyleActionSheet];  
    UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"标题1" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {  
        NSLog(@"点击了按钮 1");  
    }];  
    UIAlertAction *action2 = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {  
        NSLog(@"点击了按钮 2");  
    }];  
    [actionSheet addAction:action1];  
    [actionSheet addAction:action2];  
    [self presentViewController:actionSheet animated:YES completion:nil];  

    基于上面的代码分析可得,我们要想实现自动登录,就要实现自动点击「使用现有的 Apple ID」执行系统的原 action 操作,然后在账号和密码的 TextField 中填入账号密码,点击「好」执行系统的原始 action 操作。其实可以发现,要执行的 action 其实是在初始化 UIAlertAction 过程中,handler block 中加入的逻辑。那么我们就可以 Hook actionWithTitle:style:handler: 然后将 handler 保存下来,当填写好账号密码后,主动触发 handler 即可。

    上面那种方法也可以奏效,但是需要自己额外处理下 alertView 的出现和消失, 为了简单可以直接尝试第二种方法,在分析 UIKit 框架中 UIAlertController 类的头文件时发现 _dismissWithAction:这个方法,然后我就试了一下发现可以完成 dismiss 和 执行 handler 两项功能,所以我就直接使用了这个 API 来模拟点击。核心代码如下:

    typedef void(^CDUnknownBlockType)(UIAlertAction *action);
    CDUnknownBlockType testBlock;
    static UIAlertAction *keepAction;
    static int atimers;
    %hook UIAlertController
    - (void)viewDidAppear:(BOOL)animated {
        %log;
        %orig;
        if ([keepAction.title isEqualToString:@"使用现有的 Apple ID"]) {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                ((void ( *)(id, SEL, UIAlertAction*))objc_msgSend)(self, NSSelectorFromString(@"_dismissWithAction:"),keepAction);
            });
        } 
        if ([keepAction.title isEqualToString:@"好"]) {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                if (self.textFields.count > 1) {
                    self.textFields.firstObject.text = @"joyme0104@163.com";
                    self.textFields.lastObject.text = @"Joyme0304&&&";
                    ((void ( *)(id, SEL, UIAlertAction*))objc_msgSend)(self, NSSelectorFromString(@"_dismissWithAction:"),keepAction);
                }
            });
        }
    }
    %end
    %hook UIAlertAction
    + (id)_actionWithTitle:(id)arg1 descriptiveText:(id)arg2 image:(id)arg3 style:(long long)arg4 handler:(CDUnknownBlockType)arg5 shouldDismissHandler:(CDUnknownBlockType)arg6 {
        id obj = %orig;
        UIAlertAction *action = (UIAlertAction *)obj;
        if ([action.title isEqualToString:@"使用现有的 Apple ID"]) {
            testBlock = arg6;
            keepAction = obj;
        } 
        if ([action.title isEqualToString:@"好"]) {
            testBlock = arg6;
            keepAction = obj;
        }
        return obj;
    }
    %end

    从代码可以看出我们在 Hook UIAlertAction 的 _actionWithTitle 方法时,并没有 Hook actionWithTitle:style:handler: ,因为我测试的时候发现在我操作过程中并没有触发,怀疑是苹果没有使用这个 API,直接使用了下面这个方法。

    
    + (id)_actionWithTitle:(id)arg1 descriptiveText:(id)arg2 image:(id)arg3 style:(long long)arg4 handler:(CDUnknownBlockType)arg5 shouldDismissHandler:(CDUnknownBlockType)arg6 {
    }

    Thinking About The Future

    适当增加对 App 安全的精力的投入,像现在业界的很多 App 都处于被破解的状态,网上随处可见各种 App 的破解版,比如爱奇艺会员破解、钉钉远程打卡等。从客户端角度出发,需要增加代码混淆、反调试等手段保证运行环境的安全,同时与后端人员合作增加保证网络数据链路、反作弊的手段。

    Summary

    本文首先介绍了常见的攻击手段:

    通过静态分析和动态分析掌握 App 的内部逻辑,通过代码注入实现我们想要的功能,比如自动下载、自动跳转等功能
    通过分析 App 的网络请求,破解网络协议,模拟真实的网络请求来达到某种目的,比如批量下载,批量评论等功能。

    然后介绍了 ASO 的影响因素都有哪些,以及黑帽子和白帽子都是怎么进行 ASO 优化的。最后重点写了如何一步步通过代码注入,实现 AppStore App 的自动登录。

    君凯商联网-iOS-字唐名僧

    展开全文
  • APP-细说APP网络深度优化与网络安全

    千次阅读 2020-01-20 16:50:03
    数据下载 下载目前也是APP的大头了,一般APP都是请求下载的数据比较多;我们在加载资源的时候可以选择加载压缩资源,比如微信的朋友圈,小图的时候我们可以加载缩略图,要是点击查看大图的时候才考虑加载大图原图; ...

    前言

    说到APP优化,我们也可以从很多方面进行优化,从包大小、页面流畅度、内存占用、数据缓存、网络数据安全等等来优化加固我们的APP,每一个点展开又有很多需要将的,我以前也专门写了一篇关于APP性能优化的博文,如下:
    👉《iOS-性能优化的那些事》
    在移动端APP网络优化也是APP性能优化的一个非常重要的一个点,而且99.99%的APP都会伴随着网络交互;
    在此,我将对APP网络优化和网络安全做一个详细的总结,主要从流量、质量、安全方面去说,如要结构点如下:
    在这里插入图片描述

    流量消耗

    先说一个亲身经历过得事情,以前在一家公司开发了一款APP,有一点客服反馈有个上海老大爷打电话过来骂人,手机装了我们的APP,一个晚上用掉人家一两个G;后来公司也主动帮人家承担了这部分的流量资费,关键是15年流量资费还很高的,这个APP当然不是我写的,是安卓的小伙伴!

    即使流量现在价格不是很贵了,但是尽可能的帮用户节省流浪也是非常应该的!

    检测流量消耗

    相信大家在开发APP的时候肯定会做一些埋点和日志上报的功能,我们也可以把网络请求的监控也做进去,我们可以检测用户在一段时间内的流量消耗,计算流量的均值和峰值等等,并上报流量接口,这些我们在日志或者埋点系统里面都可以记录,然后上传给服务端,然后进行数据分析,找出流量消耗的不足之处。

    数据缓存

    说到缓存,这也是一个非常大的一个点,有时间也可以展开说,我平时的博客关于缓存也讲到很多,缓存的一个非常重要的好处就是提好了页面加载速度,提高用户的使用体验;但是缓存也可以替用户节省流量的消耗。
    APP数据的缓存无非是列表接口的缓存、WebView的缓存,关于WebView的缓存我也单独写过,如下:
    👉《iOS-WKWebView缓存并保证实时性》
    👉《iOS-UIWebView缓存并保证实时性》
    我们还可以做资源包下发预制加载等,这里也不展开了!
    在这里插入图片描述

    数据压缩

    关于数据压缩,这边主要想讲的就是资源文件的数据压缩了,主要在网络上传和网络下载方面;

    1.数据上传
    比如上传图片数据的时候是不是需要原图高清图,现在相机的像素都高,我们是不是可以搞了压缩一下图片或者视频再上传,就像微信发送图片的时候,用户可以选择压缩或者原图;

    2.数据下载
    下载目前也是APP的大头了,一般APP都是请求下载的数据比较多;我们在加载资源的时候可以选择加载压缩资源,比如微信的朋友圈,小图的时候我们可以加载缩略图,要是点击查看大图的时候才考虑加载大图原图;

    交互频率

    数据交互如果比较频繁会消耗用户的流量,而且用户体验不好,还有一个非常重要的原因就是频繁的网络请求也会比较损耗手机的电量;所以我们可以合并一些能合并的网络请求,比如日志上报的时候。

    请求释放

    在APP开发的过程中,一般就是一进入页面就进行网络请求,然后等待结束加载数据,但是比如网络请求比较缓慢(可能是数据量比较大,也有可能是网络状况不好),用户不想等了,直接返回页面销毁了,但是我们的大部分网络请求是单独封装的,但是网络请求还在继续请求中,这里数据、性能、内存、电量的问题就出来了,所以大家在封装网络请求的时候要把页面销毁就取消网络请求的场景考虑进去!

    网络质量

    请求速度

    网络请求的速度是影响用户体验的一个非常重要的原因,所以服务端也要想着来提高api的交互速度,为此我们可以通过下面的几个方案来优化交互速度,如下:
    a.域名合并,减少了DNS调用次数,降低了DNS劫持风险;
    b.ip直连,去除DNS的解析步骤;
    c.api缓存,比如redis缓存;
    d.数据资源压缩上传;

    请求质量

    监控网络请求质量和请求速度,然后记录日志进行上报,监控完整的网络请求链路;

    服务器压力

    api的设计也要考虑到api的压力以及服务器的压力,防止因为压力太大导致接口挂掉,从而影响用户的体验;

    数据处理

    服务端在给APP端提供数据的时候,避免让APP端进行数据处理或者运算,比较APP的内存资源和运算资源有限,不要过度消耗浪费APP资源;
    比如,我上家公司的用户信息里面有用户的年龄,但是服务端给的不是直接的年龄数据,而是给的生日时间戳,需要APP端自己去计算年龄,但是我们知道
    NSDateFormatter又是重大内存开销对象,在列表处理的时候又比较消耗内存,所以建议关于运算的一些东西最好在服务端计算好,这种不仅仅保证APP的性能问题,还是一种安全问题!

    网络安全

    我们在APP端的网络安全问题一般是APP抓包、DNS劫持、服务器安全,详细如下:

    在这里插入图片描述

    APP抓包

    说到抓包,侵入者可以选择抓取数据来窃密APP的关键数据,然后模拟请求,做一些APP不好控制的事情,在此我们可以使用Https进行网络请求,还可以禁止网络请求设置代码;
    还可以把请求头和请求体进行加密传输,多一次保证!
    但是需要说明一点的是,没用绝对的安全,只要是人设计的加密就有人设计解密,窥视心里在作怪!

    DNS劫持

    DNS劫持,由于域名解析为IP这个过程中,其解析是基于UDP 协议实现,所以报文是明文状态,可能会在请求过程中被监测,然后攻击者做一些自己的处理,比如返回假的IP地址或者什么都不做使请求失去响应,其效果就是对特定的网络不能反应或访问的是假网址。根本原因就是以下两点:
    a.恶意攻击,拦截运营商的解析过程,把自己的非法东西嵌入其中。
    b.运营商为了利益或者一些其他的因素,允许一些第三方在自己的链接里打打广告之类的。
    如何防止DNS劫持?
    可以通过上面我说的IP直连,自己在APP解析!
    推荐一篇写的比较详细的关于DNS的,如下:
    👉《APP网络优化之DNS优化实践》

    服务器安全

    服务器安全可以从物理安全和网络安全来说
    a.物理安全,服务器要考虑比如断电、断网等情况下导致的安全问题;
    b.网络安全,防止服务器被攻击、被爬虫等问题;
    所以,服务器的备份机制和数据备份机制和重要,还要限制同一IP的请求次数和间隔等;

    结束语

    如有不足之处还望各位大佬不吝赐教,也欢迎大家加群或者叫我QQ讨论交流学习!

    在这里插入图片描述

    展开全文
  • 首页、会员中心页面、列表页、内容页、活动页等等一应俱全。很方便前端二次修改,或者jsp、PHP,ASP等程序员的使用,页面风格通用性强,符合大众审美,本套页面,已经测试,可以正常使用!欢迎交流。
  • 很多东西也不是越新越好,比如APP——在 iPhone 上尤其如此 比如可以查看 iOS 每日限免应用的Price Tag在 2.3.1版时还完全没有内购,所有高级功能都能免费解锁! 这个APP阿虚原来有推荐过,不过现在很可惜已经下架...

    很多东西也不是越新越好,比如APP——在 iPhone 上尤其如此

    比如可以查看 iOS 每日限免应用的Price Tag在 2.3.1版时还完全没有内购,所有高级功能都能免费解锁!

    这个APP阿虚原来有推荐过,不过现在很可惜已经下架了

    优秀的图片标注软件Annotable,在1.11.2版本的时候,所有高级功能都还免费提供!

    要知道,这之后的版本换个颜色、放大镜、文字高亮等等功能都需要才能付费解锁

    又比如比较知名的OCR文字识别软件:白描在2.1.6版时,还没有OCR识别的每日5次的限制,那时还可以一直用

    除了可以通过换用旧版来白嫖一些APP

    更多时候还是为了追求无广告与功能更简洁

    像网易云 3.7.5 没有任何广告,注意是任何广告!

    也没有短视频等杂七杂八的社交功能

    这个版本的网易云,还是原来的味道🤪

    另外,旧版APP因为功能更简单,一般启动更快、更省电,这些也是换回旧版APP的原因之一

    说了那么多,iPhone 到底如何下载旧版APP呢?

    实际上这个问题阿虚在18年的时候就写过了:https://mp.weixin.qq.com/s/chCRHxVCBSDD0GCU-7Wu0Q

    不过上文中介绍的软件,作者没能坚持「不忘初心」,最终沦为了收费软件🤷🏻‍♂️

    而在2020年,我们有了更多的免费工具可供选择 (看来大佬都是怀旧的人呀) ,于是今天重新写一篇更新一下

    你可能会问为什么阿虚不直接分享这些旧版呢?

    因为 Android 和 iOS 的 APP 安装包是不一样的!

    iOS 的 ipa 文件内部是包含了账号信息的,安装时需要验证购买这个 APP 时所用 Apple 账号的密码🔑

    除非是你朋友发给你,再告诉你ta的 Apple 账号密码,否则你是无法进行安装的

    所以啊,只有自己掌握方法才是最实在的解决方法

    况且现在下面要介绍的工具都是傻瓜操作一键式的,5分钟就能学会,还干嘛去麻烦别人呢😂

    ▍1 iOS旧版应用下载工具

    以下这些工具都出自吾爱破解论坛里面的各个大佬🐶

    ▲作者,吾爱破解论坛:白白io

    ▲作者,吾爱破解论坛:wangfei021325

    ▲作者,吾爱破解论坛:Time丨Brand

    这3款软件的使用方式几乎差不多,但上面Time丨Brand大佬的这款工具相对更好用

    阿虚这里就仅介绍这一款软件,剩下的两款软件大家学会举一反三

    软件获取的话,关注微信公众号:阿虚同学,发送以下关键词,后台即会自动回复这3款软件的下载地址:

    旧版APP
    

    ▍2 使用方法

    由于Apple 移除了 iTunes 12.7 以后内置的 App Store 功能,所以我们必须先换用特定的包含 App Store 功能的 iTunes 12.6.3

    Apple官网专门提供了此版本的下载链接:https://support.apple.com/zh-cn/HT208079

    安装好 iTunes 12.6.3,并登录你的 Apple 账号,然后接着往下看

    ● 2.1 旧版应用下载的原理

    接着先简单说一下这类工具的原理,方便大家理解后面的操作步骤

    浅层的逻辑其实不难,就突出一个词——半路截胡

    这类工具都是拦截用户发送给 iTunes 的下载请求,并修改所请求下载软件的版本ID,再重新向 iTunes 发送下载请求,最后 iTunes 返回的就是旧的APP版本了

    只需要在 iTunes 点击下载之前,提前架好旧版应用下载工具进行下载请求拦截,最后下载得到的应用就是旧版了

    ● 2.2 直接搜索方式

    下面就来具体说一下下载步骤,先在 iTunes 中搜索想下载的旧版APP

    打开你想下载的APP,然后把 iTunes 先晾着

    ▲这步打开之后,先不要点击下载

    显示「获取」,表示这个应用没购买或者首次下载,显示「下载」则相反

    然后就如上文所述,我们需要架起抓包工具进行「截胡」

    ▲搜索APP

    找到你想下载的具体版本,右键下载

    出现以下提示的时候就可以回到 iTunes 进行下载了👌

    这个时候再到 iTunes 里面下载,得到的就是旧版APP了

    ● 2.3 复制APP链接方式

    除了以上方法,还可以按下面这样来使用

    先打开旧版APP抓包工具☝

    接着到 iTunes 搜索想要下载的 APP,然后点击去,在下载按钮右侧下拉菜单中,选择「复制链接」

    然后工具会自动识别链接,并弹出版本号选择界面

    剩下的步骤就和上一样了,选择想要下载的版本,再到 iTunes 里面下载即可

    ● 2.4 如何安装旧版ipa文件

    旧版的 iTunes 无法连接新 iPhone(比如iPhone11),所以下面的步骤可能需要你重新装回新版 iTunes 才行

    最新版 iTunes 下载地址:https://www.apple.com.cn/itunes/,建议不要下载Microsoft Store版

    或者你也可以用爱思助手:https://www.i4.cn/ 来安装ipa文件

    不过好处是,只要你把 ipa 文件下载下来,以后都能直接安装的,换手机也不影响,就是所谓的「一次下载,终身受益」😂

    总之安装之前,需要你在 iTunes-账户设置里面,先对 iPhone 连接的电脑授权

    如果这里出现授权反复授权不了,先关闭旧版APP下载工具,再进行授权即可

    然后就很简单了,在资料库里面找到下载好的旧版APP的 ipa 文件

    把这个 ipa 文件拖到 iTunes 里面下图所示区域,即可进行安装了

    iTunes 上方出现下图显示即表示操作正确

    如果拖动过去没进行开始安装,拔掉数据线重新连接一下电脑即可

    ▍3 常见问题

    最后说明一下操作过程中可能会遇到的问题

    ● 3.1 Library.itl问题

    如果之前有安装新版的 iTunes,换回旧版后运行 iTunes 时可能会出现以下弹窗

    解决方法很简单,用 Everything 等搜索软件(电脑自带的搜索也可以),找到这个Library.itl文件,删掉即可

    ▲搜索并删掉

    ● 3.2 怎么解决旧版APP的更新提示

    避免自己手贱不小心在 App Store 中点到更新按钮,我们可以在 ipa 文件进行安装之前,对 ipa 文件进行一点处理,来去除 App Store 的更新检测

    但这个也**只能去除 App Store 的更新检测,APP内的更新提示还是会有的(当然,你无视即可)**🤦🏻‍♂️

    方法就是右键 ipa 文件,用解压软件打开

    然后删除里面的 iTunesmeradata.plist 这个文件即可

    如果你右键没有「用XX解压软件打开」的选项,你也可以这样操作:把扩展名 ipa 改成 zip 或者 rar,用压缩软件打开,删除里面的iTunesMetadata.plist,再重新把后缀名改名回 ipa 即可👌

    ● 3.3 已下架的APP怎么抓取?

    很可惜,已下架的APP目前是没办法下载到旧版的

    而且想要下载到已经下架的APP也是比较困难的,除了尝试找 Testflight 版(开发者内测版,但这种很少)

    剩下唯一的办法就是找别人共享已购账号来下载了,这句话的意思是:自己上淘宝 or 咸鱼,或者找网友 or 朋友提供已下载过这个APP的 的Apple 账号👉👈

    ● 3.4 旧版APP功能有问题

    旧版APP出现各种使用上的问题是很正常的

    比如微博国际版 2.9.4现在被新浪限制了,不能进行登录;知乎 3.29.0,虽然是无广告,但看不了动图…

    加之旧版APP没有对新版系统版做适配,闪退也是可能出现的😅

    总而言之,旧版APP有优点,也有缺点,大家需要自己根据自己的系统版本和功能需求来做选择

    ▍4 一些旧版APP推荐

    最后再来推荐一些具体的APP旧版版本号吧📃

    不过以下旧版APP是否依旧能使用,阿虚也没能完全进行测试,能否在你的手机、系统上正常使用还是需要自行测试一下

    APP版本介绍
    白描 2.1.6没有每日5次的OCR限制,批量识别也可以一直用(翻译次数仍限制每日3次)
    微盘 3.4.3仍有搜索功能的一个版本
    清理君 1.9.4无广告版本,但不支持 iPhone X
    Annotable 1.11.2无内购功能全解锁版,此后版本开始收费
    Price Tag 2.3.1(已下架)无内购功能全解锁版
    网易云音乐 3.1.1无任何广告,无「视频」栏目
    网易云音乐 3.7.5无任何广告,无「视频」栏目,不时会弹出更新提醒
    网易云音乐 4.0.1无启动广告,无「视频」栏目
    网易云音乐 4.1.2改版添加「视频」按钮选项前的最后一版
    网易云音乐 4.3.4全面屏可正常显示,开屏极少出现广告,切回网易云不会有广告,不会弹出更新提醒
    网易云音乐 5.7.4视频XR的第一个版本
    微信 6.6.1支持callkit的最后一版
    微信 6.6.2首个支持切换两个账号的版本
    微信 6.6.7订阅号为瀑布流前的最后一版,不喜欢新版可安装此版
    微信 6.7.4大版本更新前最后一版
    微信 2.0.5(Mac版)此版本是最后一个可以将公众号文章在内置小窗浏览器打开的版本
    皮皮虾 1.3.2没有任何广告
    糗事百科 2.6.4无广告
    今日头条 3.1.1完美的一个版本
    今日头条Pro 6.3.2有小视频版块,功能齐全,打开很快
    哔哩哔哩 5.24.1300M大小,再往前的旧版无法登录
    哔哩哔哩 5.33.2关闭启动动画后没有开屏广告,但搜索之后下拉内容会卡屏
    Tik Tok 1.2.2未屏蔽地区最后一版,可以正常观看视频,但无法注册和登录
    腾讯动漫 4.4.5配合会员无限制可随意看,新版会员还需付费
    百度贴吧 6.9.6支持吧内搜索
    百度贴吧 8.9.0首个支持刘海屏的版本
    百度贴吧 9.2.0看起来清爽,且广告少
    百度贴吧 2.0.1(iPad 版)此版本干净无广告,而且还能查看别人隐藏的内容
    追书神器 2.23.1有广告,不需要追书币,追更模式健在,登录似乎有问题
    追书神器 2.24.24有广告,但可换源
    爱阅书香 4.3.1轻量可换源
    优酷视频 6.12.0无广告版,网友反馈,具体需自测
    腾讯视频 5.9.2可以绑定别人王卡来实现免流
    爱奇艺 5.7.1无片头广告,但因为适配问题iOS11以上无法安装
    爱奇艺 8.12.5不需会员也可以同时下载3个视频
    爱奇艺 9.8.0启动快,最后一个支持非主设备可以网页扫码登录的版本
    淘宝 8.0.0购物车优惠明细查看、支持扫码、功能全
    咸鱼 6.3.2没有开屏广告,打开不会有更新提醒
    Twitter 7.37.2带翻译功能的
    墨迹天气 7.1.6适配iOS11的第一个版本,打开快
    和飞信 4.1.1352最后拥有漏话拾遗功能的版本,漏话拾遗功能打开后在游戏时不会被打扰
    天翼云盘 4.5.0最后一个不需要超级会员就可以上传视频的版本,每日签到还能增加空间
    网易漫画 4.2.0越狱用户可以使用Flex3会员补丁
    钉钉 4.3.5最后支持callkit版本
    无忧行 3.8.2最后支持callkit版本
    饿了么 7.21还可以使用叠加红包
    滴滴出行5.1首个支持滴滴单车的版本
    NOMO相机 0.9.6新商店前的最后一个版本,不臃肿,切换相机方便
    TIM 1.1.6功能简洁,启动快
    讯飞输入法 6.0安装包小输入流畅
    百度输入法 6.0.2刚好可以使用超级皮肤的版本,没有剪切板,输入流畅
    百度输入法 7.1.1无臃肿和无语音功能的版本
    搜狗输入法 4.0.0输入极度流畅,支持iOS11强烈推荐
    搜狗输入法 5.0.1新功能多,使用流畅无卡顿
    有道云笔记 5.7.1笔记列表无广告,「我的」界面有广告
    有道云笔记 5.9.8云笔记与云协作分开前的最后一版,有广告,但不用安装两个应用
    腾讯翻译 3.1最后一个无臃肿功能版,主要功能都有
    唱吧 8.2流畅稳定,占用内存低
    全民K歌 3.7.6流畅稳定
    美图秀秀 6.0.5流畅稳定
    花鸟字 1.2保存真彩色画作,背景画布素材与新版相同
    文件全能王 5.4支持嗅探式下载音视频,支持m3u8格式下载
    电视助手 5.5.0支持音视频下载,支持导出文件
    Persian IDM 1.0无广告,无内购,支持音视频下载
    快眼追剧 1.6.2支持云播放
    Telegram X 5.0.2无限制屏蔽组,具体自行测试
    喜马拉雅 5.4.9体积小,启动快
    豆瓣 4.1.0启动快,此版后的此应用体积越来越大
    Tumbook 1.3汤不热第三方客户端,带下载功能的旧版
    Tumbot 1.0.5无广告,支持下载视频
    指尖浏览器 1.6带下载功能,支持m3u8,新版1.9需系统为汉语才带下载功能
    鲨鱼浏览器 1.0支持视频下载,支持m3u8格式下载
    知乎 3.10.0无广告,无「通知」按钮,但部分功能无法正常使用
    知乎 3.12.0无广告,有「通知」按钮,但部分功能无法正常使用
    知乎 4.4.2是最后一个回答页面里没有广告的版本
    微博 7.3.1微博出现首页直播图标前最后一版,评论页暂无广告,相对简洁
    QQ 6.5.9安装包小,启动快,但不支持斜眼笑/托腮等表情的查看
    QQ 6.6.5安装包小启动迅速,iOS12可以流畅使用
    QQ 6.7.1QQ 7.0之前的最后一版,很清爽,但会有小红点更新提示
    QQ 7.2.5全面适配iOS11
    QQ音乐 5.2.2用FLEX可直接下无损格式
    QQ音乐 6.2占用内存少,启动快
    QQ音乐 6.3.1可以免费使用DTS音效
    QQ音乐 6.5.1可以下载高清MV
    QQ空间 5.1.1动态浏览无广告,iOS11无法安装
    QQ浏览器 6.1.1能缓存视频的最后一版
    QQ浏览器 6.3最后一个能关闭头条的版本
    百度网盘 6.6.0支持解压文件,文件貌似无法导出,没其他优点
    百度网盘 6.7.3刚好支持重命名后缀和打开分享未知文件
    蜻蜓FM 4.7.6无音频广告
    UC浏览器 10.5.5无头条,能缓存视频,但iOS11会有闪退情况发生
    UC浏览器 10.7.11有头条,能缓存视频的最后一版,不支持第三方打开
    UC浏览器 11.3.1可缓存视频,下载文件,首页无广告
    虾米音乐 6.1.8适配iOS11,随心听自定义模式
    天天动听 8.1.5天天动听变成阿里星球的最后一版,网络服务停掉,可当离线播放器使用
    酷狗音乐 3.9.4纯粹的播放器
    酷我音乐 4.9.2可以下载无损音质的版本,但版本太旧很多机器可能装不上
    多看阅读 3.5.3纯粹的阅读器,但iOS11上适配有问题
    Downloads 2.0.0下载视频利器
    Aloha 2.0.3(中区已下架)视频缓存利器,添加新闻首页前的最后一版
    Castro 2.6.2各国电台播放器,学语言利器,则是无订阅限制的最后一版
    高德地图 7.5.8无开屏广告
    高德地图 8.50.0提醒不弹出,使用友好
    高德地图 8.90不卡不发热
    支付宝 10.1.32启动快,第一个支持通知栏展开付款码的版本
    威锋网 2.2.11无广告,但会员消息通知打不开
    Pin 3.2.2拥有完整xTeko实验室功能的最后一个版本
    Oxford Advanced Learner’s Dictionary 3.53.32牛津高阶英汉第八版,最后一个收费版本
    Merriam-Webster Dictionary 2.1无广告,但高版本系统无法安装
    美颜相机 5.7.5效果比较自然版
    美颜相机 6.2.6含主题乐园版
    美颜相机 7.1.1第一个有萌拍版
    TV Assist电视助手 5.5.0支持音视频下载,支持导出文件
    intoLive Pro 2.0.2用GIF或视频而制作动态壁纸,30秒
    元气骑士 1.6.2同时支持卡无限幻影的BUG和4人联机的版本,再早没联机,再晚没BUG
    触宝电话 5.6.1刚加入亲情号的版本,有广告但不多(之后版本广告超多)
    TDownloadr 2.6.4下载神器,支持国内外几乎所有视频下载(新版下载功能阉割)
    秒拍 6.7.6.8传视频稳定且不会特别压缩面质,而新版会自动剪裁视频
    AVPlayer 1.645最后一个支持DTS的版本
    AVPlayer 2.50最后一个支持AAC打开杜比环绕音效的版本
    nPlayer 2.6.5支持AAC打开杜比环绕音效,音效比新版的好,快拉FLV格式的时候不卡,但不支持DTS
    Thor 1.2.0.283直接查看响应中消息体的音视频文件,抓取到的音视频文件,可以播放,支持分享和导出(新版本限制音视频文件直接查看和导出)
    Alfred 2.8此后的版本会和 popclip 的欧路取词发生冲突
    Terminology 3.3.4最后一个收费版
    Ulysses 10最后一个非订阅版

    而 Mac 用户就没这么方便的工具了,只能自己手动抓包了,具体教程请看阿虚之前写的那篇教程,方法是依然有效的:https://mp.weixin.qq.com/s/chCRHxVCBSDD0GCU-7Wu0Q

    展开全文
  • 大家平时在使用苹果手机时可能会遇到 App Store 一直转圈,下载不了应用的问题。在这里为大家介绍一些如何解决这个问题的方法,希望可以帮到你。苹果手机下载不了app,一直转圈怎么办?(附两种解决方法)iPhone系统...
  • uni-app 点击切换列表元素样式

    千次阅读 2020-12-22 13:47:31
    列表滚动使用视图滑动组件:文档 切换样式使用动态class或者style来绑定:文档 demo示例 demo代码 html <scroll-view scroll-x="true" class="list-box "> <view class="list-item" :class="currentIndex...
  • App合规

    千次阅读 2022-02-14 21:10:32
    该功能无法使用,提示需要开启权限 56 敏感信息收集(若有对应功能需要进行测试,一般为社区SaaS类APP 车牌号、物业费(PM提供一份个人数据信息收集列表)) 敏感信息收集 验证身份证信息收集时弹窗提示 P1 安全测试...
  • 阅读app软件开源,不含任何广告,使用起来非常清爽,赶紧下载试试吧。软件功能自定义书源,自己设置规则,抓取网页数据,规则简单易懂,软件内有规则说明。列表书架,网格书架自由切换。书源规则支持搜索及发现,...
  • 悬浮图片app最新版是一款可拖动可缩小的让图片悬浮在手机桌面的应用软件,用户可以在这里自定义任何图片来进行操作,还能调整位置大小,你想怎么设置就怎么设置,透明的图片也是可以的,让桌面看起来更有创意,非常...
  • uni-app 写小程序 索引列表,仿微信通讯录 去uni-app官网 下载插件 indexlist <missthee-indexlist :data="carLists" placeholder='输入关键字进行查询' @select-item='selectHandler'></missthee-...
  • 影音先锋app是一款综合型播放软件,影音先锋app以兴趣为导向,集成了视频播放、浏览器搜索、聊天交友等多种功能引擎为一体,这款影音先锋app界面简洁,操作简单,带给您想要的观影体验。功能介绍万能播放具有超强的...
  • 5+App和uni-appApp开发上有何区别?

    千次阅读 2020-11-12 10:32:05
    抛开uni-app可以开发多端,而5+App只能开发App不谈。本文只谈仅做App的情况下,uni-appApp和5+App有什么区别。 5+App是DCloud上一代产品,基于webview扩展的混合开发技术。 它的每个页面都是一个webview加载一个...
  • (HBuilder X) 从下载HBuilderX到生成app.apk

    千次阅读 2022-03-18 22:51:47
    因为我们需要打包app,所以最好下载的是App开发版,若是标准版则需要自行下载和配置app的依赖 下载好后是一个压缩包,解压后直接可以使用(无安装): 使用 第一次使用可以选择主题,和习惯快捷键
  • 从Safari跳到APP 跳转 既然要想跳到你指定的APP,那么就需要在你的APP中定义一个特殊的标示,也就是一个URL协议。 定义URL协议的如下图TARGETS ——> info ——>URL Types——>添加一个URL协议 Snip...
  • APP Inventor中的网络数据库TinyWebDB只能够查询单个Tag,返回单个Value,虽然可以用列表,但还是很不方便;于是有了API,通过API我们可以对微数据库进行增删查改,其中查询最难,因为查询需要提交很多参数;当我们...
  • APP上架全流程

    千次阅读 2022-04-21 17:05:56
    应用商店列表: 华为应用商店:https://developer.huawei.com/consumer/cn/ 小米应用商店:https://dev.mi.com/console/ 应用宝:https://app.open.qq.com/ OPPO应用商店:https://open.oppomobile.com/ VIVO应用...
  • Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误。 此时检查发现,并没有对App的内购逻辑做任何改动。 那么,这...
  • 【软件功能】锁定后台滑出任务列表并找到Bear Pop-up并将其上上锁,能够有效降低被误杀的可能性。隐藏任务锁定后台’后开启任务隐藏,可降低被用户误杀的概率。开启后在任务列表中将无法看见,点按下方开关可开启/...
  • APP Inventor 基于网络微服务器的即时通信APP 最近,老师要求我们用APP Inventor做一个APP,简单地做了一个即时通信的APP(超低配版的QQ,逃~),连肝了几个晚 上,目前已是比较稳定的版本了,虽然还有很多小问题...
  • “科师有约” 校园APP 的定位是 “校园信息聚合平台” ,那就要最大程度上利用学校现有的线上资源,比如学校官网、线上图书馆、微信公众号、微博等信息,并且聚合到我们的APP中,方便学生用户去使用。 本文主要讲解...
  • Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 本课程将使用 flutter 从0 打造一个创业级的应用。 最基础的应用加框包括 应用欢迎页面、引导页面、广告页面、类似微信的底部导航...
  • 目录 一.OS系统和IOS版本更新 ​二:App-Store方式 三:Ad-hoc方式 四:In-house 方式 ...在iosAPP下载安装时,如果出现此时无法下载安装APP的字样时,可能是苹果系统进行了支持更新,并需要我们确认
  • 不改桥接,上海电信SDN光猫实现外访问的3种方法 使用端口转发、DMZ和UPnP实现内网穿透 SDN光猫1.4版本以上开启了可以实现外访问的虚拟服务器、DMZ和UPnP等功能。这几个功能也正是因在工信部投诉无法桥接的人太...
  • 鸿蒙系统 Hi3861 实现手机APP功能

    千次阅读 2020-10-09 22:48:59
    本节主要讲如何去实现Hi3861 APP功能。需要说明的是,本人实现这个功能主要是用于学习,所涉及知识包括Hi3861的WiFi操作,AP模式、STA模式、按键功能、网络编程、JSON数据格式、手机APP开发。 所有源码,还有...
  • 前言:相信很多刚刚步入测试行业的小伙伴对于APP测试不是很熟悉,这次我为大家提供一篇宝藏文章,希望大家喜欢,谢谢! 一、APP测试基本流程 1、流程图 2、测试周期 测试周期可按项目的开发周期来确定测试时间,...
  • 如何下载app的历史版本呢?下面我就以“抖音极速版”为例,教大家如何从【豌豆荚】下载“抖音极速版app”的历史版本。 豌豆荚官网:https://www.wandoujia.com 教程步骤: 1、打开上述豌豆荚官网,在搜索框输入...
  • app列表测试

    千次阅读 2017-02-03 16:19:03
    app列表分为二种类型:不能添加数据的列表,能添加数据的列表 不能添加数据的列表是那种只能从服务器获取数据,但客户端无法添加数据。 能添加数据的列表是那种可以从客户端添加数据的app系统。二种类型的列表测试...
  • python创建app

    千次阅读 2020-12-05 20:14:32
    新建 app python manage.py startapp app-name 或 django-admin.py startapp app-name 一般一个项目有多个app, 当然通用的app也可以在多个项目中使用。 3. 同步数据库 python manage.py syncdb 这种方法可以创建...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 203,063
精华内容 81,225
关键字:

列表网app下载