iOS批量打包,重簽名替換icon骑冗,launchScreen

這篇教程將手把手帶領(lǐng)大家實現(xiàn)使用xcodebuild命令進行iOS的打包實現(xiàn)赊瞬,并動態(tài)地為archieve文件添加資源文件,實現(xiàn)icon贼涩,和lauchScreen在打包時進行替換的工作巧涧。并編寫sh腳本,運行腳本將自動進行打包磁携。
讓我們解放使用xcode打包的雙手把褒侧!

一、
1)首先谊迄,我們需要了解一下xcodebuild命令闷供,不了解的同學(xué)可以先去看看官方文檔,或者打開終端统诺,輸入man xcodebuild -h命令來看看這個東西到底是用來干嘛的

Usage: xcodebuild [-project <projectname>] [[-target <targetname>]...|-alltargets] [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...
       xcodebuild [-project <projectname>] -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...
       xcodebuild -workspace <workspacename> -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...
       xcodebuild -version [-sdk [<sdkfullpath>|<sdkname>] [<infoitem>] ]
       xcodebuild -list [[-project <projectname>]|[-workspace <workspacename>]] [-json]
       xcodebuild -showsdks
       xcodebuild -exportArchive -archivePath <xcarchivepath> -exportPath <destinationpath> -exportOptionsPlist <plistpath>
       xcodebuild -exportLocalizations -localizationPath <path> -project <projectname> [-exportLanguage <targetlanguage>...]
       xcodebuild -importLocalizations -localizationPath <path> -project <projectname>

這里我只截取了一部分

  1. 接下來歪脏,我著重說明xcodebuild -project 和xcodebuild -workspace命令
    2.1 xcodebuild -project
xcodebuild [-project <projectname>] -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...

根據(jù)api,我們編寫的命令應(yīng)該如下:

$xcodebuild -project 你工程的名字.xcodeproj -target 打出的.pp包名 -configuration Release clean -sdk iphoneos build CODE_SIGN_IDENTITY=你打包證書的名字
 PROVISIONING_PROFILE=用于打包的描述文件的UUID SYMROOT="${projectDir}/build"

這條命令是以.xcodeproj的工程進行打包的粮呢,那么如果我們使用了cocoapods婿失,那么就應(yīng)該使用下面這條命令進行打包了
2.2 xcodebuild -workspace

 xcodebuild -workspace <workspacename> -scheme <schemeName> [-destination <destinationspecifier>]... [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...

根據(jù)api,我們的命令應(yīng)該如下:

$xcodebuild -workspace 你的項目名字.xcworkspace  -scheme 你的項目名字  -sdk iphoneos build CODE_SIGN_IDENTITY=你打包證書的名字
 PROVISIONING_PROFILE=用于打包的描述文件的UUID -configuration Release -derivedDataPath 打出的.app包的路徑

注意:1.你打包證書的名字在鑰匙串中查看啄寡,比如我使用的證書名字:
iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N******A)
2.獲取描述文件的UUID:
輸入下面的命令吧profile轉(zhuǎn)換成plist查看uuid豪硅,注意保存這個plist,后面替換了資源文件后挺物,進行重簽名還會用到

用mac自帶的命令security懒浮,cd到mobileprovision所在的文件夾,執(zhí)行 
security cms -D -i XXX.mobileprovision  > entitlements.plist
打開該plist文件识藤,便可看到UUID

2)執(zhí)行導(dǎo)出ipa包的命令

xcrun -sdk iphoneos -v PackageApplication 你在上次命令生成的.app文件的路徑 -o 導(dǎo)出的.ipa包的路徑

在執(zhí)行這行命令時砚著,需要下載PackageApplication 這是安裝教程

二、
2.1)下面痴昧,我們新建兩個工程稽穆,一個用cocoapods導(dǎo)入隨便一個三方,一個不用cocoapods赶撰,進行測試舌镶。
如圖:


image.png

這里柱彻,我們創(chuàng)建了兩個工程,我們這里只演示cocopads導(dǎo)入的工程乎折,xcodeproj工程只是打包命令的不同绒疗,其他的不邊則不再演示侵歇。
下面骂澄,我們給這個工程隨便加入一個cocopads導(dǎo)入的三方,如"MBProgress.h"

