iOS 用脚本添加sdk库

#!/usr/bin/env ruby
require 'xcodeproj'

#打开项目工程
project_path = './leitinglib.xcodeproj'
project = Xcodeproj::Project.open(project_path)
target = project.targets.first

#找到要插入的group(参数中的true表示如果找不到group,就创建一个group)
group = project.main_group.find_subpath('leitinglib/framework/qiyuSDK',true)
group.set_source_tree('<group>')

group_QYAccessLayer = project.main_group.find_subpath('leitinglib/feature/QYSDK',true)
group_QYAccessLayer.set_source_tree('<group>')

#AIHelp相关
group_AIHelp = project.main_group.find_subpath('leitinglib/framework/ElvaChatServiceSDK',true)
group_AIHelp_H_M = project.main_group.find_subpath('leitinglib/feature/AIHelp',true)


#智齿相关
group_zhichi = project.main_group.find_subpath('leitinglib/framework/zhichiSDK',true)
group_zhichi_H_M = project.main_group.find_subpath('leitinglib/feature/ZCSDK',true)



#递归添加索引
def addFilesToGroup(aTarget, aGroup, filePath, fileName)
    if File.directory? filePath
        # 当前文件为目录
        Dir.foreach(filePath) do |file|
            if file.to_s.end_with?(".bundle")
                #bundle文件属于目录,直接添加引用
                puts "添加#{file}"
                file_ref = aGroup.new_reference(File.join(filePath, file))
                aTarget.add_resources([file_ref])
            elsif file !="." && file !=".."then
                subPath = File.join(filePath, file)
                if File.directory? subPath
                    #子文件也属于目录,添加新的group
                    newGroup = aGroup.find_subpath(file,true)
                    
                    #递归添加索引
                    addFilesToGroup(aTarget, newGroup, subPath, fileName+"/"+file)
                else
                    #递归添加索引
                    addFilesToGroup(aTarget, aGroup, subPath, fileName+"/"+file )
                end
            end
        end
    else
    #puts("fileName=",fileName)
        # 过滤目录和.DS_Store文件
        if fileName.to_s.end_with?(".h") || fileName.to_s.end_with?(".m")
            #h或m文件
            puts "添加#{fileName}"
            file_ref = aGroup.new_reference(fileName)
            aTarget.add_file_references([file_ref])
        elsif fileName.to_s.end_with?(".a")
            #.a库
            puts "添加#{fileName}"
            file_ref = aGroup.new_reference(fileName)
            aTarget.frameworks_build_phases.add_file_reference(file_ref)
        end
    end
end


#删除索引
def removeBuildPhaseFilesRecursively(aTarget, aGroup)
    aGroup.files.each do |file|
        
        if file.real_path.to_s.end_with?(".m", ".mm", ".cpp") then
            aTarget.source_build_phase.remove_file_reference(file)
            elsif file.real_path.to_s.end_with?(".bundle") then
            aTarget.resources_build_phase.remove_file_reference(file)
#            elsif file.real_path.to_s.end_with?(".a") then
#            aTarget.frameworks_build_phases.remove_file_reference(file)
        end
    end
    
    aGroup.groups.each do |group|
        removeBuildPhaseFilesRecursively(aTarget, group)
    end
end

#修改leitinglib/util/ConstantsUtil.h文件中宏定义 引入不同的客服工具,比如七鱼、智齿、AIHelp
text = File.read("leitinglib/util/ConstantsUtil.h")
replace = text.gsub("USE_ZHICHI_YES","USE_QIYU_YES")
replace = replace.gsub("USE_AIHELP_YES","USE_QIYU_YES")
File.open("leitinglib/util/ConstantsUtil.h", "w") {|file| file.puts replace}


#清除group文件
if !group.empty? then
    removeBuildPhaseFilesRecursively(target,group)
    group.clear()
end

#清楚Group文件夹下内容
if !group_AIHelp.empty? then
    removeBuildPhaseFilesRecursively(target,group_AIHelp)
    group_AIHelp.clear()
end

if !group_AIHelp_H_M.empty? then
    removeBuildPhaseFilesRecursively(target,group_AIHelp_H_M)
    group_AIHelp_H_M.clear()
end

if !group_zhichi.empty? then
    removeBuildPhaseFilesRecursively(target,group_zhichi)
    group_zhichi.clear()
end

if !group_zhichi_H_M.empty? then
    removeBuildPhaseFilesRecursively(target,group_zhichi_H_M)
    group_zhichi_H_M.clear()
end

if !group_QYAccessLayer.empty? then
    removeBuildPhaseFilesRecursively(target,group_QYAccessLayer)
    group_QYAccessLayer.clear()
end



##获取所有静态库文件引用
framework_ref_list = target.frameworks_build_phases.files_references
#puts "#{framework_ref_list} : xzw"

for file_ref_temp in framework_ref_list
    if file_ref_temp then
        if file_ref_temp.to_s.end_with?("ElvaChatServiceSDK.framework","MQTTFramework.framework","SobotKit.framework") then
            target.frameworks_build_phases.remove_file_reference(file_ref_temp)
        end
        elsif !file_ref_temp then
        target.frameworks_build_phases.remove_file_reference(file_ref_temp)
    end
end


#递归添加.h .m  .bundle

puts "七鱼开始..."

fileName = 'qiyuSDK'
filePath = File.join(group.real_path, fileName)
addFilesToGroup(target, group, filePath, fileName)

fileName_QYAccessLayer = 'QYSDK'
filePath_QYAccessLayer = File.join(group_QYAccessLayer.real_path, fileName_QYAccessLayer)
addFilesToGroup(target, group_QYAccessLayer, filePath_QYAccessLayer, fileName_QYAccessLayer)


puts "七鱼结束..."

#设置索引 FRAMEWORK_SEARCH_PATHS
target.build_configurations.each do |config|
    config.build_settings["LIBRARY_SEARCH_PATHS"] = ["$(inherited)","$(PROJECT_DIR)/leitinglib/framework/qiyuSDK"]
end


project.save

#!/usr/bin/env ruby
require 'xcodeproj'

#打开项目工程
puts("------------开始处理数据统计SDK------------")
#接收工程目录参数
project_path = ARGV.at(0)

