創(chuàng)建自己的sdk(含編譯腳本)


/*一膝晾、創(chuàng)建.a庫*/
1.創(chuàng)建靜態(tài)庫工程 > 刪除自動(dòng)創(chuàng)建的.m實(shí)現(xiàn)文件及頭文件里的信息 > 導(dǎo)入可能用到的系統(tǒng)庫
2.目標(biāo)工程 > Build Phases > Editor > add build Phases(是否公開頭文件選項(xiàng)) > 設(shè)置公開訪問的頭文件(或在Target Membership中直接設(shè)置)
或
  目標(biāo)工程 > Build Phases > 點(diǎn)擊左側(cè)加號(hào) > add build Phases(是否公開頭文件選項(xiàng)) > 設(shè)置公開訪問的頭文件(或在Target Membership中直接設(shè)置)

3.將公開頭文件導(dǎo)入到總的公用頭文件中
4.選擇sdk支持的系統(tǒng)版本
5.參數(shù)配置
  Build Settings > Dead Code Stripping設(shè)置為NO
  Build Settings > Strip Debug Symbol During Copy 全部設(shè)置為NO
  Build Settings > Strip Style設(shè)置為Non-Global Symbols
  Build Settings > Base SDK > Latest iOS(iOS 選擇最新的)
6.設(shè)備 和 模擬器 下分別按下command + B進(jìn)行編譯, 編譯成功后 > 在Product目錄下 Show in Finder 查看
7.debug模式下運(yùn)行生成  Debug-iphoneos Debug-iphonesimulator兩個(gè)文件夾
  release模式下運(yùn)行生成 Release-iphoneos Release-iphonesimulator文件夾
  區(qū)別
  Debug和Release赖歌,在我看來主要是針對(duì)其面向的目標(biāo)不同的而進(jìn)行區(qū)分的。
  Debug通常稱為調(diào)試版本,通過一系列編譯選項(xiàng)的配合西轩,編譯的結(jié)果通常包含調(diào)試信息,而且不做任何優(yōu)化接奈,以為開發(fā)人員提供強(qiáng)大的應(yīng)用程序調(diào)試能力师骗。
  Release通常稱為發(fā)布版本,是為用戶使用的妇智,一般客戶不允許在發(fā)布版本上進(jìn)行調(diào)試滥玷。所以不保存調(diào)試信息,同時(shí)巍棱,它往往進(jìn)行了各種優(yōu)化惑畴,以期達(dá)到代碼最小和速度最優(yōu)。為用戶的使用提供便利
8.為了能在真機(jī)和模擬器上都能運(yùn)行需要使用終端合并
  cd到你想要保存合并后文件的目錄下
  合并 lipo -create 模擬器.a(路徑) 真機(jī).a(路徑) -output 重命名.a
9.使用時(shí)航徙,直接導(dǎo)入usr下的頭文件和合并的.a文件
10.查看架構(gòu)模式 lipo -info XXX.a  i386 armv7 x86_64 arm64(下面有介紹)

arm7: 在最老的支持iOS7的設(shè)備上使用
arm7s: 在iPhone5和5C上使用
arm64: 運(yùn)行于iPhone5S的64位 ARM 處理器 上
i386: 32位模擬器上使用
x86_64: 64為模擬器上使用
注意:向下兼容如贷,arm7版本可以做arm7s上運(yùn)行
需要在對(duì)應(yīng)架構(gòu)設(shè)備上運(yùn)行,才能生成對(duì)應(yīng)架構(gòu)的包

11.建立工程驗(yàn)證
12.如果架構(gòu)報(bào)錯(cuò)  Build Settings > BuildActiveArchitecture Only Debug改為NO

/*二到踏、創(chuàng)建.framework庫*/

 Framework是資源的集合杠袱,將靜態(tài)庫和其頭文件包含到一個(gè)結(jié)構(gòu)中,讓Xcode可以方便地把它納入到你的項(xiàng)目中窝稿。本質(zhì)也是一個(gè)bundle文件

