iOS應(yīng)用發(fā)布中的一些細(xì)節(jié)

前言

這幾天最大的新聞我想就是巴黎恐怖襲擊了,誒,博主每年跨年都那么虔誠地許下“希望世界和平”的愿望袁余,想不到每年都無法實(shí)現(xiàn),維護(hù)世界和平這么難咱揍,博主真是有心無力啊颖榜,其實(shí)蕓蕓眾生的我們能做的大概就是不要闖紅燈、不搶小妹妹的甜筒煤裙、拉完屎記得沖水掩完、打飯不逃票、不在澡堂小便硼砰、不挖人家墻角……其實(shí)就是維護(hù)世界和平了且蓬。

然而黑客組織Anonymous向ISIS宣戰(zhàn)了!

圖0

威武题翰!

好吧回歸這次文章主題恶阴,就列舉一些iOS應(yīng)用發(fā)布中個(gè)人覺得還蠻容易忽略的一些細(xì)節(jié)。

Bundle identifier

Xcode中 Target -> General中的bundle identifier ;

info.plist中的Bundle identifier;

證書中心{:target="_blank"} 的IdentifiersApp IDs新建App時(shí)的Explicit App ID;

以及iTunes Connect中App信息的套裝ID 必須保持一致1稀冯事!

在info.plist或者Xcode里的各種設(shè)置中,有很多$(XXX)這樣的像腳本一樣的東西血公,所以補(bǔ)充一點(diǎn)Xcode中的環(huán)境變量{:target="_blank"}

Certificates證書

蘋果的證書體系一直都是iOS初學(xué)者無盡的夢魘昵仅,什么開發(fā)證書、發(fā)布證書累魔、推送證書摔笤,什么ad hoc、內(nèi)測分發(fā)薛夜、真機(jī)調(diào)試……我想每一個(gè)iOS初學(xué)剛開始接觸Apple的證書體系的時(shí)候內(nèi)心是絕壁崩潰并且被心中的草泥馬踐踏的體無完膚的……籍茧。

其實(shí)蘋果的證書其實(shí)沒那么玄乎,很多朋友弄不懂或者過了一段時(shí)間又不知道怎么弄了梯澜,本質(zhì)的原因是因?yàn)閷?a target="_blank" rel="nofollow">非對稱加密(公開密鑰加密){:target="_blank"}的不理解導(dǎo)致的寞冯,所以為了完全的駕馭蘋果的證書渴析,這些基礎(chǔ)的知識就是坑你的坎,必須跨過去的吮龄。

網(wǎng)上有各種解釋證書中心里面每一種證書作用是什么俭茧、怎么創(chuàng)建、怎么使用的漓帚,但是這也只能授人以魚母债,所以博主不會(huì)介紹每一種證書是干嘛的,因?yàn)槟憧辞澳甓嗔艘粋€(gè)Pass Type ID Certificate 尝抖,去年又有了WatchKit Services Certificate 毡们,今年又來一個(gè)Apple Pay Certificate……根本就解釋這些證書不完嘛~,所以理解這些證書的統(tǒng)一規(guī)律才是王道昧辽!所謂

萬變不離其宗

很多資料都把證書分成兩種衙熔,分為開發(fā)證書(development)、以及發(fā)布證書(distribution)搅荞。但是博主認(rèn)為這樣分類不是很不科學(xué)的红氯,博主的理解的分類是這樣的

圖1

  • 根證書是與開發(fā)者或者企業(yè)對應(yīng)的,只要是被根證書簽名的App都可以理解為是這個(gè)證書對應(yīng)的開發(fā)者開發(fā)的咕痛。所以一個(gè)根證書可以簽名多個(gè)App痢甘。
  • 其他證書呢是與具體的App對應(yīng)的,一個(gè)App的推送證書是無法給另一個(gè)App使用的茉贡,所以一個(gè)其他證書只能為一個(gè)App簽名塞栅,更確切的說是這個(gè)App需要使用某一項(xiàng)Apple的服務(wù)而去產(chǎn)生這個(gè)其他證書

所以其實(shí)蘋果每年都添加的證書屬于其他證書块仆,這些其他證書并不是非必須的构蹬,而是使用了蘋果的某一項(xiàng)服務(wù)時(shí)才需要提供的憑證王暗。而根證書是必須的悔据,它簽名的APP是屬于這個(gè)證書的所有者的。