#接收使用数据统计SDK参数 1:Adjust,2:Firebase,3:Kochava,4:Adjust&Firebase
dataType = ARGV.at(1)

project = Xcodeproj::Project.open(project_path+".xcodeproj")
target = project.targets.first

#找到要插入的group(参数中的true表示如果找不到group,就创建一个group)

group_Adjust = project.main_group.find_subpath('leitinglib/framework/AdjustSDK',true)
group_Adjust.set_source_tree('<group>')

group_Firebase = project.main_group.find_subpath('leitinglib/framework/FirebaseSDK',true)
group_Firebase.set_source_tree('<group>')

group_Kochava = project.main_group.find_subpath('leitinglib/framework/libKochavaTrackeriOSGK',true)
group_Kochava.set_source_tree('<group>')

group_Log = project.main_group.find_subpath('leitinglib/feature/Log',true)
group_Log.set_source_tree('<group>')


#递归添加索引
def addFilesToGroup(aTarget, aGroup, filePath, fileName)
    if File.directory? filePath
        # 当前文件为目录
        Dir.foreach(filePath) do |file|
            if file.to_s.end_with?(".bundle")
                #bundle文件属于目录,直接添加引用
                puts("添加"+file)
                file_ref = aGroup.new_reference(File.join(filePath, file))
                aTarget.add_resources([file_ref])
            elsif file !="." && file !=".."then
                subPath = File.join(filePath, file)
                
                if File.directory? subPath
                    if subPath.to_s.end_with?(".framework")
                        puts "添加#{subPath}"
                        file_ref = aGroup.new_reference(subPath)
                        aTarget.frameworks_build_phases.add_file_reference(file_ref)
                    else
                        #子文件也属于目录,添加新的group
                        newGroup = aGroup.find_subpath(file,true)
                        #递归添加索引
                        addFilesToGroup(aTarget, newGroup, subPath, fileName+"/"+file)
                    end
                else
                    #递归添加索引
                    addFilesToGroup(aTarget, aGroup, subPath, fileName+"/"+file )
                end
            end
        end
    else
    #puts("fileName=",fileName)
        # 过滤目录和.DS_Store文件
        if fileName.to_s.end_with?(".h") || fileName.to_s.end_with?(".m")
            #h或m文件
            puts("添加"+fileName)
            file_ref = aGroup.new_reference(fileName)
            aTarget.add_file_references([file_ref])
        elsif fileName.to_s.end_with?(".a")
            #.a库
            puts("添加"+fileName)
            file_ref = aGroup.new_reference(fileName)
            aTarget.frameworks_build_phases.add_file_reference(file_ref)
        end
    end
end


#删除索引
def removeBuildPhaseFilesRecursively(aTarget, aGroup)
    aGroup.files.each do |file|
        if file.real_path.to_s.end_with?(".m", ".mm", ".cpp") then
            aTarget.source_build_phase.remove_file_reference(file)
        elsif file.real_path.to_s.end_with?(".bundle") then
            aTarget.resources_build_phase.remove_file_reference(file)
        elsif file.real_path.to_s.end_with?(".a") then
            aTarget.frameworks_build_phases.remove_file_reference(file)
        end
    end
    
    aGroup.groups.each do |group|
        removeBuildPhaseFilesRecursively(aTarget, group)
    end
end


#修改leitinglib/util/ConstantsUtil.h文件中宏定义
puts("------------开始修改宏定义------------")
if dataType == "1"
    text = File.read(project_path+"/util/ConstantsUtil.h")
    replace = text.gsub("USE_FIREBASE","USE_ADJUST")
    replace = replace.gsub("USE_KOCHAVA","USE_ADJUST")
    replace = replace.gsub("USE_BOTH_ADJUST_FIREBASE","USE_ADJUST")
    puts("------------修改为使用USE_ADJUST------------")
elsif dataType == "2"
    text = File.read(project_path+"/util/ConstantsUtil.h")
    replace = text.gsub("USE_ADJUST","USE_FIREBASE")
    replace = replace.gsub("USE_KOCHAVA","USE_FIREBASE")
    replace = replace.gsub("USE_BOTH_ADJUST_FIREBASE","USE_FIREBASE")
    puts("------------修改为使用USE_FIREBASE------------")
elsif dataType == "3"
    text = File.read(project_path+"/util/ConstantsUtil.h")
    replace = text.gsub("USE_ADJUST","USE_KOCHAVA")
    replace = replace.gsub("USE_FIREBASE","USE_KOCHAVA")
    replace = replace.gsub("USE_BOTH_ADJUST_FIREBASE","USE_KOCHAVA")
    puts("------------修改为使用USE_KOCHAVA------------")
elsif dataType == "4"
    text = File.read(project_path+"/util/ConstantsUtil.h")
    replace = text.gsub("USE_ADJUST","USE_BOTH_ADJUST_FIREBASE")
    replace = replace.gsub("USE_FIREBASE","USE_BOTH_ADJUST_FIREBASE")
    replace = replace.gsub("USE_KOCHAVA","USE_BOTH_ADJUST_FIREBASE")
    puts("------------修改为使用USE_BOTH_ADJUST_FIREBASE------------")
end
File.open(project_path+"/util/ConstantsUtil.h", "w") {|file| file.puts replace}
puts("------------修改宏定义结束------------")



#清除Adjust库文件
if !group_Adjust.empty? then
    puts("------------开始删除Adjust库文件------------")
    removeBuildPhaseFilesRecursively(target,group_Adjust)
    group_Adjust.clear()
    puts("------------删除Adjust库文件结束------------")
end

#清除Firebase库文件
if !group_Firebase.empty? then
    puts("------------开始删除Firebase库文件------------")
    removeBuildPhaseFilesRecursively(target,group_Firebase)
    group_Firebase.clear()
    puts("------------删除Firebase库文件结束------------")
end

#清除Kochava库文件
if !group_Kochava.empty? then
    puts("------------开始删除Kochava库文件------------")
    removeBuildPhaseFilesRecursively(target,group_Kochava)
    group_Kochava.clear()
    puts("------------删除Kochava库文件结束------------")
end