//(1)使用bundle文件創(chuàng)建framework框架

    1.創(chuàng)建一個(gè)Bundle工程

    2.目標(biāo)工程 > Build Phases > Editor > add build Phases(是否公開頭文件選項(xiàng)) > 設(shè)置公開訪問的頭文件(或在Target Membership中直接設(shè)置)
    或
      目標(biāo)工程 > Build Phases > 點(diǎn)擊左側(cè)加號(hào) > add build Phases(是否公開頭文件選項(xiàng)) > 設(shè)置公開訪問的頭文件(或在Target Membership中直接設(shè)置)
    3.創(chuàng)建一個(gè)總的公共頭文件 > 導(dǎo)入需要編譯成庫的文件 > 設(shè)置公開頭文件 > 將公開頭文件導(dǎo)入總的頭文件中

    4.選擇framework支持的系統(tǒng)版本

    5.配置參數(shù)更改
      Build Settings > public header >  /usr/$(PROJECT_NAME) (公共頭文件在工程目錄下)
      Build Settings > Dead Code Stripping設(shè)置為NO
      Build Settings > Strip Debug Symbol During Copy 全部設(shè)置為NO
      Build Settings > Strip Style設(shè)置為Non-Global Symbols
      Build Settings > Base SDK > Latest iOS(iOS 選擇最新的)
      Build Settings >  Link With Standard Libraries = NO
      Build Settings > Packaging > Wrapper Extension = framework.
      Build Settings >  Mach-O Type(frame 分靜態(tài)庫和動(dòng)態(tài)庫) = Static Library
      對(duì)于Mach-O Type可能有兩種情況:(1)選擇 Static Library 打出來的是靜態(tài)庫;(2)選擇 Relocatable Object File 打出來是動(dòng)態(tài)庫楣富。
      點(diǎn)擊plist文件 > Bundle OS Type code改為FMWK

    6.為了方便找到運(yùn)行后生成的framework,我們提前在項(xiàng)目目錄下創(chuàng)建一個(gè)目錄 build讹躯,用來存放運(yùn)行后生成的文件菩彬;
      Build Settings > Per-configuration Build Products Path = $(SRCROOT)/build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

    7、模擬器和真機(jī)分別編譯 > 合并

    8.合并的是framework下的二進(jìn)制文件
      cd到你想要保存合并后文件的目錄下
      合并命令 lipo -create xxx.framework/xxx ooo.framework/ooo -output ooo潮梯。

    9.將合并成功的二進(jìn)制文件替換為framework中的二進(jìn)制文件骗灶,如果沒有用到info.plist文件,可以刪除秉馏,避免在工程中發(fā)生沖突

    10.驗(yàn)證 查看架構(gòu)模式 lipo -info XXX.a

//(2)直接創(chuàng)建framework庫

    1耙旦、使用xcode直接創(chuàng)建frame工程

    2、把需要編譯的庫導(dǎo)入到工程中

    3萝究、設(shè)置需要公開的頭文件
       Build Phases > Headers > 把文件拖動(dòng)到指定位置(或在Target Membership選擇)公開還是私有(Project為真正私有)

    4.選擇framework支持的系統(tǒng)版本

    5免都、配置參數(shù)
      Build Settings > public header >  /usr/$(PROJECT_NAME) (公共頭文件在工程目錄下)
      Build Settings > Dead Code Stripping設(shè)置為NO
      Build Settings > Strip Debug Symbol During Copy 全部設(shè)置為NO
      Build Settings > Strip Style設(shè)置為Non-Global Symbols
      Build Settings > Base SDK > Latest iOS(iOS 選擇最新的)
      Build Settings >  Link With Standard Libraries = NO
      Build Settings >  Mach-O Type(frame 分靜態(tài)庫和動(dòng)態(tài)庫) = Static Library
      對(duì)于Mach-O Type可能有兩種情況:(1)選擇 Static Library 打出來的是靜態(tài)庫;(2)選擇 Relocatable Object File 打出來是動(dòng)態(tài)庫。

    6.為了方便找到運(yùn)行后生成的framework帆竹,我們提前在項(xiàng)目目錄下創(chuàng)建一個(gè)目錄 build绕娘,用來存放運(yùn)行后生成的文件
      Build Settings > Per-configuration Build Products Path = $(SRCROOT)/build/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

    7、模擬器和真機(jī)分別編譯 > 合并

    8.合并的是framework下的二進(jìn)制文件
      cd到你想要保存合并后文件的目錄下
      合并命令 lipo -create xxx.framework/xxx ooo.framework/ooo -output ooo栽连。

    9.將合并成功的二進(jìn)制文件替換為framework中的二進(jìn)制文件险领,如果沒有用到info.plist文件,可以刪除秒紧,避免在工程中發(fā)生沖突

    10.驗(yàn)證