圖2

圖中我的這個(gè)賬號默認(rèn)會(huì)有兩個(gè)不同用途的根證書俗壹,有兩個(gè)App科汗,分別為App1、APP2绷雏,以及它們對應(yīng)的兩種用途的推送證書(屬于其他證書)头滔。

假如我現(xiàn)在需要真機(jī)調(diào)試App1的推送,那么我只要下載開發(fā)根證書以及App1的開發(fā)推送證書然后雙擊打開導(dǎo)入鑰匙串涎显,然后創(chuàng)建相應(yīng)profile即可真機(jī)調(diào)試了坤检;

假如現(xiàn)在我要發(fā)布APP2,那么我只要下載發(fā)布根證書以及APP2的發(fā)布推送證書期吓,然后創(chuàng)建相應(yīng)地profile即可打包上傳App Strore了早歇。(這里因?yàn)榘l(fā)布的特殊性,所以發(fā)布的電腦必須是創(chuàng)建這個(gè)發(fā)布根證書的電腦)。

profile(描述文件)下文還有篇幅介紹箭跳。

我TM都繞暈了晨另,確實(shí)有點(diǎn)麻煩有點(diǎn)復(fù)雜,果然iOS開發(fā)門檻就是高啊谱姓,但是哥就喜歡借尿。

App IDs

在相應(yīng)地App的edit中可以添加多套APNs推送證書(其他的證書也類似的)

圖3

在這里聲明一下,其他證書其他證書生成的時(shí)候屉来,使用的certSigningRequest文件可以和產(chǎn)生根證書certSigningRequest的不一致路翻,也就是說產(chǎn)生其他證書時(shí)不一定需要產(chǎn)生根證書的電腦,所以這里也坑了無數(shù)的人調(diào)試推送茄靠,這個(gè)在下文推送的那些事詳細(xì)填坑帚桩。

Provisioning Profiles描述文件

圖4

我想這個(gè)界面一彈出來的時(shí)候,蛋蛋憂傷迎面撲來嘹黔。然后怒點(diǎn) Fix issue账嚎,然后你們團(tuán)隊(duì)負(fù)責(zé)管理證書的基友突然發(fā)現(xiàn)證書中心多了好多好亂的證書以及描述文件,然后他爆了一句:what the huck儡蔓!刪掉了帶有Xcode *的證書以及描述文件郭蕉,然后自己又暴力的點(diǎn)了一發(fā)Fix issue,然后你突然調(diào)試不了了喂江,再暴擊Fix issue鍵召锈,最后整個(gè)團(tuán)隊(duì)都只有通過Fix issue來真機(jī)調(diào)試了……。

所以慎點(diǎn)Fix issue获询,如果點(diǎn)擊這個(gè)選項(xiàng)涨岁,聰明的(蠢哭的)Xcode就會(huì)自己管理描述文件,然后各種莫名其妙的帶有Xcode *的證書以及描述文件……

其實(shí)只要堅(jiān)信一點(diǎn)吉嚣,證書梢薪、設(shè)備ID、AppID尝哆、描述文件都弄對了就絕逼不會(huì)出問題的秉撇!

描述文件工作原理

圖5

  • 其實(shí)描述文件工作的原理就是在APP打包或者真機(jī)調(diào)試的時(shí)候,讓Xcode去檢查描述文件里面的BundleID與這個(gè)APP的BundleID是否對應(yīng)秋泄。
  • 對應(yīng)的話就會(huì)去keyChain查找有沒有相應(yīng)地證書(所以證書要下載好琐馆,并且導(dǎo)入keyChain)
  • 如果有證書存在的話就會(huì)檢查證書的類型,如果是開發(fā)證書恒序,則會(huì)檢查調(diào)試的設(shè)備是否加入了描述文件里面的信任設(shè)備ID列表瘦麸,如果設(shè)備沒有在描述文件的列表中,則無法調(diào)試歧胁;如果證書類型是發(fā)布證書則不會(huì)檢查設(shè)備ID列表滋饲。

額外地彤敛,如果公司新增了測試機(jī),并且在證書中心的Devices中添加了新測試機(jī)的ID了赌,這樣描述文件也要相應(yīng)地更新墨榄,然后重新下載,下載完之后可以先刪除舊的描述文件(博主直接覆蓋的方式貌似描述文件沒有更新啊)勿她,你們可以自己做實(shí)驗(yàn)咯袄秩,描述文件的路勁/Users/XXX/Library/MobileDevice/Provisioning\ Profiles