#清除feature/Log文件夹下的AdjustManage文件
puts("------------开始删除feature/Log/AdjustManage文件------------")
adjust_h_ref = group_Log.find_file_by_path('AdjustManage.h')
adjust_m_ref = group_Log.find_file_by_path('AdjustManage.m')

target.source_build_phase.remove_file_reference([adjust_h_ref])
target.headers_build_phase.remove_file_reference([adjust_h_ref])

target.source_build_phase.remove_file_reference([adjust_m_ref])
target.headers_build_phase.remove_file_reference([adjust_m_ref])

if !adjust_h_ref.nil?
    adjust_h_ref.remove_from_project
end

if !adjust_m_ref.nil?
    adjust_m_ref.remove_from_project
end
puts("------------删除feature/Log/AdjustManage文件结束------------")


#清除feature/Log文件夹下的FirebaseMnage文件
puts("------------开始删除feature/Log/FirebaseMnage文件------------")
firebase_h_ref = group_Log.find_file_by_path('FirebaseManage.h')
firebase_m_ref = group_Log.find_file_by_path('FirebaseManage.m')

target.source_build_phase.remove_file_reference([firebase_h_ref])
target.headers_build_phase.remove_file_reference([firebase_h_ref])

target.source_build_phase.remove_file_reference([firebase_m_ref])
target.headers_build_phase.remove_file_reference([firebase_m_ref])

if !firebase_h_ref.nil?
    firebase_h_ref.remove_from_project
end

if !firebase_m_ref.nil?
    firebase_m_ref.remove_from_project
end
puts("------------删除feature/Log/FirebaseMnage文件结束------------")


#清除feature/Log文件夹下的KochavaManage文件
puts("------------开始删除feature/Log/KochavaManage文件------------")
kochava_h_ref = group_Log.find_file_by_path('KochavaManage.h')
kochava_m_ref = group_Log.find_file_by_path('KochavaManage.m')

target.source_build_phase.remove_file_reference([kochava_h_ref])
target.headers_build_phase.remove_file_reference([kochava_h_ref])

target.source_build_phase.remove_file_reference([kochava_m_ref])
target.headers_build_phase.remove_file_reference([kochava_m_ref])

if !kochava_h_ref.nil?
    kochava_h_ref.remove_from_project
end

if !kochava_m_ref.nil?
    kochava_m_ref.remove_from_project
end
puts("------------删除feature/Log/KochavaManage文件结束------------")



puts("------------开始删除build_phases中的引用------------")
##获取所有静态库文件引用
framework_ref_list = target.frameworks_build_phases.files_references
for file_ref_temp in framework_ref_list
    if file_ref_temp then
        if file_ref_temp.to_s.end_with?("AdjustSdk.framework","FIRAnalyticsConnector.framework","FirebaseABTesting.framework","FirebaseAnalytics.framework","FirebaseCore.framework","FirebaseCoreDiagnostics.framework","FirebaseInstanceID.framework","FirebaseMessaging.framework","FirebaseRemoteConfig.framework","GoogleAppMeasurement.framework","GoogleDataTransport.framework","GoogleDataTransportCCTSupport.framework","GoogleUtilities.framework","nanopb.framework","Protobuf.framework") then
            target.frameworks_build_phases.remove_file_reference(file_ref_temp)
        end
    elsif !file_ref_temp then
        target.frameworks_build_phases.remove_file_reference(file_ref_temp)
    end
end
puts("------------删除build_phases中的引用结束------------")


#递归添加.h .m  .bundle
if dataType == "1"
    puts "------------开始添加Adjust库和封装文件------------"
    fileName = 'AdjustSDK'
    filePath = File.join(group_Adjust.real_path, fileName)
    addFilesToGroup(target, group_Adjust, filePath, fileName)
    #添加AdjustManage文件
    adjust_h_ref = group_Log.new_reference('AdjustManage.h')
    adjust_m_ref = group_Log.new_reference('AdjustManage.m')

    target.add_file_references([adjust_h_ref])
    target.add_file_references([adjust_m_ref])
    puts "------------添加Adjust库和封装文件结束------------"
elsif dataType == "2"
      puts "------------开始添加Firebase库和封装文件------------"
      fileName = 'FirebaseSDK'
      filePath = File.join(group_Firebase.real_path, fileName)
      addFilesToGroup(target, group_Firebase, filePath, fileName)
      #添加FirebaseManage文件
      firebase_h_ref = group_Log.new_reference('FirebaseManage.h')
      firebase_m_ref = group_Log.new_reference('FirebaseManage.m')

      target.add_file_references([firebase_h_ref])
      target.add_file_references([firebase_m_ref])
      puts "------------添加Firebase库和封装文件结束------------"
elsif dataType == "3"
      puts "------------开始添加kochava------------"
      #递归添加 .bundle .framework
      fileName = 'libKochavaTrackeriOSGK'
      filePath = File.join(group_Kochava.real_path, fileName)
      addFilesToGroup(target, group_Kochava, filePath, fileName)
      
      #添加KochavaManage文件
      kochava_h_ref = group_Log.new_reference('KochavaManage.h')
      kochava_m_ref = group_Log.new_reference('KochavaManage.m')

      target.add_file_references([kochava_h_ref])
      target.add_file_references([kochava_m_ref])
      puts "------------添加kochava结束------------"
elsif dataType == "4"
       puts "------------开始添加USE_BOTH_ADJUST_FIREBASE库和封装文件------------"
       fileName = 'AdjustSDK'
       filePath = File.join(group_Adjust.real_path, fileName)
       addFilesToGroup(target, group_Adjust, filePath, fileName)
       #添加AdjustManage文件
       adjust_h_ref = group_Log.new_reference('AdjustManage.h')
       adjust_m_ref = group_Log.new_reference('AdjustManage.m')

       target.add_file_references([adjust_h_ref])
       target.add_file_references([adjust_m_ref])
      
      
       fileName1 = 'FirebaseSDK'
       filePath1 = File.join(group_Firebase.real_path, fileName1)
       addFilesToGroup(target, group_Firebase, filePath1, fileName1)
       #添加FirebaseManage文件
       firebase_h_ref = group_Log.new_reference('FirebaseManage.h')
       firebase_m_ref = group_Log.new_reference('FirebaseManage.m')

       target.add_file_references([firebase_h_ref])
       target.add_file_references([firebase_m_ref])
       puts "------------添加USE_BOTH_ADJUST_FIREBASE库和封装文件结束------------"
