• iOS 马甲包制作+垃圾OC、Swift代码生成脚本 文章目录iOS 马甲包制作+垃圾OC、Swift代码生成脚本一、马甲包介绍1、什么是马甲包3、怎么制作马甲包二、OC垃圾代码生成脚本三、Swift垃圾代码生成脚本 一、马甲包介绍 ...

    一、马甲包介绍

    1、什么是马甲包

    马甲包是利用APP Store规则漏洞,通过开发人员的技术手段,在多个地区平台上架同一产品。马甲包和主包内容功能是一样的。

    2、为什么要制作马甲包

    不同的产品定位,不同的产品需要,会需要一套代码上架多个产品。

    1. 产品定位不一样,马甲包用来做一些导量、刷分。
    2. 抗风险。先用马甲包测试新功能,看看市场反应,好的话再在主包上迭代。
    3. 需要上架到不同国家地区应用市场。

    3、怎么制作马甲包

    UI部分:

    1. icon和启动图替换
    2. 代码里面文案修改

    代码部分:

    1. 修改工程名字
    2. 修改图片资源,改变图片的hash值,不要让检测到以前被拒的资源
    3. 修改类名
    4. 修改方法名
    5. 打乱方法顺序
    6. 添加混淆代码、垃圾代码

    打包提审:

    1. 建议换一个开发者账号去提交,并且换一个ip
    2. 更换一台新电脑打包
    3. 项目描述、项目宣传不能和之前的一样
    4. 测试账号不能和之前一样
    5. 一个账号只提交一个包,一台电脑不能提交超过23个包

    二、OC垃圾代码生成脚本

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    #第一步:首先生成一个500位的数组 驼峰类型的元素 用作文件名 eg:AsdfdfGsd
    import random
    import os,sys
    import string
    
    first = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    second = "abcdefghijklmnopqrstuvwxyz"
    number = "345"
    index = 0
    array = []
    for i in range(500):
        final=(random.choice(first))
        index = random.randint(3, 5)
        for i in range(index):
            final+=(random.choice(second))
        final += (random.choice(first))
        for i in range(index):
            final+=(random.choice(second))
        array.append(final)
    
    
    print (array)
    
    #第二步:
    #用上边生成的数组来创建对应的.h和.m文件
    # -*- coding: utf-8 -*-
    import random
    import os
    import string
    #创建.h文件
    def text_createH(fileNmae,msg,msg1,propertyNumber,methodArray,msg3):
        full_path = sys.path[0] + '/OCFiles/' + fileNmae + '.h'
        file = open(full_path, 'w')
        file.write('//\n//  '+fileNmae+'.h\n//  SajiaoShopping\n\n//  Created by 某 波 bo on 15/10/23.\n//  Copyright ©  2017年 阿里郎. All rights reserved.\n//\n\n')
        file.write(msg)
        file.write(msg1)
        propryNameArray = []
        for index in range(1,propertyNumber):
            propryNameArray.append(random.choice(array))
        propryNameArray = list(set(propryNameArray))
        for propertyName in propryNameArray:
            file.write('@property(nonatomic,strong)'+random.choice(classArray)+' * '+propertyName+';\n')
        file.write('\n\n')
        for methodName in methodArray:
            file.write('- (void)pushTo'+methodName+'VC:(NSDictionary *)info;\n')
        file.write(msg3)
        file.close()
        print('Done')
    #创建.m文件
    def text_createM(fileNmae,msg,msg1,methodArray,msg3):
        full_path = sys.path[0] + '/OCFiles/' + fileNmae + '.m'
        file = open(full_path, 'w')
        file.write('//\n//  '+fileNmae+'.m\n//  SajiaoShopping\n\n//  Created by 某 波 bo on 15/10/23.\n//  Copyright ©  2017年 阿里郎. All rights reserved.\n//\n\n')
        file.write(msg)
        file.write(msg1)
        for methodName in methodArray:
            file.write('- (void)pushTo'+methodName+'VC:(NSDictionary *)info\n{\n\n  NSMutableArray *array = [NSMutableArray array];\n')
            number = random.randint(3, 10)
            for i in range(1,number):
                file.write('  [array addObject:@"'+random.choice(array)+'"];\n')
            file.write('\n}\n\n')
        file.write(msg3)
        file.close()
        print('Done')
    
    classArray = ['NSString','UILabel','NSDictionary','NSData','UIScrollView','UIView']
    array = ['HwxrFvrj', 'QnzduQbtdd', 'PvcrwLtqhf', 'UvdhDbjn', 'SuntmyTxvyzg', 'CvlxwBipbp', 'GzrdyzIbimvz', 'CqsjqMmgsp', 'OxaaeuWjhasc', 'NjiardRvwgbi', 'NcculmLtpljq', 'ApoqQrll', 'GkgokDyvjb', 'EblldkVouplj', 'KfdrFvnw', 'SfhyhObftc', 'SmruByoc', 'YzcccvXmpmit', 'OmqvaHpxat', 'XzytsUyvyd', 'MjforNnnyi', 'ZvjhuIdogs', 'BzfrxzSeahxc', 'PycycwFjtpny', 'XvngtoSedljr', 'DktiaCbucd', 'AqbplNuodc', 'MzkvgZuala', 'KdwzIoej', 'AaynatUpqcfd', 'IyvwhZvtjc', 'UmijGmsy', 'AoayndXxghym']
    array = list(set(array))
    
    for name in array:
        number = random.randint(3, 10)
        methodArray = []
        for i in range(1,5):
            methodArray.append(random.choice(array))
        methodArray = list(set(methodArray))#数组去重
        text_createH(name+'ViewController', '#import <UIKit/UIKit.h>\n','@interface '+name+ 'ViewController:'+ 'UIViewController\n\n',number,methodArray,'\n\n@end')
        text_createM(name+'ViewController', '#import "'+name+'ViewController.h"\n\n' '@interface '+ name+'ViewController()\n\n @end\n\n','@implementation '+name+'ViewController\n\n- (void)viewDidLoad { \n\n [super viewDidLoad];\n\n}\n\n',methodArray,'\n\n@end')
    
    

    三、Swift垃圾代码生成脚本

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    
    
    import random
    
    import os,sys
    
    import string
    
    #创建.swift文件
    
    def createSwift(fileNmae,propertyNumber,methodArray):
    
        full_path =  sys.path[0] + '/SwiftFiles/' + fileNmae + '.swift'
    
        file = open(full_path, 'w')
    
        file.write('//\n//  '+fileNmae+'.swift\n//  LinkMall\n\n//  Created by Meng on 2018/9/17.\n//  Copyright © 2018年 OneThing Ltd. All rights reserved.\n//\n\n')
    
        file.write('import UIKit \n\n' + 'class '+fileNmae+': UIViewController {\n\n')
        
        propryNameArray = []
    
        for index in range(1,propertyNumber):
    
            propryNameArray.append(random.choice(array))
    
        propryNameArray = list(set(propryNameArray))
    
        for propertyName in propryNameArray:
    
            file.write('    public var '+propertyName+':'+random.choice(classArray)+'!\n')
    
        file.write('\n\n')
        
        file.write('    override func viewDidLoad() {\n        super.viewDidLoad()\n    }\n\n')
       
    
        for methodName in methodArray:
    
            file.write('    public func '+methodName+'TOVC() {\n\n       var realArr = Array<String>()\n')
    
            number = random.randint(10, 15)
    
            for i in range(1,number):
    
                file.write('       realArr.append("'+random.choice(array)+'")\n')
    
            file.write('\n    }\n\n')
    
        file.write('}')
    
        file.close()
    
        print('Done')
    
    
    def createClassName():
        
        first = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    
        second = "abcdefghijklmnopqrstuvwxyz"
    
        index = 0
    
        array = []
    
        # 设置生成多少个类
        classNumber = 100
        for i in range(classNumber):
    
            final=(random.choice(first))
            #字符串长度
            index = random.randint(10, 15)
    
            for i in range(index):
    
                final+=(random.choice(second))
    
            final += (random.choice(first))
    
            for i in range(index):
    
                final+=(random.choice(second))
    
            array.append(final)
        return array
    
    #属性类型
    classArray = ['UIColor','UILabel','UITableView','UISlider','UIScrollView','UIView','UIButton']
    
    array = createClassName()
    
    array = list(set(array))
    
    for name in array:
    
        number = random.randint(10, 15)
    
        methodArray = []
    
        for i in range(50,100):
    
            methodArray.append(random.choice(array))
    
        methodArray = list(set(methodArray))#数组去重
        
        createSwift(name+'VController',number,methodArray)
    
    
    
    展开全文
  • 1.JS调用OC代码 步骤1:以下是html页面,test1函数,并没有在页面中声明,而是在OC的UIWebView中绑定的    //test2(p)函数是准备 OC调用JS函数用的  function test2(p){  alert(p);  }    ...

    1.JS调用OC代码

    步骤1:以下是html页面,test1函数,并没有在页面中声明,而是在OC的UIWebView中绑定的

    <html>
    <head>
        <script>
            //test2(p)函数是准备 OC调用JS函数用的
            function test2(p){
                alert(p);
            }
        </script>
    </head>
    <body>
        <input type="button" value="点击-> test1()" οnclick="test1()" />
    </body>
    </html>

    步骤2:控制器中的OC代码

    #import "ViewController.h"
    #import <JavaScriptCore/JavaScriptCore.h>
    
    @interface ViewController ()<UIWebViewDelegate>
    @property (nonatomic, strong) UIWebView *webView;
    @end
    
    @implementation ViewController
    
    - (UIWebView *)webView
    {
        if (!_webView) {
            CGRect rect = self.view.bounds;
            rect.size.height = rect.size.height * 0.8;
            rect.origin.y = rect.size.height;
            _webView = [[UIWebView alloc] initWithFrame:rect];
            _webView.delegate = self;
            [self.view addSubview:_webView];
        }
        return _webView;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
     
        NSString *path = [[NSBundle mainBundle] pathForResource:@"static" ofType:@".html"];
        NSString *htmlString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
        [self.webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:path]];
    }
    
    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        
        //JS调用OC代码
        context[@"test1"] = ^{
            //由于JS参数是不固定的,所以取出来的就是个数组
            
            NSLog(@"JS已经成功调用OC的block了");
            NSArray *a = [JSContext currentArguments];
            for (NSString *s in a) {
                NSLog(@"s = %@", s);
            }
        };
        
        
        
        
        //OC调用JS函数
        [context evaluateScript:@"test2(\"OC调用JS函数\");"];
        
        
    }
    
    @end

    在UIWebView加载完页面后的事件中,加入了JS的方法,使得当页面点击按钮事件时,OC的context[@"test1"]方法被调用了

    通过evaluateScript:方法可以调用页面中的JS函数





    2.使用一种特殊的方式来调用,遵守JSExport协议

    例如:定义一个协议,有三个方法,由遵守类去实现,并且通过JS调用

    新建一个类

    头文件

    #import <Foundation/Foundation.h>
    #import <JavaScriptCore/JavaScriptCore.h>
    
    @protocol ZRContextExportProtocol <JSExport>
    
    //无参数方法
    - (void)testNoParameter;
    
    //有一个参数的方法
    - (void)testOneParameter:(NSString *)params;
    
    //有两个参数的方法
    - (void)testTwo:(NSString *)params WithAddress:(NSString *)addr;
    
    @end
    
    
    @interface ZRContextExport : NSObject<ZRContextExportProtocol>
    
    @end

    源文件

    #import "ZRContextExport.h"
    
    @implementation ZRContextExport
    
    - (void)testNoParameter
    {
        NSLog(@"无参数,无返回值的OC函数");
    }
    
    - (void)testOneParameter:(NSString *)params
    {
        NSLog(@"一个参数,无返回值得OC函数, params=%@", params);
    }
    
    - (void)testTwo:(NSString *)params WithAddress:(NSString *)addr 
    {
        NSLog(@"有参,有返回值的的OC函数, params=%@, addr=%@", params, addr); 
    }
    
    @end

    OC调用

    #import "ViewController.h"
    #import <JavaScriptCore/JavaScriptCore.h>
    #import "ZRContextExport.h"
    
    @interface ViewController ()<UIWebViewDelegate>
    @property (nonatomic, strong) UIWebView *webView;
    @end
    
    @implementation ViewController
    
    - (UIWebView *)webView
    {
        if (!_webView) {
            CGRect rect = self.view.bounds;
            rect.size.height = rect.size.height * 0.8;
            rect.origin.y = rect.size.height;
            _webView = [[UIWebView alloc] initWithFrame:rect];
            _webView.delegate = self;
            [self.view addSubview:_webView];
        }
        return _webView;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
     
        NSString *path = [[NSBundle mainBundle] pathForResource:@"static" ofType:@".html"];
        NSString *htmlString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
        [self.webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:path]];
    }
    
    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        
        
        //实例化ZRContextExport类,将该对象注入到JS中
        ZRContextExport *contextExport = [[ZRContextExport alloc] init];
        context[@"ZRContextObject"] = contextExport;
        
        //调用一个函数
        [context evaluateScript:@"ZRContextObject.testNoParameter()"];
        
        //注意这的OC函数名问题
        [context evaluateScript:@"ZRContextObject.testTwoWithAddress('第三个函数测试','北京市');"];
    }
    
    @end

    JS调用

    <html>
    <head>
        <script>
             //调用的第二个函数
             function test1(){
                 ZRContextObject.testOneParameter("第二个函数");
                 ZRContextObject.testTwoWithAddress("第三个函数", "北京市");
             }
        </script>
    </head>
    <body>
        <input type="button" value="点击-> test1()" οnclick="test1()" />
    </body>
    </html>

    好了,以上就是两种JS和OC的互相调用具体代码的实现,有问题的小伙伴儿可以在下面的额评论框提问,LZ一上线,就会回答的大笑










    展开全文
  • 在目录中创建OC相关文件 // // SumNumbers.h // Dome2test // // Created by 郭文亮 on 2018/11/23. // Copyright © 2018年 finalliang. All rights reserved. // #import &lt;Foundation/Foundation....

    在目录中创建OC相关文件

    //
    //  SumNumbers.h
    //  Dome2test
    //
    //  Created by 郭文亮 on 2018/11/23.
    //  Copyright © 2018年 finalliang. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface SumNumbers : NSObject
    //添加一个整形属性
    @property(nonatomic,assign) int type;
    //添加一个方法,传入两个整形参数,并返回两个整形参数的和
    - (int)sum:(int)number1 andNumber2:(int)number2;
    @end
    
    ----------------------------------------------------------------------------------------
    
    //
    //  SumNumbers.m
    //  Dome2test
    //
    //  Created by 郭文亮 on 2018/11/23.
    //  Copyright © 2018年 finalliang. All rights reserved.
    //
    
    #import "SumNumbers.h"/Users/finalliang/Desktop/code/Dome2test/Dome2test/menu.json
    
    @implementation SumNumbers
    - (int)sum:(int)number1 andNumber2:(int)number2{
        return number1 + number2;
    }
    
    @end
    ----------------------------------------------------------------------------------------
    //
    //  Use this file to import your target's public headers that you would like to expose to Swift.
    //
    //在桥接头文件中,引入类的头文件
    #import "SumNumbers.h"
    

    最后在视图控制器中直接调用即可

    //
    //  ViewController.swift
    //  Dome2test
    //
    //  Created by 郭文亮 on 2018/11/23.
    //  Copyright © 2018年 finalliang. All rights reserved.
    //
    import UIKit
    class ViewController: UIViewController {
        
        //MARK: -
        //MARK: viewDidLoad
        override func viewDidLoad() {
            super.viewDidLoad()
            let sumNumber = SumNumbers()
            let result = sumNumber.sum(1,andNumber2: 2)
            print("The result:\(result)")
        }
        
        override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() }
    }
    

     

    展开全文
  • oc代码直接转swift代码

    2020-07-06 23:30:59
    oc代码直接转swift代码,非常好用,绝对福利~更多精彩
  • iOS oc 调用 swift

    2019-07-03 07:14:24
    如股票oc要调用swift里面的代码 需要包含固定这个头文件 项目名称 LiqunSwiftDemo-Swift.h #ProjectName#-Swift.h 固定的写法 swift 目的 是取代oc 但是 不会完全取代 只是前端的替换 LiqunSwiftDemo-Swift 点...

    如股票oc要调用swift里面的代码 需要包含固定这个头文件

    项目名称 LiqunSwiftDemo-Swift.h

             #ProjectName#-Swift.h

    固定的写法

    swift 目的 是取代oc 但是 不会完全取代 只是前端的替换

    LiqunSwiftDemo-Swift 点进去 可以看到 所有的swift代码 都产生了 对应的一个 oc的类

    也就是 编译过程中 swift 先转换成 oc代码 再由oc代码转换成 c代码 (swift 在oc 之上 编译器前端的语法的转换 不涉及到编译器后端的转换)

     1,  #import <LiqunSwiftDemo-Swift.h>

     2,  写一个swift 类

    import Foundation
    
    class TestSwift : NSObject {
        override init() {//
            print("in init")
        }
        func someFunc(){
            print("in someFunc")
        }
        func getArrayByValue(v1:String ,v2:String) -> NSArray{
            return [v1 , v2]
        }   
    }
    

     在oc 中调用

        TestSwift *ts = [[TestSwift alloc]init];

        [ts someFunc];

        NSArray * arr = [ts getArrayByValue:@"今天天气" v2:@"---没有雾霾"];

        for(NSString *str in arr){

            NSLog(@"str is %@",str);

        }

    //结果

    in init

    in someFunc

    2016-01-15 15:39:27.586 LiqunSwiftDemo[1776:117383] str is 今天天气

    2016-01-15 15:39:31.346 LiqunSwiftDemo[1776:117383] str is ---没有雾霾

    转载于:https://www.cnblogs.com/someonelikeyou/p/5133536.html

    展开全文
  • 我做在写IOS代码是,发现之前写的关于检查是否包含某个特定字符串时可以用的代码,到另外一个地方就不能用了,后面又查了,没有说法,只能在换种方法写下,结果竟然可以,都不知道这是什么鬼!!!之前的代码:...

    我做在写IOS代码是,发现之前写的关于检查是否包含某个特定字符串时可以用的代码,到另外一个地方就不能用了,后面又查了,没有说法,只能在换种方法写下,结果竟然可以,都不知道这是什么鬼!!!

    之前的代码:

    NSString *string = @"dsfsdfsdh";
    if(([string rangeOfString:@"h"].location !=NSNotFound))
        {
        //存在
         }

    然后我想检测是否包含“dfs”结果不能用(举个例子)

    现在的写法:

    NSString *string= @"dsfsdfsdh";
    
    if ([string containsString:@"dfs"]) {
    
    NSLog(@"包含");
    
    }

    然后可以用了,这是为什么?麻烦大神给指教下原因,以免下次再出现~~~

    展开全文
  • 代码判断设备iOS系统版本号从而使用不同方法处理来适配的四种方法
  • iOS代码适配判断

    2014-12-25 10:34:42
    给大家提供一套代码适配的判断, 可以直接拿来用, 新建一个.h文件, 然后把代码粘贴进去,就可以直接使用 在.h里面要写的代码: #define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) #...
  • ios c++ 调用oc代码

    2013-02-07 14:50:04
    今天照猫画虎的用c++调用了一段oc代码,需要注意的一点是为了混编,.cpp文件后缀要改为.mm,其他的就按照oc跟c++语法使用就是了  C++代码  //  // MKStoreForCpp.h  //    #ifndef SGR_...
  • 之前一个ios项目中,需要通过UIWebview来打开一个静态页面,并在静态页面中 调用相关object-c代码。   一、以前使用js调用object-c的方法 关于如何使用javascript调用object-c中的函数和方法,我搜索了好久 网上...
  • CFAbsoluteTimeGetCurrent()函数能够以毫秒为单位计算当前时间与2001.1.1差值。 CFAbsoluteTime start = CFAbsoluteTimeGetCurrent(); // do something CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();...
  • iOS7开始 苹果公布了JavaScriptCore.framework 它使得JS与OC的交互更加方便了。 下面我们就简单了解一下这个框架 首先我导入framework 方法如下 点击Linked Frameworks and Libraries 的添加后 选择 ...
  • ios项目我提供了一个sample的项目,首先git clone该项目到本地。git clone https://github.com/DoctorQ/ios_test.git Cloning into 'ios_test'... remote: Counting objects: 88, done. remote: Total 88 (delta 0)
  • 一行代码集成一款精致的第三方OC日历——WZYCalendar
  • iOS 代码审查(Code Review for iOS
  • iOS 静态代码扫描

    2015-06-18 10:25:12
    iOS 静态代码扫描(facebook 出品 infer) 前阵子 facebook开源了其静态代码扫描工具,该工具通吃 JAVA\Android\iOS,不仅可以检查 Android 和 Java 代码中的 NullPointException 和 资源泄露,也可以发现 iOS 和...
  • js调用Android、ios原生代码
  • iOS 判断系统版本

    2018-02-12 17:12:18
    由于各种原因,程序需要兼容iOS以前的版本,那么设置一个较低的部署目标和基于特定iOS版本的代码分支,就显得很有必要了。 举个例子: 以前我们判断iOS版本会如下写: if ([[[UIDevice currentDevice].system...
  • IOS_C++和OC的互相调用

    2019-01-18 15:41:56
    OC和C++的相互调用 这篇文章是记录自己学习IOS...对于OC调用C++,这是比较简单的,因为OC是可以无缝调用C的代码的,在xcode上也是可以直接编译通过的,但是对于C++代码则不行。 想调用C++代码需要将.m文件变成.mm文...
  • OC中调用Swift代码方法

    2018-06-03 09:27:48
    最近在项目中使用到了Swift语言写的第三方的框架,所以在这里将OC中使用Swift的方法说明一下。1.首先要在Build Setting中进行相关配置2.在Podfile文件中要加上use_frameworks!为什么要加use_frameworks!呢?首先需要...
1 2 3 4 5 ... 20
收藏数 40,557
精华内容 16,222