XXX你的用戶名。

不要覆蓋逢并!記得先刪除之剧,可以免除很多問題。

推送的那些事

如果說億萬級用戶的微信推送服務(wù)并不是企鵝自己定制的而都是由蘋果APNs推送的話砍聊,那蘋果的推送就真的牛逼了背稼,但是有時(shí)候測試推送,經(jīng)常APNs要死不活的玻蝌,推了半天才到蟹肘,有一次在APNs沙箱環(huán)境怒推1000多條,然后這條隊(duì)列持續(xù)了半個(gè)月才推完~~俯树。所以微信帘腹、扣扣肯定是定制的推送,有錢就是討厭许饿,那么任性阳欲。

但是蘋果推送的開發(fā)是比較簡單地,如果沒有高級推送需求基本就不用寫代碼了陋率,只要配置好證書一切OK球化。

現(xiàn)在常用的后臺server中,一般將推送證書以及推送證書的私鑰導(dǎo)出p12交給后臺人員即可瓦糟。

PHP有點(diǎn)調(diào)皮筒愚,還需要轉(zhuǎn)換成pem

生成PHP需要的Pem證書

準(zhǔn)備:

  1. 蘋果服務(wù)器證書端設(shè)置正確!打包證書狸页、描述文件正確O悄堋!
  2. 下載推送證書(cer格式)芍耘,導(dǎo)入keyChain,保證私鑰存在熄阻,不存在去找創(chuàng)建這個(gè)證書的電腦要一份過來斋竞。
  3. 從鑰匙庫導(dǎo)出的根證書(推送證書)私鑰(p12格式)

第三步根證書的私鑰這里是一個(gè)坑!因?yàn)橐粋€(gè)App的推送證書的創(chuàng)建可以和根證書創(chuàng)建的電腦不同秃殉,也就是keyChain產(chǎn)生的certSigningRequest不一樣坝初,所以私鑰也是不一樣的浸剩,在這里生成Pem時(shí),注意要使用推送證書的私鑰鳄袍!

操作過程:

  1. 把推送證書(.cer)轉(zhuǎn)換為.pem文件绢要,執(zhí)行命令:

    openssl x509 -in 推送證書.cer -inform der -out 推送證書.pem
    
  2. 把推送證書導(dǎo)出的私鑰(.p12)文件轉(zhuǎn)化為.pem文件:

    openssl pkcs12 -nocerts -out 推送證書私鑰.pem -in 推送證書私鑰.p12   
    
  3. 對生成的這兩個(gè)pem文件再生成一個(gè)pem文件,來把證書和私鑰整合到一個(gè)文件里:

    cat 推送證書.pem 推送證書私鑰.pem >PHPPush.pem
    

然后把這個(gè)PHPPush.pem給后臺基友們拗小,就可以下班啦重罪。

當(dāng)然測試推送也比較麻煩,需要模擬真實(shí)的推送環(huán)境哀九,一般需要后臺提供幫助剿配,但是遇到一些后臺同事,他們有強(qiáng)烈地信仰著鄙視鏈的話阅束,很鄙視iOS呼胚,心里早就稱呼你“死前段”多年了,還那么多事……

所以關(guān)于調(diào)試推送息裸,博主教你自己推自己蝇更!不麻煩別人。

只要拷貝這段代碼

<?php
// devicetoken
 $deviceToken = '你的deviceToken';
// 私鑰密碼呼盆,生成pem的時(shí)候輸入的
$passphrase = '123456';
// 定制推送內(nèi)容簿寂,有一點(diǎn)的格式要求,詳情Apple文檔
$message = array(
    'body'=>'你收到一個(gè)新訂單'
);
$body['aps'] = array(
    'alert' => $message,
    'sound' => 'default',
    'badge' => 100,
    );