end

puts "------------开始设置路径------------"
#设置索引 FRAMEWORK_SEARCH_PATHS
if dataType == "1"
    target.build_configurations.each do |config|
        puts "FRAMEWORK_SEARCH_PATHS 添加 $(PROJECT_DIR)/leitinglib/framework/AdjustSDK"
        config.build_settings["FRAMEWORK_SEARCH_PATHS"] << "$(PROJECT_DIR)/leitinglib/framework/AdjustSDK"
        config.build_settings["FRAMEWORK_SEARCH_PATHS"].uniq!
    end
elsif dataType == "2"
    target.build_configurations.each do |config|
         puts "FRAMEWORK_SEARCH_PATHS 添加 $(PROJECT_DIR)/leitinglib/framework/FirebaseSDK"
         config.build_settings["FRAMEWORK_SEARCH_PATHS"] << "$(PROJECT_DIR)/leitinglib/framework/FirebaseSDK"
         config.build_settings["FRAMEWORK_SEARCH_PATHS"].uniq!
    end
elsif dataType == "3"
     target.build_configurations.each do |config|
        puts "LIBRARY_SEARCH_PATHS 添加 $(PROJECT_DIR)/leitinglib/framework/libKochavaTrackeriOSGK"
        config.build_settings["LIBRARY_SEARCH_PATHS"] << "$(PROJECT_DIR)/leitinglib/framework/libKochavaTrackeriOSGK"
        config.build_settings["LIBRARY_SEARCH_PATHS"].uniq!
    end
elsif dataType == "4"
      target.build_configurations.each do |config|
         puts "FRAMEWORK_SEARCH_PATHS 添加 $(PROJECT_DIR)/leitinglib/framework/AdjustSDK"
         config.build_settings["FRAMEWORK_SEARCH_PATHS"] << "$(PROJECT_DIR)/leitinglib/framework/AdjustSDK"
         puts "FRAMEWORK_SEARCH_PATHS 添加 $(PROJECT_DIR)/leitinglib/framework/FirebaseSDK"
         config.build_settings["FRAMEWORK_SEARCH_PATHS"] << "$(PROJECT_DIR)/leitinglib/framework/FirebaseSDK"
         config.build_settings["LIBRARY_SEARCH_PATHS"].uniq!
     end
end

puts "------------设置路径结束------------"

project.save

puts("------------处理数据统计SDK结束------------")

//
//  ViewController.m
//  SDKPackageProject
//
//  Created by zhengj on 2019/9/19.
//  Copyright © 2019 zhengj. All rights reserved.
//

#import "ViewController.h"
#import "Contants.h"

@interface ViewController()<NSComboBoxDataSource>

@property (nonatomic, strong) NSTextField *sdkPathText;         //SDK路径文本
@property (nonatomic, strong) NSButton *sdkPathButton;          //SDK路径选择按钮

@property (nonatomic, strong) NSTextField *frameText;           //文本框

@property (nonatomic, strong) NSTextField *typeText;            //sdk版本文本框
@property (nonatomic, strong) NSPopUpButton *typePopButton;     //sdk版本下拉选择框(国内、海外)

@property (nonatomic, strong) NSTextField *platformText;        //打包平台文本
@property (nonatomic, strong) NSPopUpButton *platformPopButton; //打包平台下拉选择框

@property (nonatomic, strong) NSTextField *customServiceText;   //客服工具文本(国内)
@property (nonatomic, strong) NSPopUpButton *popButton;         //客服工具下拉选择框(国内)

@property (nonatomic, strong) NSTextField *adServiceText;       //广告工具文本(国内)
@property (nonatomic, strong) NSPopUpButton *adPopButton;       //广告工具下拉选择框(国内)

@property (nonatomic, strong) NSTextField *rpsdkText;           //实人认证sdk文本(国内)
@property (nonatomic, strong) NSPopUpButton *rpPopButton;       //实人认证下拉选择框(国内)

@property (nonatomic, strong) NSTextField *dataText;            //数据统计sdk文本(海外)
@property (nonatomic, strong) NSPopUpButton *dataPopButton;     //数据统计下拉选择框(海外)

@property (nonatomic, strong) NSScrollView *outPutScrollView;   //结果输出ScrollView
@property (nonatomic, strong) NSTextView *outPutTextView;       //结果输出文本框

@property (nonatomic, strong) NSButton *packageButton;          //打包按钮
@property (nonatomic, strong) NSButton *cleanButton;            //清除输出记录
@property (nonatomic, strong) id observer;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.window.title = @"SDK打包工具";
    self.view.frame = NSMakeRect(0, 0, 900, 700);
    self.view.wantsLayer = YES;
    self.view.layer.backgroundColor = BACK_COLOR.CGColor;
    [self.view setNeedsDisplay:YES];
    
    [self.view addSubview:self.sdkPathButton];
    [self.view addSubview:self.sdkPathText];
    [self.view addSubview:self.frameText];
    [self.view addSubview:self.typeText];
    [self.view addSubview:self.typePopButton];
    [self.view addSubview:self.dataText];
    [self.view addSubview:self.dataPopButton];
    [self.view addSubview:self.platformText];
    [self.view addSubview:self.platformPopButton];
    
    //客服
    [self.view addSubview:self.customServiceText];
    [self.view addSubview:self.popButton];
    
    //广告
    [self.view addSubview:self.adServiceText];
    [self.view addSubview:self.adPopButton];
    
    [self.view addSubview:self.rpsdkText];
    [self.view addSubview:self.rpPopButton];
    [self.view addSubview:self.outPutScrollView];
    [self.view addSubview:self.packageButton];
    [self.view addSubview:self.cleanButton];
    
    [self.dataText setHidden:YES];
    [self.dataPopButton setHidden:YES];
    
    [self.platformText setHidden:YES];
    [self.platformPopButton setHidden:YES];
    [self.customServiceText setHidden:YES];
    [self.popButton setHidden:YES];
    [self.adServiceText setHidden:YES];
    [self.adPopButton setHidden:YES];
    [self.rpsdkText setHidden:YES];
    [self.rpPopButton setHidden:YES];
    
    //从本地获取上一次设置的sdk路径
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString *defaultPath = [userDefaults objectForKey:DEFAULT_PATH];
    if (defaultPath != nil) {
        self.sdkPathText.stringValue = defaultPath;
    }
}