//(3)直接在工程中創(chuàng)建framework庫

    1.點(diǎn)擊目標(biāo)工程 > 點(diǎn)擊下面左下角加號(hào) > 創(chuàng)建framework

    2.參數(shù)配置和合并流程同上(直接創(chuàng)建framework)

    區(qū)別
    為避免原工程編譯錯(cuò)誤
    點(diǎn)擊工程的目標(biāo)文件 General > Embedded Binaries > 刪除你創(chuàng)建的framework

/*注意事項(xiàng)*/
category的處理
category是項(xiàng)目開發(fā)中經(jīng)常用到的绢陌,把category打包成靜態(tài)庫是沒有問題的,但是在使用這個(gè)靜態(tài)庫時(shí)熔恢,
調(diào)用category中的方法時(shí)會(huì)發(fā)生找不到該方法的運(yùn)行時(shí)錯(cuò)誤(selector not recognized)脐湾,
解決的辦法是在使用靜態(tài)庫的工程中配置other linker flags的值為 -ObjC  -all_load

對(duì)圖片資源和UI界面xib或nib文件的處理
.a和.framework兩種靜態(tài)庫,通常都是把需要用的到圖片或者xib文件存放在一個(gè)bundle文件中叙淌,而該bundle文件的名字和.a或.framework的名字相同秤掌。
.a文件中無法存放圖片或xib文件,很容易理解鹰霍,但是.framework從本質(zhì)上說也是一個(gè)bundle文件机杜,為什么不把圖片或者xib文件直接放在.framework中而單獨(dú)再創(chuàng)建個(gè)bundle文件呢?
那是因?yàn)閕OS系統(tǒng)不會(huì)去掃描.framework下的圖片等資源文件衅谷,也不會(huì)在項(xiàng)目中顯示椒拗,也就是說即使放在 .framework目錄下,系統(tǒng)根本就不會(huì)去掃描获黔,因此也無法發(fā)現(xiàn)使用蚀苛。

/*開發(fā)UI控件庫*/
在無法看到真實(shí)效果的情況下為iOS開發(fā)一個(gè)UI控件庫是極其困難的
1.創(chuàng)建庫工程,流程同上(第一節(jié)創(chuàng)建.a工程)也可創(chuàng)建framework (存在圖片放入bundel中)
2.創(chuàng)建依賴庫工程
3.關(guān)閉庫工程
4.添加依賴庫玷氏,將你的庫工程xxxx.xcodeproj從Finder中拖到Xcode中依賴工程組下堵未。
/*注意*/
你無法將同一工程在兩個(gè)Xcode窗口中同時(shí)打開,如果你發(fā)現(xiàn)你無法在你的工程中導(dǎo)航到庫工程的話盏触,檢查一下是否庫工程在其他Xcode窗口中打開了渗蟹。
5.連接到靜態(tài)庫
  Build Phases > Link Binary With Libraries > 點(diǎn)擊 “+” > Workspace組中選你的.a > 點(diǎn)擊add
  Build Phases > Target Dependencies > 選擇你的庫
6.導(dǎo)入庫的頭文件(頭文件路徑)編譯庫块饺,編譯依賴工程
7.報(bào)錯(cuò)問題解決
  ①刪除添加的庫,重新編譯后導(dǎo)入
  ②確保編譯路徑相同
    Build Settings > Per-configuration Build Products Path >
    $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)

像這樣使用嵌套工程的好處是你可以對(duì)庫本身做出修改雌芽,而不用離開示例工程授艰,即使你同時(shí)改變兩個(gè)地方的代碼也一樣。每次你編譯工程世落,你都要檢查是否將頭文件的public/project關(guān)系設(shè)置正確淮腾。如果實(shí)例工程中缺失了任何需要的頭文件,它都不能被編譯屉佳。

/*在xcode中直接使用腳本生成framework*/
靜態(tài)庫構(gòu)建過程中添加腳本來創(chuàng)建文件結(jié)構(gòu)
1.打開靜態(tài)庫工程 > Build Phases > 左側(cè) “+” 按鈕 > New Run Script Phases
  這一步在build phases部分添加了一個(gè)新的面板谷朝,這允許你在構(gòu)建時(shí)運(yùn)行一個(gè)Bash腳本。你希望讓腳本在build的過程中何時(shí)執(zhí)行武花,就把這個(gè)面板拖動(dòng)到列表中相對(duì)應(yīng)的那一位置圆凰。對(duì)于該framework工程來說,腳本最后執(zhí)行体箕,因此你可以讓它保留在默認(rèn)的位置即可送朱。