$body['type']=3;
$body['msg_type']=4;
$body['title']='新訂單提醒';
$body['msg']='你收到一個(gè)新消息';

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'local_cert', 'push.pem');//記得把生成的push.pem放在和這個(gè)php文件同一個(gè)目錄
stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
$fp = stream_socket_client(
    //這里需要特別注意宿亡,一個(gè)是開發(fā)推送的沙箱環(huán)境常遂,一個(gè)是發(fā)布推送的正式環(huán)境,deviceToken是不通用的
    'ssl://gateway.sandbox.push.apple.com:2195', $err,
    //'ssl://gateway.push.apple.com:2195', $err,
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
if (!$fp)
    exit("Failed to connect: $err $errstr" . PHP_EOL);
echo 'Connected to APNS' . PHP_EOL;
$payload = json_encode($body);
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
    echo 'Message not delivered' . PHP_EOL;
else
    echo 'Message successfully delivered' . PHP_EOL;
fclose($fp);
?>

將上面的代碼復(fù)制挽荠,保存成push.php

然后根據(jù)上面“生成PHP需要的Pem證書”的步驟生成push.pem

兩個(gè)文件放在同一目錄

執(zhí)行下面的命令

DavidDay$ php push.php 

結(jié)果為

Connected to APNS
Message successfully delivered

是不是就推送成功了呢克胳?呵呵噠

打包、分發(fā)及內(nèi)測

關(guān)于打包是有很多姿勢的圈匆,每個(gè)人都有各自的喜好漠另,大部分規(guī)矩的做法都是使用Xcode的一條龍服務(wù)的:

  • 選擇相應(yīng)地描述文件、證書

  • 選擇ARM架構(gòu)機(jī)型(模擬器是Intel架構(gòu)的跃赚,真機(jī)是ARM架構(gòu)的笆搓,不能通用)

  • product -> archive

  • 然后就可以選擇導(dǎo)出ipa在第三方平臺分發(fā)測試或者上傳App Stroe審核了

    ?
    這樣的做法比較保險(xiǎn),因?yàn)?code>archive 只會(huì)編譯出真機(jī)的二進(jìn)制碼纬傲,所以不用擔(dān)心導(dǎo)出的ipa真機(jī)裝不起满败。

另一種姿勢是使用xcodebuild 工具,純Shell編譯叹括,比較不好處理錯(cuò)誤算墨,但是逼格滿滿啊,想詳細(xì)了解這種姿勢的可以看看官方文檔{:target="_blank"} 汁雷,或者參考這位同學(xué)的分享{:target="_blank"}

當(dāng)然嘛净嘀,博主作為拖拖派的忠實(shí)擁躉报咳,博主打包ipa的時(shí)候是這樣的:

圖6

隨時(shí)build隨時(shí)轉(zhuǎn)ipa。

分發(fā)內(nèi)測一般都會(huì)使用第三方的平臺挖藏,fir{:target="_blank"}暑刃、蒲公英{:target="_blank"} 都很好呀~

關(guān)于提交審核這里,一般archive過去了膜眠,證書正確都沒問題的岩臣,當(dāng)然還是要檢查項(xiàng)目是否調(diào)用了私有API,之前用reveal {:target="_blank"} 柴底,提交應(yīng)用的時(shí)候忘了移除婿脸,千不該萬不該的還是用了Xcode的upload工具,也不報(bào)錯(cuò)柄驻,在iTunesConnect中構(gòu)建版本也出現(xiàn)了狐树,只是狀態(tài)“正在處理”,一般這個(gè)狀態(tài)持續(xù)10分鐘~2個(gè)小時(shí)就會(huì)通過了鸿脓,然后博主自信關(guān)機(jī)下班抑钟,想不到第二天構(gòu)建版本還是“正在處理”,然后猜想是不是iTunes出問題了又怒傳了N個(gè)包野哭,依然是“正在處理”在塔,后來準(zhǔn)備發(fā)郵件,打開郵箱拨黔,尼瑪蛔溃!

圖7

原來調(diào)用了私有接口,忘記移除reveal了~篱蝇,回顧起來這里有三個(gè)大坑贺待,

  1. Xcode的上傳工具很辣雞!零截!很多錯(cuò)誤都無法掃描出來麸塞,所以切記 使用 Application Loader ,速度快涧衙,錯(cuò)誤報(bào)告也精準(zhǔn)哪工。
  2. iTunesConnect的錯(cuò)誤狀態(tài)幾乎沒有,一般只有兩個(gè)狀態(tài) “正在處理”弧哎、“成功”雁比,所以如果超過兩個(gè)小時(shí)仍然是“正在處理”,那么極有可能包出問題了傻铣!
  3. 記住關(guān)注郵件章贞!