//选择SDK路径
- (void)selectSDKPath {
    NSOpenPanel *panel = [NSOpenPanel openPanel];
    [panel setAllowsMultipleSelection:NO];
    [panel setCanChooseDirectories:YES];
    [panel setCanChooseFiles:YES];
    [panel setTitle:@"选择文件"];
    [panel setPrompt:@"确定"];
    
    //从本地获取配置路径,并设置为打开文件夹的路径
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    NSString *defaultPath = [userDefaults objectForKey:DEFAULT_PATH];
    if (defaultPath != nil) {
        [panel setDirectoryURL:[NSURL URLWithString:defaultPath]];
    }
    
    [panel beginSheetModalForWindow:[self.view window] completionHandler:^(NSModalResponse returnCode) {
        if (returnCode == 1) {
            //点击确定以后
            NSString *path = [panel.URLs.firstObject path];
            NSLog(@"sdk path : %@",path);
            self.sdkPathText.stringValue = path;
            [userDefaults setObject:path forKey:DEFAULT_PATH];
        }
    }];
}

//显示对应的选项
- (void)handlePopBtn:(NSPopUpButton *)popBtn {
    // 选中item 的索引
    NSLog(@"%ld", (long)popBtn.indexOfSelectedItem);
    popBtn.title = popBtn.selectedItem.title;
    
    //sdk版本选择
    if (popBtn.tag == 10001) {
        
        [self.platformText setHidden:NO];
        [self.platformPopButton setHidden:NO];
        
        //国内
        if (popBtn.indexOfSelectedItem == 1) {
           
            self.frameText.frame = NSMakeRect(26, 546, 844, 110);
            self.outPutScrollView.frame = NSMakeRect(30, 60, 840, 480);
            self.outPutTextView.frame = NSMakeRect(10, 0, 840, 480);
            
            //客服工具
            [self.customServiceText setHidden:NO];
            [self.popButton setHidden:NO];
            
            //广告工具
            [self.adServiceText setHidden:NO];
            [self.adPopButton setHidden:NO];
            
            
            //实人认证工具
            [self.rpsdkText setHidden:NO];
            [self.rpPopButton setHidden:NO];
            
            //隐藏数据统计
            [self.dataText setHidden:YES];
            [self.dataPopButton setHidden:YES];
            
            
            //支持平台,显示
            self.platformText.frame = NSMakeRect(500, 573, 120, 30);
            self.platformPopButton.frame = NSMakeRect(560, 580, 120, 30);
            
        }
        else {
            
            //国外
             self.frameText.frame = NSMakeRect(26, 576, 844, 80);
             self.outPutScrollView.frame = NSMakeRect(30, 60, 840, 500);
             self.outPutTextView.frame = NSMakeRect(10, 0, 840, 500);
            
            
            //隐藏客服工具
            [self.customServiceText setHidden:YES];
            [self.popButton setHidden:YES];
            
            
            //广告工具
            [self.adServiceText setHidden:YES];
            [self.adPopButton setHidden:YES];
            
            
            //隐藏人脸识别认证
            [self.rpsdkText setHidden:YES];
            [self.rpPopButton setHidden:YES];
            
            //显示数据统计
            [self.dataText setHidden:NO];
            [self.dataPopButton setHidden:NO];
            
            
            //支持平台,显示
            self.platformText.frame = NSMakeRect(250, 573, 120, 30);
            self.platformPopButton.frame = NSMakeRect(320, 580, 120, 30);
            
        }
    }
}