2.雙擊面板標(biāo)題欄Run Script,重命名為Build Framework干旁。

根據(jù)frame文件結(jié)構(gòu)構(gòu)件Framework驶沼,此時(shí)不包含二進(jìn)制文件
#set –e確保腳本的任何地方執(zhí)行失敗,則整個(gè)腳本都執(zhí)行失敗争群。
set -e

#導(dǎo)出的文件路徑
export FRAMEWORK_LOCN="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework"

# 創(chuàng)建真是文件路徑
mkdir -p "${FRAMEWORK_LOCN}/Headers"

# 拷貝公共頭文件到framework中
/bin/cp -a "${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/" \
"${FRAMEWORK_LOCN}/Headers"

3.多架構(gòu)(Multi-Architecture)編譯

  ①點(diǎn)擊目標(biāo)工程 > 添加新目標(biāo) > Cross-Platform > Aggregate > next > 命名為Framework

  為什么使用集合(Aggregate)目標(biāo)來創(chuàng)建一個(gè)framework呢回怜?為什么這么不直接?因?yàn)镺S X對(duì)庫的支持更好一些换薄,事實(shí)上玉雾,Xcode直接為每一個(gè)OS X工程提供一個(gè)Cocoa Framework編譯目標(biāo)∏嵋基于此复旬,你將使用集合編譯目標(biāo),作為Bash腳本的連接串來創(chuàng)建神奇的framework目錄結(jié)構(gòu)冲泥。
  你是不是開始覺得這里的方法有些愚蠢了驹碍?

  為了確保每當(dāng)這個(gè)新的framework目標(biāo)被創(chuàng)建時(shí),靜態(tài)鏈接庫都會(huì)被編譯凡恍,你需要往靜態(tài)庫目標(biāo)中添加依賴
  ②選擇Framework目標(biāo) > Build Phases > Target Dependencies > 點(diǎn)擊 + > 加入你的庫
  在庫工程中選擇Framework目標(biāo)志秃,在Build Phases中添加一個(gè)依賴。展開Target Dependencies面板嚼酝,點(diǎn)擊 + 按鈕選擇RWUIControls靜態(tài)庫浮还。

  ③選擇Framework目標(biāo) > Build Phases > 左側(cè) “+” 按鈕 > New Run Script Phases > 命名MultiPlatform Build

  ④寫入編譯文件
    #set –e確保腳本的任何地方執(zhí)行失敗,則整個(gè)腳本都執(zhí)行失敗闽巩。
    set -e

    #標(biāo)示 如果已經(jīng)插入腳本 退出
    if [ -n "$IYQ_MULTIPLATFORM_BUILD_IN_PROGRESS" ]; then
    exit 0
    fi
    export IYQ_MULTIPLATFORM_BUILD_IN_PROGRESS=1

    # 自定義變量
    IYQ_FRAMEWORK_NAME=${PROJECT_NAME}
    IYQ_INPUT_STATIC_LIB="lib${PROJECT_NAME}.a"
    IYQ_FRAMEWORK_LOCATION="${BUILT_PRODUCTS_DIR}/${IYQ_FRAMEWORK_NAME}.framework"

    #構(gòu)建靜態(tài)庫 傳參 "${1}"
    function build_static_library {
    # 重新構(gòu)建庫
        xcrun xcodebuild -project "${PROJECT_FILE_PATH}" \
        -target "${TARGET_NAME}" \
        -configuration "${CONFIGURATION}" \
        -sdk "${1}" \
        ONLY_ACTIVE_ARCH=NO \
        BUILD_DIR="${BUILD_DIR}" \
        OBJROOT="${OBJROOT}" \
        BUILD_ROOT="${BUILD_ROOT}" \
        SYMROOT="${SYMROOT}" $ACTION
    }

    #合并
    function make_fat_library {

        xcrun lipo -create "${1}" "${2}" -output "${3}"
    }

    # 1 正則判斷 真機(jī)還是模擬器 (iphoneos/iphonesimulator)
    if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]; then
    IYQ_SDK_PLATFORM=${BASH_REMATCH[1]}
    else
    echo "Could not find platform name from SDK_NAME: $SDK_NAME"
    exit 1
    fi

    # 2 SDK版本
    if [[ "$SDK_NAME" =~ ([0-9]+.*$) ]]; then
    IYQ_SDK_VERSION=${BASH_REMATCH[1]}
    else
    echo "Could not find sdk version from SDK_NAME: $SDK_NAME"
    exit 1
    fi

    # 3 其他平臺(tái)判斷 如果 則 否則
    if [ "$IYQ_SDK_PLATFORM" == "iphoneos" ]; then
    IYQ_OTHER_PLATFORM=iphonesimulator
    else
    IYQ_OTHER_PLATFORM=iphoneos
    fi

    # 4 其他平臺(tái)路徑
    if [[ "$BUILT_PRODUCTS_DIR" =~ (.*)$IYQ_SDK_PLATFORM$ ]]; then
    IYQ_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${IYQ_OTHER_PLATFORM}"
    else
    echo "Could not find other platform build directory."
    exit 1
    fi

    #調(diào)用上面構(gòu)建函數(shù) 如果當(dāng)前運(yùn)行的是真機(jī)則構(gòu)建模擬器
    build_static_library "${IYQ_OTHER_PLATFORM}${IYQ_SDK_VERSION}"

    # 如果你現(xiàn)在正在為模擬器編譯钧舌,那么Xcode會(huì)默認(rèn)只在該系統(tǒng)對(duì)應(yīng)的結(jié)構(gòu)下編譯担汤,例如i386 或 x86_64。為了在這兩個(gè)結(jié)構(gòu)下都進(jìn)行編譯洼冻,這里調(diào)用了build_static_library崭歧,基于iphonesimulator SDK重新編譯,確保這兩個(gè)結(jié)構(gòu)都進(jìn)行了編譯碘赖。
    if [ "$RW_SDK_PLATFORM" == "iphonesimulator" ]; then
    build_static_library "${SDK_NAME}"
    fi

    # 合并庫
    make_fat_library "${BUILT_PRODUCTS_DIR}/${IYQ_INPUT_STATIC_LIB}" \
    "${IYQ_OTHER_BUILT_PRODUCTS_DIR}/${IYQ_INPUT_STATIC_LIB}" \
    "${IYQ_FRAMEWORK_LOCATION}/${IYQ_FRAMEWORK_NAME}"

    # 確保文件存在 相當(dāng)于-dpR,保持文件的連接(d),保持原文件的屬性(p)并作遞歸處理(R)
    cp -a "${IYQ_FRAMEWORK_LOCATION}/${IYQ_FRAMEWORK_NAME}" \
    "${IYQ_OTHER_BUILT_PRODUCTS_DIR}/${IYQ_FRAMEWORK_NAME}.framework/${IYQ_FRAMEWORK_NAME}"

    # 拷貝到指定目錄下
    ditto "${IYQ_FRAMEWORK_LOCATION}" "${SRCROOT}/BuildFramework/${IYQ_FRAMEWORK_NAME}.framework"

  ⑤show in Finder 查看編譯的庫 > 打開終端驗(yàn)證 > 創(chuàng)建工程驗(yàn)證
    $ cd XXXX.framework
    $ XXX.framework  xcrun lipo -info XXXX

    iOS app需要在許多不同的CPU架構(gòu)下運(yùn)行:
    arm7: 在最老的支持iOS7的設(shè)備上使用
    arm7s: 在iPhone5和5C上使用
    arm64: 運(yùn)行于iPhone5S的64位 ARM 處理器 上
    i386: 32位模擬器上使用
    x86_64: 64為模擬器上使用
    每個(gè)CPU架構(gòu)都需要不同的二進(jìn)制數(shù)據(jù),當(dāng)你編譯一個(gè)應(yīng)用時(shí)外构,無論你目前正在使用那種架構(gòu)普泡,Xcode都會(huì)正確地依照對(duì)應(yīng)的架構(gòu)編譯。例如审编,如果你想跑在虛擬機(jī)上撼班,Xcode只會(huì)編譯i386版本(或者是64位機(jī)的x86_64版本)。