2.2)執(zhí)行命令惕虑,進行打包,工程的sign不用選坟冲,因為我們在打包命令里面已經(jīng)指定了證書和描述文件,注意設(shè)置bundleID
如下圖:cd 到工程根目錄

xcodebuild -workspace ArchievePods.xcworkspace  -scheme ArchievePods  -sdk iphoneos build CODE_SIGN_IDENTITY="iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N******A)" PROVISIONING_PROFILE="35405510-1f6c-4465-ac05-3fd840f17ff1" -configuration Release -derivedDataPath /Users/Harvey/Desktop/ArchievePods/build

編譯成功后,我們在工程根目錄下可以看到多了一個build文件夾

image.png

逐層打開可以發(fā)現(xiàn)我們打出的.app包
2.3)執(zhí)行命令溃蔫,導(dǎo)出ipa包

xcrun -sdk iphoneos -v PackageApplication /Users/Harvey/Desktop/ArchievePods/build/Build/Products/Release-iphoneos/ArchievePods.app  -o /Users/Harvey/Desktop/ArchievePods/包名.ipa

執(zhí)行之后健提,我們可以看到已經(jīng)生成了ipa文件,


image.png

至此伟叛,說明xcodebuild進行打包是可行的私痹。

三、下面统刮,我們編寫sh腳本進行xcodebuild的打包工作紊遵,
首先,在工程根目錄下創(chuàng)建autoBuild.sh腳本文件侥蒙,代碼如下

#!/bin/sh

#項目路徑暗膜,根據(jù)你的配置進行修改
projectDir="/Users/Harvey/Desktop/ArchievePods"

# 打包生成路徑 需修改
ipaPath="/Users/Harvey/Desktop/ArchievePods"

# Provisioning Profile 需修改 查看本地配置文件
PROVISIONING_PROFILE="35405510-1f6c-4465-ac05-3fd840f17ff1"

# Project Name
projectName="ArchievePods"

# 版本號
bundleVersion="1.0.0"

schemeName="ArchievePods"

# Code Sign ID
CODE_SIGN_IDENTITY="iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N******A)"

# xcodebuild -workspace 后生成 APP 路徑
buildDir="build/Build/Products/Release-iphoneos"

# 創(chuàng)建打包目錄
mkdir ${ipaPath}/AllPack


# 本地存放全部 IPA 的路徑
allIPAPackPath="${ipaPath}/allPack"

# 清除緩存
rm -rf ${projectDir}/$buildDir

#build 生成app
xcodebuild -workspace ${projectDir}/${schemeName}.xcworkspace  -scheme ${projectName}  -sdk iphoneos build CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${PROVISIONING_PROFILE}" -configuration Release -derivedDataPath ${projectDir}/build
if [[ $? = 0 ]]; then
echo "\033[31m 編譯成功\n \033[0m"
else
echo "\033[31m 編譯失敗\n \033[0m"
fi

# 先創(chuàng)建 payload 文件夾
mkdir ${ipaPath}/Payload
# 移動編譯生成的 app 到的 Payload 文件夾下
cp -Rf ${projectDir}/${buildDir}/${schemeName}.app ${ipaPath}/Payload
if [[ $? = 0 ]]; then
echo "\033[31m app移動成功\n \033[0m"
else
echo "\033[31m app移動失敗\n \033[0m"
fi


# App Bundle Name (CFBundleName)
appName="應(yīng)用"

# App DisPlay Name
appDisplayName="自動打包"

# App Icon Name
appIconName="byy"

# App Download Name
appDownloadName="IPA名字"

# App Bundle id
appBundleId="com.bestwise.test.archeive"