//开始打包
- (void)package {
    //检查sdk路径
    if (self.sdkPathText.stringValue.length == 0) {
        [self showPopover:self.packageButton withContens:@"请选择SDK路径"];
        return;
    }
    
    //检查SDK版本
    if (self.typePopButton.indexOfSelectedItem == -1) {
        [self showPopover:self.packageButton withContens:@"请选择SDK版本"];
        return;
    }
    
    //检查客服工具
    if (self.typePopButton.indexOfSelectedItem == 1 &&
        self.popButton.indexOfSelectedItem == -1) {
        [self showPopover:self.packageButton withContens:@"请选择客服工具"];
        return;
    }
    
    //检查广告工具
      if (self.adPopButton.indexOfSelectedItem == 1 &&
          self.adPopButton.indexOfSelectedItem == -1) {
          [self showPopover:self.packageButton withContens:@"请选择广告工具"];
          return;
      }
    
    //检查实人认证SDK
    if (self.typePopButton.indexOfSelectedItem == 1 &&
        self.rpPopButton.indexOfSelectedItem == -1) {
        [self showPopover:self.packageButton withContens:@"请选择实人认证工具"];
        return;
    }
    
    //检查数据统计SDK
    if (self.typePopButton.indexOfSelectedItem == 2 &&
        self.dataPopButton.indexOfSelectedItem == -1) {
        [self showPopover:self.packageButton withContens:@"请选择数据统计SDK"];
        return;
    }
    
    
    //检查数据统计SDK
    if (self.platformPopButton.indexOfSelectedItem == -1) {
        [self showPopover:self.packageButton withContens:@"请选择支持平台"];
        return;
    }
    
    self.outPutTextView.string = [self.outPutTextView.string stringByAppendingString:@"------------开始打包--------------"];
    
    if (self.typePopButton.indexOfSelectedItem == 1) {
        //国内sdk
        NSLog(@"------------当前为国内sdk------------");
        NSString *customFileName;
        if (self.popButton.indexOfSelectedItem == 1) {
            //使用七鱼
            customFileName = @"QiYu.rb";
        }
        else if (self.popButton.indexOfSelectedItem == 2) {
            //使用Aihelp
            customFileName = @"AIHelp.rb";
        }
        else if (self.popButton.indexOfSelectedItem == 3) {
            //使用Aihelp
            customFileName = @"ZhiChi.rb";
        }
        
        //客服工具配置命令
        NSString *cmd1 = [NSString stringWithFormat:@"cd %@;ruby %@ %@/leitinglib",[self getCurrentAppPath], customFileName, self.sdkPathText.stringValue];
        NSLog(@"执行客服工具配置命令 %@", cmd1);

        NSArray *arguments1 = [NSArray arrayWithObjects: @"-c",cmd1, nil];
        [self excuteCMD:arguments1];
        
        //是否使用实人认证SDK
        NSString *rpFileName = @"RPSDK.rb";
        NSString *isUse = @"0";
        if (self.rpPopButton.indexOfSelectedItem == 1) {
            //不使用
            isUse = @"0";
        }
        else if (self.rpPopButton.indexOfSelectedItem == 2) {
            //使用阿里实人认证sdk
            isUse = @"1";
        }
        
        //实人认证配置命令
        NSString *cmd2 = [NSString stringWithFormat:@"cd %@;ruby %@ %@/leitinglib %@",[self getCurrentAppPath], rpFileName, self.sdkPathText.stringValue, isUse];
        NSLog(@"执行实人认证配置命令 %@", cmd2);
        
        NSArray *arguments2 = [NSArray arrayWithObjects: @"-c",cmd2, nil];
        [self excuteCMD:arguments2];
        
        //是否使用广告工具
        NSString *adFileName;
        if (self.adPopButton.indexOfSelectedItem == 1) {
            //使用七鱼
            adFileName = @"remove_ads.rb";
            
        }else if (self.adPopButton.indexOfSelectedItem == 2) {
            //使用Aihelp
            adFileName = @"toutiao.rb";
        }
        else if (self.adPopButton.indexOfSelectedItem == 3) {
            //使用Aihelp
            adFileName = @"upltv.rb";
        }
            //客服工具配置命令
        NSString *cmd3 = [NSString stringWithFormat:@"cd %@;ruby %@ %@/leitinglib",[self getCurrentAppPath], adFileName, self.sdkPathText.stringValue];
        NSLog(@"执行广告工具配置命令 %@", cmd3);

        NSArray *arguments3 = [NSArray arrayWithObjects: @"-c",cmd3, nil];
        [self excuteCMD:arguments3];
        
    }
    else {
        //海外SDK
        NSLog(@"------------当前为海外sdk------------");
        
        //使用数据统计SDK(海外)
        NSString *dataFileName = @"DataSDK.rb";
        NSString *dataType = @"1";
        if (self.dataPopButton.indexOfSelectedItem == 1) {
            //使用Adjust
            dataType = @"1";
        }
        else if (self.dataPopButton.indexOfSelectedItem == 2) {
            //使用Firebase
            dataType = @"2";
        }
        else if (self.dataPopButton.indexOfSelectedItem == 3) {
            //使用kochava
            dataType = @"3";
        }
        else if (self.dataPopButton.indexOfSelectedItem == 4) {
           //使用Adjust&Firebase
           dataType = @"4";
        }
        
        NSString *cmd1 = [NSString stringWithFormat:@"cd %@;ruby %@ %@/leitinglib %@",[self getCurrentAppPath], dataFileName, self.sdkPathText.stringValue, dataType];
        NSLog(@"执行数据统计SDK配置命令 %@", cmd1);
        
        NSArray *arguments1 = [NSArray arrayWithObjects: @"-c",cmd1, nil];
        [self excuteCMD:arguments1];
        
    }
    
    //打包命令
    NSString *pcmd = [NSString stringWithFormat:@"cd %@;./Script.sh %@/leitinglib.xcodeproj",[self getCurrentAppPath], self.sdkPathText.stringValue];
    NSLog(@"执行打包命令 %@", pcmd);
    
    NSArray *arguments = [NSArray arrayWithObjects: @"-c",pcmd, nil];
    [self excuteCMD:arguments];
}

//执行命令
- (void)excuteCMD:(NSArray *)arguments {
    //初始化并配置task
    NSTask *task;
    task = [[NSTask alloc] init];
    [task setLaunchPath: @"/bin/bash"];
    
    [task setArguments: arguments];
    
    //设置标准输出管道
    NSPipe *pipe;
    pipe = [NSPipe pipe];
    [task setStandardOutput: pipe];
    
    //task结束回调
    [task setTerminationHandler: ^(NSTask *t) {
        //移除通知
        [[NSNotificationCenter defaultCenter] removeObserver:self.observer name:NSFileHandleDataAvailableNotification object:[pipe fileHandleForReading]];
    }];
    
    //在后台线程等待数据和通
    [[pipe fileHandleForReading] waitForDataInBackgroundAndNotify];
    
    //接受到通知消息
    self.observer = [[NSNotificationCenter defaultCenter] addObserverForName:NSFileHandleDataAvailableNotification object:[pipe fileHandleForReading] queue:nil usingBlock:^(NSNotification * _Nonnull note) {
        //获取管道数据 转为字符串
        NSData *outputData = pipe.fileHandleForReading.availableData;
        NSString *string = [[NSString alloc] initWithData: outputData encoding: NSUTF8StringEncoding];
        if (string.length > 0) {
            NSLog(@"got\n%@", string);
            //在主线程处理UI
            dispatch_async(dispatch_get_main_queue(), ^{
                self.outPutTextView.string = [self.outPutTextView.string stringByAppendingString:[NSString stringWithFormat:@"\n%@",string]];
                [self.outPutTextView scrollToEndOfDocument:self];
            });
        }
        
        //继续等待新数据和通知
        [[pipe fileHandleForReading] waitForDataInBackgroundAndNotify];
    }];
    
    [task launch];
    [task waitUntilExit];
}

- (void)cleanOutput {
    self.outPutTextView.string = @"";
}

//SDK路径选择按钮
- (NSButton *)sdkPathButton {
    if (!_sdkPathButton) {
        _sdkPathButton = [[NSButton alloc] initWithFrame:NSMakeRect(30, 660, 90, 30)];
        [_sdkPathButton setBezelStyle:NSBezelStyleRoundRect];
        _sdkPathButton.layer.masksToBounds = YES;
        [_sdkPathButton setBordered:YES];
        [_sdkPathButton.layer setCornerRadius:16];
        [_sdkPathButton setTitle:@"选择SDK路径"];
        [_sdkPathButton setTarget:self];
        [_sdkPathButton setAction:@selector(selectSDKPath)];
    }
    return _sdkPathButton;
}