/*sdk存在圖片等資源文件的情況*/
使用bundle文件封裝圖片垒酬、xib等資源砰嘁,以下流程是使用多目標(biāo)編譯,單獨(dú)創(chuàng)建bundle文件類似
1.選擇庫工程目標(biāo)文件 > 左下角 + > maxOS > Bundle > 自定義命名IYQResources

2.配置幾個(gè)編譯設(shè)置勘究,因?yàn)槟阏趧?chuàng)建一個(gè)在iOS上使用的bundle矮湘,這與默認(rèn)的OS X不同。
  選擇Bundle目標(biāo)文件 > Build Settings > Base SDK > Latest iOS (iOS 10.2選擇最新)
  Build Settings > Product Name > ${TARGET_NAME}替換為你的工程名XXXX(直接寫工程名就好)

3.選擇Framework目標(biāo) > Build Phases > Target Dependencies > 點(diǎn)擊 + > 加入你的Bundle

4.默認(rèn)情況下口糕,有兩種resolutions(分辨率)的圖片可以產(chǎn)生一些有趣的現(xiàn)象缅阳。
  例如,當(dāng)你導(dǎo)入一個(gè)retina@2x版本的圖片時(shí)景描,普通版的和Retina版的將會(huì)合并成一個(gè)多resolution的TIFF(標(biāo)簽圖像文件格式十办,Tagged Image File Format)。
  Build Settings > COMBINE_HIDPI_IMAGES設(shè)置為NO