打包項(xiàng)目證書選擇必須正確 (Xcode7以下 選擇項(xiàng)目編譯target為Iphone Device 不要連接手機(jī) 否則會(huì) ,Xcode7中不需要拔出真機(jī)非洲,因?yàn)槎嗔艘粋€(gè)build only device 的選項(xiàng))

 編譯target選錯(cuò)了 報(bào)錯(cuò)

 ITMS-90530 "Invalid MinimumOSVersion. Apps that only support 64-bit devices must specify a deplyment target of 8.0 or later"

IMTS-90208 "Invalid Bundle. The bundle xxx.app does not support the minimum OS version specified in the Info.plist"

IMTS-90502 "Invalid Bundle. Apps that only contain the arm64 slice must also have'arm64' in the list of UIRequiredDeviceCapabilities in Info.plist ")

總結(jié)

突然想起我哥說的一句話

有時(shí)候有些女人就像飯?zhí)蔑埐搜枷蓿m然難吃,但是去晚了也會(huì)沒有的两踏!

珍惜身邊的人败京。

感覺這個(gè)總結(jié)什么鬼?有點(diǎn)傷感梦染,嗯赡麦,iOS應(yīng)用的發(fā)布,每個(gè)從業(yè)者都應(yīng)該能夠熟練的對發(fā)布進(jìn)行操作和意外處理的帕识。

沒錢結(jié)婚泛粹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肮疗,隨后出現(xiàn)的幾起案子晶姊,更是在濱河造成了極大的恐慌,老刑警劉巖伪货,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件们衙,死亡現(xiàn)場離奇詭異,居然都是意外死亡碱呼,警方通過查閱死者的電腦和手機(jī)蒙挑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愚臀,“玉大人忆蚀,你說我怎么就攤上這事」昧眩” “怎么了馋袜?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炭分。 經(jīng)常有香客問我桃焕,道長,這世上最難降的妖魔是什么捧毛? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任观堂,我火速辦了婚禮,結(jié)果婚禮上呀忧,老公的妹妹穿的比我還像新娘师痕。我一直安慰自己,他們只是感情好而账,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布胰坟。 她就那樣靜靜地躺著,像睡著了一般泞辐。 火紅的嫁衣襯著肌膚如雪笔横。 梳的紋絲不亂的頭發(fā)上竞滓,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機(jī)與錄音吹缔,去河邊找鬼商佑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛厢塘,可吹牛的內(nèi)容都是我干的茶没。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼晚碾,長吁一口氣:“原來是場噩夢啊……” “哼抓半!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起格嘁,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤笛求,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后讥蔽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涣易,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年冶伞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了新症。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡响禽,死狀恐怖徒爹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芋类,我是刑警寧澤隆嗅,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站侯繁,受9級特大地震影響胖喳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贮竟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一丽焊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咕别,春花似錦技健、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春欣孤,著一層夾襖步出監(jiān)牢的瞬間馋没,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工导街, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留披泪,地道東北人纤子。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓搬瑰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親控硼。 傳聞我的和親對象是個(gè)殘疾皇子泽论,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

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

  • 1.首先通過鑰匙串訪問——證書助理——從證書頒發(fā)機(jī)構(gòu)請求證書——填寫證書信息(郵箱,常用名稱卡乾,存儲(chǔ)到磁盤)——存儲(chǔ)...
    DanDanC閱讀 7,946評論 5 15
  • 引言關(guān)于開發(fā)證書配置(Certificates & Identifiers & Provisioning Prof...
    molake閱讀 48,256評論 7 62
  • 轉(zhuǎn)自 iOS開發(fā)證書要點(diǎn)詳解翼悴,ios證書詳解 有細(xì)節(jié)修改。 首先幔妨,假設(shè)你使用過Apple設(shè)備(iMac/iPad/...
    就叫yang閱讀 1,733評論 0 1
  • 引言 關(guān)于開發(fā)證書配置(Certificates & Identifiers & Provisioning Pro...
    奮斗的蝸牛閱讀 7,384評論 2 20
  • 你沒有發(fā)現(xiàn)嗎误堡?我們再也不是那兩個(gè)可以徹夜電話的情侶古话,我們彼此越來越多的是陌生,我們沒有共同的生活圈锁施,也越來越...
    想飛的白兔子閱讀 427評論 0 0