//SDK路径文本
- (NSTextField *)sdkPathText {
    if (!_sdkPathText) {
        _sdkPathText = [[NSTextField alloc] initWithFrame:NSMakeRect(130, 654, 580, 30)];
        _sdkPathText.backgroundColor = [NSColor clearColor];
        _sdkPathText.textColor = [NSColor blackColor];
        _sdkPathText.stringValue = @"";
        [_sdkPathText setBordered:NO];
        [_sdkPathText setEditable:NO];
    }
    return _sdkPathText;
}

//文本框
-(NSTextField *)frameText {
    if (!_frameText) {
        _frameText = [[NSTextField alloc] initWithFrame:NSMakeRect(26, 606, 844, 50)];
        _frameText.backgroundColor = [NSColor clearColor];
        _frameText.textColor = [NSColor blackColor];
        _frameText.stringValue = @"";
        [_frameText setBordered:YES];
        [_frameText setEditable:NO];
        _frameText.wantsLayer = YES;//必须设置,不然背景颜色显示不了
        _frameText.layer.cornerRadius = 5;
    }
    
    return _frameText;
}

//sdk版本文本框
- (NSTextField *)typeText {
    if (!_typeText) {
        _typeText = [[NSTextField alloc] initWithFrame:NSMakeRect(30, 613, 120, 30)];
        _typeText.backgroundColor = [NSColor clearColor];
        _typeText.font = [NSFont systemFontOfSize:12];
        _typeText.textColor = [NSColor blackColor];
        _typeText.stringValue = @"SDK版本:";
        [_typeText setBordered:NO];
        [_typeText setEditable:NO];
    }
    return _typeText;
}

//sdk版本下拉选择框
- (NSPopUpButton *)typePopButton {
    if (!_typePopButton) {
        _typePopButton = [[NSPopUpButton alloc] initWithFrame:CGRectMake(90, 620, 120, 30) pullsDown:YES];
        [_typePopButton addItemWithTitle:@"请选择"];
        [_typePopButton setTag:10001];
        [_typePopButton addItemWithTitle:@"国内"];
        [_typePopButton addItemWithTitle:@"海外"];
        [_typePopButton setTarget:self];
        [_typePopButton setAction:@selector(handlePopBtn:)];
    }
    return _typePopButton;
}

//客服工具文本
- (NSTextField *)dataText {
    if (!_dataText) {
        _dataText = [[NSTextField alloc] initWithFrame:NSMakeRect(30, 573, 120, 30)];
        _dataText.backgroundColor = [NSColor clearColor];
        _dataText.font = [NSFont systemFontOfSize:12];
        _dataText.textColor = [NSColor blackColor];
        _dataText.stringValue = @"数据统计:";
        [_dataText setBordered:NO];
        [_dataText setEditable:NO];
    }
    return _dataText;
}

//客服工具选择框
- (NSPopUpButton *)dataPopButton {
    
    if (!_dataPopButton) {
        _dataPopButton = [[NSPopUpButton alloc] initWithFrame:CGRectMake(90, 580, 120, 30) pullsDown:YES];
        [_dataPopButton addItemWithTitle:@"请选择"];
        [_dataPopButton addItemWithTitle:@"Adjust"];
        [_dataPopButton addItemWithTitle:@"Firebase"];
        [_dataPopButton addItemWithTitle:@"Kochava"];
        [_dataPopButton addItemWithTitle:@"Adjust&Firebase"];
        [_dataPopButton setTarget:self];
        [_dataPopButton setAction:@selector(handlePopBtn:)];
    }
    return _dataPopButton;
}


//客服工具文本
- (NSTextField *)customServiceText {
    if (!_customServiceText) {
        _customServiceText = [[NSTextField alloc] initWithFrame:NSMakeRect(30, 573, 120, 30)];
        _customServiceText.backgroundColor = [NSColor clearColor];
        _customServiceText.font = [NSFont systemFontOfSize:12];
        _customServiceText.textColor = [NSColor blackColor];
        _customServiceText.stringValue = @"客服工具:";
        [_customServiceText setBordered:NO];
        [_customServiceText setEditable:NO];
    }
    return _customServiceText;
}

//客服工具选择框
- (NSPopUpButton *)popButton {
    if (!_popButton) {
        _popButton = [[NSPopUpButton alloc] initWithFrame:CGRectMake(90, 580, 120, 30) pullsDown:YES];
        [_popButton addItemWithTitle:@"请选择"];
        [_popButton addItemWithTitle:@"七鱼"];
        [_popButton addItemWithTitle:@"Aihelp"];
        [_popButton addItemWithTitle:@"智齿"];
        [_popButton setTarget:self];
        [_popButton setAction:@selector(handlePopBtn:)];
    }
    return _popButton;
}

//广告工具文本
- (NSTextField *)adServiceText {
    if (!_adServiceText) {
        _adServiceText = [[NSTextField alloc] initWithFrame:NSMakeRect(30, 543, 120, 30)];
        _adServiceText.backgroundColor = [NSColor clearColor];
        _adServiceText.font = [NSFont systemFontOfSize:12];
        _adServiceText.textColor = [NSColor blackColor];
        _adServiceText.stringValue = @"广告工具:";
        [_adServiceText setBordered:NO];
        [_adServiceText setEditable:NO];
    }
    return _adServiceText;
}

//广告工具选择框
- (NSPopUpButton *)adPopButton {
    if (!_adPopButton) {
        _adPopButton = [[NSPopUpButton alloc] initWithFrame:CGRectMake(90, 550, 120, 30) pullsDown:YES];
        [_adPopButton addItemWithTitle:@"请选择"];
        [_adPopButton addItemWithTitle:@"不使用"];
        [_adPopButton addItemWithTitle:@"穿山甲"];
        [_adPopButton addItemWithTitle:@"upltv"];
        [_adPopButton setTarget:self];
        [_adPopButton setAction:@selector(handlePopBtn:)];
    }
    return _adPopButton;
}