5.如何添加資源文件
  ①直接拖入
  ②選擇圖片或其他資源文件 > Target Membership > 選擇bundle目標(biāo)

6.如果想把你的編譯包c(diǎn)opy到指定位置超棺,在腳本后面加入如下代碼
  # 拷貝bundle到指定目錄下
  ditto "${BUILT_PRODUCTS_DIR}/${IYQ_FRAMEWORK_NAME}.bundle" \
  "${SRCROOT}/BuildFramework/${IYQ_FRAMEWORK_NAME}.bundle"

7.如何引用:UIImage *image = [UIImage imageNamed:@"XXXX.bundle/圖片名"];



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末向族,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子棠绘,更是在濱河造成了極大的恐慌件相,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氧苍,死亡現(xiàn)場(chǎng)離奇詭異适肠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)候引,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門侯养,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人澄干,你說我怎么就攤上這事逛揩∧” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵辩稽,是天一觀的道長惧笛。 經(jīng)常有香客問我,道長逞泄,這世上最難降的妖魔是什么患整? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮喷众,結(jié)果婚禮上各谚,老公的妹妹穿的比我還像新娘。我一直安慰自己到千,他們只是感情好昌渤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著憔四,像睡著了一般膀息。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上了赵,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天潜支,我揣著相機(jī)與錄音,去河邊找鬼柿汛。 笑死毁腿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苛茂。 我是一名探鬼主播已烤,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼妓羊!你這毒婦竟也來了胯究?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤躁绸,失蹤者是張志新(化名)和其女友劉穎裕循,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體净刮,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剥哑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淹父。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片株婴。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出困介,到底是詐尸還是另有隱情大审,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布座哩,位于F島的核電站徒扶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏根穷。R本人自食惡果不足惜姜骡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屿良。 院中可真熱鬧圈澈,春花似錦、人聲如沸管引。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褥伴。三九已至,卻和暖如春漾狼,著一層夾襖步出監(jiān)牢的瞬間重慢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工逊躁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留似踱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓稽煤,卻偏偏與公主長得像核芽,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酵熙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 總覽 一轧简、創(chuàng)建自己的SDK - .a靜態(tài)庫 這篇教程將只使用一小部分Objective-C代碼,本文主要講解從開始...
    leonardni閱讀 11,774評(píng)論 6 61
  • ——日記星球小牛媽媽訪談錄 395號(hào)星寶寶衣袂飛揚(yáng),三月里款款走來的女子察藐,安靜皮璧、祥和,是我們...
    程程百合閱讀 488評(píng)論 2 0
  • //距離// 你 溜溜地走著 有沒有想過 活生生的人 和黑白遺照的距離 水壺 咕咕地響著 如何測(cè)量 生水 與翻滾沸...
    單想閱讀 143評(píng)論 0 1
  • 最近大半年分飞,我的注意力主要放在三個(gè)領(lǐng)域:短視頻悴务,陌生人社交,KOL的知識(shí)變現(xiàn)譬猫。 “短視頻”是主賽道惨寿。 “陌生人社交...
    純銀V閱讀 12,382評(píng)論 0 192
  • 驚蟄以來邦泄,已經(jīng)連續(xù)下了兩天大雨了。 邕城的春天總是濕漉漉的,讓我的心情明朗不起來限番。但街道兩旁的榕樹換了新綠晰搀,偶爾還...
    楚南之獲閱讀 470評(píng)論 0 4