# 創(chuàng)建不同 app ipa 目錄
mkdir $allIPAPackPath/$appName
rm -rf $allIPAPackPath/$appName/*

# 生成 ipa
xcrun -sdk iphoneos -v PackageApplication ${ipaPath}/Payload/${schemeName}.app -o ${ipaPath}/$appDownloadName.ipa
#xcodebuild -exportArchive -archivePath ${ipaPath}/Payload/${schemeName}.app -exportPath ${ipaPath}/$appDownloadName.ipa -exportOptionsPlist '/Users/Harvey/Downloads/entitlements.plist'

if [[ $? = 0 ]]; then
echo "\033[31m \n 生成 IPA 成功 \n\n\n\n\n\033[0m"
else
echo "\033[31m \n 生成 IPA 失敗 \n\n\n\n\n\033[0m"
fi

# 移動
mv ${ipaPath}/$appDownloadName.ipa ${allIPAPackPath}/$appName

然后我們需要給.autoBuild.sh文件賦予權(quán)限才能運行這個打包腳本
cd 到該目錄下, 輸入

chmod -R 777 ./autoBuild.sh
然后運行該腳本(在運行這個腳本前鞭衩,我們可以把生成的/build文件夾学搜,.ipa文件先刪除,以檢驗效果)
./autobuild.sh

我們會看到我們的腳本執(zhí)行了论衍,并且生成了ipa文件瑞佩,build目錄

四、關(guān)于icon坯台, launchscreen炬丸,資源文件的替換。
要實現(xiàn)這個功能捂人,我們的思路是
①在info.plist里面設(shè)置好lauchScreen和icon加載的圖片(當(dāng)然你也可以在腳本中對工程的info.plist進行修改)
②替換AutoBuild.app 包內(nèi)的資源文件御雕,然后再對這個包進行重簽名,最后導(dǎo)出ipa包
4.1) 4.1.1首先滥搭,我們在工程根目錄下新增資源文件夾[bundleResources]這個文件夾下放置的是我們app的啟動圖酸纲,icon,json等資源文件瑟匆,如圖


image.png

4.1.2 第二步闽坡,修改info.plist,我們在info.plist中設(shè)置的launchscreen圖片的名字與這個文件夾中的圖片名字保持一致。如圖:


修改啟動圖片讀取bundle圖片
修改icon讀取bundle圖片

當(dāng)然,我們還需要在工程的general中設(shè)置一下


image.png

info.plist SourceCode

    <key>UILaunchImages</key>
    <array>
        <dict>
            <key>UILaunchImageMinimumOSVersion</key>
            <string>7.0</string>
            <key>UILaunchImageName</key>
            <string>LaunchImage-750-1334</string>
            <key>UILaunchImageOrientation</key>
            <string>Portrait</string>
            <key>UILaunchImageSize</key>
            <string>{375, 667}</string>
        </dict>
        <dict>
            <key>UILaunchImageMinimumOSVersion</key>
            <string>7.0</string>
            <key>UILaunchImageName</key>
            <string>LaunchImage-640-960h</string>
            <key>UILaunchImageOrientation</key>
            <string>Portrait</string>
            <key>UILaunchImageSize</key>
            <string>{320, 480}</string>
        </dict>
        <dict>
            <key>UILaunchImageMinimumOSVersion</key>
            <string>7.0</string>
            <key>UILaunchImageName</key>
            <string>LaunchImage-640-1136h</string>
            <key>UILaunchImageOrientation</key>
            <string>Portrait</string>
            <key>UILaunchImageSize</key>
            <string>{320, 568}</string>
        </dict>
        <dict>
            <key>UILaunchImageMinimumOSVersion</key>
            <string>7.0</string>
            <key>UILaunchImageName</key>
            <string>LaunchImage-1242-2208h</string>
            <key>UILaunchImageOrientation</key>
            <string>Portrait</string>
            <key>UILaunchImageSize</key>
            <string>{621, 1104}</string>
        </dict>
        <dict>
            <key>UILaunchImageMinimumOSVersion</key>
            <string>7.0</string>
            <key>UILaunchImageName</key>
            <string>LaunchImage-320-480h</string>
            <key>UILaunchImageOrientation</key>
            <string>Portrait</string>
            <key>UILaunchImageSize</key>
            <string>{621, 1104}</string>
        </dict>
        
    </array>
    <key>CFBundleIcons</key>
    <dict>
        <key>CFBundlePrimaryIcon</key>
        <dict>
            <key>CFBundleIconFiles</key>
            <array>
                <string>Icon-60</string>
            </array>
        </dict>
    </dict>

注:test.json文件里面是隨意一段json代碼疾嗅,我們在打出的包里進行測試外厂,讀取bundle資源,也可以不用 suit yourself代承!
4.2)在替換這些資源文件之后汁蝶,我們必須對archieve.app文件進行重新簽名,生成的app才能使用论悴,可以google一下codeResign掖棉,有很多相關(guān)的資料。
在重簽名時膀估,我們需要entitlements.plist文件


plist文件格式

這個文件的來源就是我們之前用security 命令獲得的entitlements.plist的一部分幔亥。下面,我們把這一部分截取出來察纯,依然放入工程的根目錄帕棉。
4.3)下面我們將實現(xiàn)替換資源這一段代碼的編寫,完整的腳本代碼如下

#!/bin/sh

#項目路徑,根據(jù)你的配置進行修改
projectDir="/Users/Harvey/Desktop/ArchievePods"

# 打包生成路徑 需修改
ipaPath="/Users/Harvey/Desktop/ArchievePods"

# Provisioning Profile 需修改 查看本地配置文件
PROVISIONING_PROFILE="35405510-1f6c-4465-ac05-3fd840f17ff1"

# Project Name
projectName="ArchievePods"

# 版本號
bundleVersion="1.0.0"

############# 重簽名需要文件
# 以下文件需放在 ipaPath 路徑下
Entitlements=$ipaPath/entitlements.plist

schemeName="ArchievePods"

#資源文件夾
bundleSourcesPath="/Users/Harvey/Desktop/ArchievePods/bundleResource"


# Code Sign ID
CODE_SIGN_IDENTITY="iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N*******A)"

# xcodebuild -workspace 后生成 APP 路徑
buildDir="build/Build/Products/Release-iphoneos"

# 創(chuàng)建打包目錄
mkdir ${ipaPath}/AllPack


# 本地存放全部 IPA 的路徑
allIPAPackPath="${ipaPath}/allPack"

# 清除緩存
rm -rf ${projectDir}/$buildDir

#build 生成app
xcodebuild -workspace ${projectDir}/${schemeName}.xcworkspace  -scheme ${projectName}  -sdk iphoneos build CODE_SIGN_IDENTITY="${CODE_SIGN_IDENTITY}" PROVISIONING_PROFILE="${PROVISIONING_PROFILE}" -configuration Release -derivedDataPath ${projectDir}/build
if [[ $? = 0 ]]; then
echo "\033[31m 編譯成功\n \033[0m"
else
echo "\033[31m 編譯失敗\n \033[0m"
fi

# 先創(chuàng)建 payload 文件夾
mkdir ${ipaPath}/Payload
# 移動編譯生成的 app 到的 Payload 文件夾下
cp -Rf ${projectDir}/${buildDir}/${schemeName}.app ${ipaPath}/Payload
if [[ $? = 0 ]]; then
echo "\033[31m app移動成功\n \033[0m"
else
echo "\033[31m app移動失敗\n \033[0m"
fi


# App Bundle Name (CFBundleName)
appName="應(yīng)用"

# App DisPlay Name
appDisplayName="自動打包"

# App Icon Name
appIconName="byy"

# App Download Name
appDownloadName="IPA名字"

# App Bundle id
appBundleId="com.bestwise.test.archeive"

# 創(chuàng)建不同 app ipa 目錄
mkdir $allIPAPackPath/$appName
rm -rf $allIPAPackPath/$appName/*

# 修改 Plist
defaults write ${ipaPath}/Payload/${schemeName}.app/info.plist "CFBundleName" $appName
defaults write ${ipaPath}/Payload/${schemeName}.app/info.plist "CFBundleDisplayName" $appDisplayName

defaults write ${ipaPath}/Payload/${schemeName}.app/info.plist "CFBundleIdentifier" $appBundleId
defaults write ${ipaPath}/Payload/${schemeName}.app/info.plist "Channel" $appDownloadName

if [[ $? = 0 ]]; then
echo "\033[31m 修改 Plist 成功\033[0m"
else
echo "\033[31m 修改 Plist 失敗\033[0m"
fi

# 將對應(yīng)的 資源文件(icon饼记,lauchscreen香伴,等資源文件) 復(fù)制到需要修改的 app 的目錄下
cp -Rf $bundleSourcesPath/* $ipaPath/Payload/${schemeName}.app


if [[ $? = 0 ]]; then
echo "\033[31m 修改 icon 成功\033[0m"
else
echo "\033[31m 修改 icon 失敗\033[0m"
fi


# 重簽名
codesign -f -s "iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N*******A)"  --entitlements $Entitlements ${ipaPath}/Payload/${schemeName}.app
if [[ $? = 0 ]]; then
echo "\033[31m 簽名成功\n \033[0m"
else
echo "\033[31m 簽名失敗\n \033[0m"
fi


# 生成 ipa
xcrun -sdk iphoneos -v PackageApplication ${ipaPath}/Payload/${schemeName}.app -o ${ipaPath}/$appDownloadName.ipa
#xcodebuild -exportArchive -archivePath ${ipaPath}/Payload/${schemeName}.app -exportPath ${ipaPath}/$appDownloadName.ipa -exportOptionsPlist '/Users/Harvey/Downloads/entitlements.plist'

if [[ $? = 0 ]]; then
echo "\033[31m \n 生成 IPA 成功 \n\n\n\n\n\033[0m"
else
echo "\033[31m \n 生成 IPA 失敗 \n\n\n\n\n\033[0m"
fi


# 移動
mv ${ipaPath}/$appDownloadName.ipa ${allIPAPackPath}/$appName

運行上面的一段腳本,將生成的ipa包安裝到手機握恳,看看icon和launchscreen是不是已經(jīng)改變了呢瞒窒!
當(dāng)然,我們的test.json文件也在bundle目錄下乡洼,是可以讀取的崇裁,這里不再演示。

五束昵、批量打包APP
其實拔稳,在sh腳本中寫一個循環(huán)進行打包就可以了,在重簽名的時候注意一下每個包的配置就可以了

更新:
當(dāng)重簽名報錯:segmentation fault:11
1.打開終端锹雏,輸入 security find-identity
我們用前面的一串?dāng)?shù)字進行重簽名操作


image.png

codesign -f -s "iPhone Distribution: Chengdu Bestwise Technology Co. Ltd (N*******A)" --entitlements $Entitlements ${ipaPath}/Payload/${schemeName}.app
改為: codesign -f -s 99D45A71C1E0B2B0E03767C6F0981C7EEF65ACB6 --entitlements $Entitlements ${ipaPath}/Payload/${schemeName}.app

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巴比,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子礁遵,更是在濱河造成了極大的恐慌轻绞,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佣耐,死亡現(xiàn)場離奇詭異政勃,居然都是意外死亡,警方通過查閱死者的電腦和手機兼砖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門奸远,熙熙樓的掌柜王于貴愁眉苦臉地迎上來既棺,“玉大人,你說我怎么就攤上這事懒叛⊥杳幔” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵薛窥,是天一觀的道長胖烛。 經(jīng)常有香客問我,道長拆檬,這世上最難降的妖魔是什么洪己? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任妥凳,我火速辦了婚禮竟贯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逝钥。我一直安慰自己屑那,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布艘款。 她就那樣靜靜地躺著持际,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哗咆。 梳的紋絲不亂的頭發(fā)上蜘欲,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音晌柬,去河邊找鬼姥份。 笑死,一個胖子當(dāng)著我的面吹牛年碘,可吹牛的內(nèi)容都是我干的澈歉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼屿衅,長吁一口氣:“原來是場噩夢啊……” “哼埃难!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涤久,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤涡尘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后响迂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體考抄,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年栓拜,在試婚紗的時候發(fā)現(xiàn)自己被綠了座泳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠昔。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挑势,靈堂內(nèi)的尸體忽然破棺而出镇防,到底是詐尸還是另有隱情,我是刑警寧澤潮饱,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布来氧,位于F島的核電站,受9級特大地震影響香拉,放射性物質(zhì)發(fā)生泄漏啦扬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一凫碌、第九天 我趴在偏房一處隱蔽的房頂上張望扑毡。 院中可真熱鬧,春花似錦盛险、人聲如沸瞄摊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽换帜。三九已至,卻和暖如春鹤啡,著一層夾襖步出監(jiān)牢的瞬間惯驼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工递瑰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祟牲,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓泣矛,卻偏偏與公主長得像疲眷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子您朽,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,678評論 2 354

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