//实人认证sdk文本
- (NSTextField *)rpsdkText {
    if (!_rpsdkText) {
        _rpsdkText = [[NSTextField alloc] initWithFrame:NSMakeRect(230, 573, 120, 30)];
        _rpsdkText.backgroundColor = [NSColor clearColor];
        _rpsdkText.font = [NSFont systemFontOfSize:12];
        _rpsdkText.textColor = [NSColor blackColor];
        _rpsdkText.stringValue = @"实人认证工具:";
        [_rpsdkText setBordered:NO];
        [_rpsdkText setEditable:NO];
    }
    return _rpsdkText;
}

//实人认证下拉选择框
- (NSPopUpButton *)rpPopButton {
    if (!_rpPopButton) {
        _rpPopButton = [[NSPopUpButton alloc] initWithFrame:CGRectMake(315, 580, 150, 30) pullsDown:YES];
        [_rpPopButton addItemWithTitle:@"请选择"];
        [_rpPopButton addItemWithTitle:@"不使用"];
        [_rpPopButton addItemWithTitle:@"阿里实人认证SDK"];
        [_rpPopButton setTarget:self];
        [_rpPopButton setAction:@selector(handlePopBtn:)];
    }
    return _rpPopButton;
}

//打包平台文本
- (NSTextField *)platformText {
    if (!_platformText) {
        _platformText = [[NSTextField alloc] initWithFrame:NSMakeRect(500, 573, 120, 30)];
        _platformText.backgroundColor = [NSColor clearColor];
        _platformText.font = [NSFont systemFontOfSize:12];
        _platformText.textColor = [NSColor blackColor];
        _platformText.stringValue = @"支持平台:";
        [_platformText setBordered:NO];
        [_platformText setEditable:NO];
    }
    return _platformText;
}

//打包平台拉选择框
- (NSPopUpButton *)platformPopButton {
    if (!_platformPopButton) {
        _platformPopButton = [[NSPopUpButton alloc] initWithFrame:CGRectMake(560, 580, 120, 30) pullsDown:YES];
        [_platformPopButton addItemWithTitle:@"请选择"];
        [_platformPopButton addItemWithTitle:@"真机"];
        [_platformPopButton addItemWithTitle:@"模拟器"];
        [_platformPopButton addItemWithTitle:@"合并"];
        [_platformPopButton setTarget:self];
        [_platformPopButton setAction:@selector(handlePopBtn:)];
    }
    return _platformPopButton;
}

//结果输出ScrollView
- (NSScrollView *)outPutScrollView {
    if (!_outPutScrollView) {
        _outPutScrollView = [[NSScrollView alloc] initWithFrame:NSMakeRect(30, 60, 840, 500)];
        _outPutScrollView.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua];
        _outPutScrollView.backgroundColor = OUTPUT_BACK_COLOR;
        [_outPutScrollView setHasVerticalScroller:YES];
        [_outPutScrollView setHasHorizontalScroller:NO];
        [_outPutScrollView setBorderType:NSLineBorder];
        
        //结果输出文本框
        _outPutTextView = [[NSTextView alloc] initWithFrame:NSMakeRect(10, 0, 840, 500)];
        _outPutTextView.backgroundColor = OUTPUT_BACK_COLOR;
        _outPutTextView.textColor = OUTPUT_TEXT_COLOR;
        _outPutTextView.font = [NSFont systemFontOfSize:13];
        _outPutTextView.allowsUndo = YES;
        _outPutTextView.richText = YES;
        _outPutTextView.editable = NO;
        _outPutTextView.automaticQuoteSubstitutionEnabled = NO;
        [_outPutTextView setVerticallyResizable:YES];
        [_outPutTextView setHorizontallyResizable:NO];
        [_outPutTextView setAutoresizingMask:NSViewWidthSizable];
        [_outPutScrollView setDocumentView:_outPutTextView];
    }
    
    return _outPutScrollView;
}

//打包按钮
- (NSButton *)packageButton {
    if (!_packageButton) {
        _packageButton = [[NSButton alloc] initWithFrame:NSMakeRect(30, 10, 80, 30)];
        [_packageButton setBezelStyle:NSBezelStyleRoundRect];
        _packageButton.layer.masksToBounds = YES;
        [_packageButton setBordered:YES];
        [_packageButton.layer setCornerRadius:16];
        [_packageButton setTitle:@"开始打包"];
        [_packageButton setTarget:self];
        [_packageButton setAction:@selector(package)];
        
    }
    
    return _packageButton;
}

//清除输出记录
- (NSButton *)cleanButton {
    if (!_cleanButton) {
        _cleanButton = [[NSButton alloc] initWithFrame:NSMakeRect(120, 10, 80, 30)];
        [_cleanButton setBezelStyle:NSBezelStyleRoundRect];
        _cleanButton.layer.masksToBounds = YES;
        [_cleanButton setBordered:YES];
        [_cleanButton.layer setCornerRadius:16];
        [_cleanButton setTitle:@"清除记录"];
        [_cleanButton setTarget:self];
        [_cleanButton setAction:@selector(cleanOutput)];
        
    }
    
    return _cleanButton;
}

//获取应用的资源路径
-(NSString *) getCurrentAppPath
{
    NSString* path = @"";
    NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
    NSRange range = [bundlePath rangeOfString:@"/" options:NSBackwardsSearch];

    if (range.location != NSNotFound)
    {
        path = [bundlePath substringToIndex:range.location];
        path = [path stringByAppendingFormat:@"%@",@"/SDKPackageProject.app/Contents/Resources"];
    }
    
    return path;
}



/*
 显示提示框
 
 @param button 点击按钮
 @param contents 提示内容
 
 */
- (void) showPopover:(NSButton *)button withContens:(NSString *)contents {
    NSViewController* vc = [[NSStoryboard storyboardWithName:@"Main" bundle:nil] instantiateControllerWithIdentifier:@"Popover"];
    NSTextField *textField = (NSTextField *)[vc.view viewWithTag:0];
    textField.stringValue = contents;
    
    NSPopover *popover = [[NSPopover alloc] init];
    popover.contentViewController = vc;
    popover.behavior = NSPopoverBehaviorTransient;  //自动关闭popover
    
    [popover showRelativeToRect:button.bounds ofView:button preferredEdge:NSRectEdgeMinY];
}


- (void)setRepresentedObject:(id)representedObject {
    [super setRepresentedObject:representedObject];

    // Update the view, if already loaded.
}


@end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容