導航:首頁 > 文件教程 > ios獲取文件名

ios獲取文件名

發布時間:2024-03-17 21:19:36

『壹』 ios的應用沙箱運行是怎麼一回事

1、IOS沙盒機制

IOS應用程序只能在本應用程序中創建的文件系統中讀取文件,不可以去其它地方訪問,此區域被成為沙盒,所有的非代碼文件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件等。
1.1、每個應用程序都有自己的存儲空間
1.2、應用程序不能翻過自己的圍牆去訪問別的存儲空間的內容
1.3、應用程序請求的數據都要通過許可權檢測,假如不符合條件的話,不會被放行。
通過這張圖只能從表層上理解sandbox是一種安全體系,應用程序的所有操作都要通過這個體系來執行,其中核心內容是:sandbox對應用程序執行各種操作的許可權限制。

2、打開模擬器沙盒目錄

下面看看模擬器的沙盒文件夾在mac電腦上的什麼位置。
文件都在個人用戶名文件夾下的一個隱藏文件夾里,中文叫資源庫,英文名是Library。
下面介紹一種簡單方法前往該文件夾:在Finder上點->前往->前往文件夾

進入模擬器後,裡面就包含了各個應用程序的沙盒。

進入一個應用程序,如下圖,就是一個沙箱了。

下面介紹一下沙箱的目錄結構:

默認情況下,每個沙盒含有3個文件夾:Documents, Library 和 tmp和一個應用程序文件(也是一個文件)。因為應用的沙盒機制,應用只能在幾個目錄下讀寫文件
Documents:蘋果建議將程序中建立的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄
Library:存儲程序的默認設置或其它狀態信息;
Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出刪除
tmp:提供一個即時創建臨時文件的地方。
iTunes在與iphone同步時,備份所有的Documents和Library文件。
iPhone在重啟時,會丟棄所有的tmp文件。

注意:這里很容易和bundle混淆在一起,下面根據自己的一點理解說明二者的區別:

bundle :生成 iOS 應用程序時,Xcode 將它捆綁成一個包。捆綁包 (bundle) 是文件系統中的一個目錄,它將相關資源成組在一個地方。一個 iOS 應用程序捆綁包中,含有其可執行文件和支持資源文件(如應用程序圖標、圖像文件和已本地化的內容)。
A bundle(包裹、捆、束) is a directory with a standardizedhierarchical structure that holds executable code and the resources used by that code.
所以可以將整個應用程序其實就可以看做一個bundle。
沙箱的概念和bundle沒直接關系,沙箱只是說明程序資源與外界隔離

下面通過一個簡單的例子說明一下bundle和sandbox。

//新建的plist文件是在應用程序中的,可以通過bundle存取到該文件
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"MyPlist" ofType:@"plist"];
NSMutableArray *array = [NSMutableArray arrayWithContentsOfFile:plistPath];

//向數組中新添加一個項目
[array addObject:@"3"];
//重新寫回plist文件中
BOOL value = [array writeToFile:plistPath atomically:YES];
if (value) {
NSMutableArray *newArray = [NSMutableArray arrayWithContentsOfFile:plistPath];
NSLog(@"new array = %@",newArray);
}
/* 輸出:
new array = (
0,
1,
2,
3
)
*/

//獲取沙箱中document的path
NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *newPath = [documentsDirectory :@"data.plist"];

//將數組寫入到沙箱的document中的data.plist文件中
[array writeToFile:newPath atomically:YES];

NSMutableArray *arr = [[NSMutableArray alloc] initWithContentsOfFile:newPath];
NSLog(@"array in data.plist = %@",arr);
/* 輸出:
array in data.plist = (
0,
1,
2,
3
)
*/

說明:我們首先在項目中新建一個plist文件(root項的類型為數組),添加了3個元素。因為新建的plist文件是在應用程序中的,我們可以通過bundle獲取到這個plist文件,讀取出這個數組,添加一個數據元素後,重新寫回plist文件中。接著我們獲取沙箱document的path,然後將這個文件寫入到沙箱中的data.plist文件中(如果不存在,會自動新建一個的),然後再從data.plist讀取出這個數組。
關於新建的MyPlist.plist文件,我們寫迴文件的數組中添加了一項新的元素,但是我們在xcode中查看這個MyPlist.plist文件時,發現並沒有顯示出新增的數組元素,但是我們到沙箱中查看就可以看到了,這個估計是xoode本身的問題。
關於document中data.plist文件查看我們也可以到沙箱中進行查看。如下圖:

3、獲取沙盒目錄:

//1、獲取程序的Home目錄
NSString *homeDirectory = NSHomeDirectory();
NSLog(@"path:%@", homeDirectory);
//path:/Users/ios/Library/Application Support/iPhone Simulator/6.1/Applications/BF38C9E3-1A4A-4929-B5F2-3E46E41CC671

//2、獲取document目錄
NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
//path:/Users/ios/Library/Application Support/iPhone Simulator/6.1/Applications/BF38C9E3-1A4A-4929-B5F2-3E46E41CC671/Documents

//3、獲取Cache目錄
NSArray *paths = (NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
//path:/Users/ios/Library/Application Support/iPhone Simulator/6.1/Applications/BF38C9E3-1A4A-4929-B5F2-3E46E41CC671/Library/Caches

//4、獲取Library目錄
NSArray *paths = (NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
//path:/Users/ios/Library/Application Support/iPhone Simulator/6.1/Applications/BF38C9E3-1A4A-4929-B5F2-3E46E41CC671/Library

//5、獲取tmp目錄
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@"path:%@", tmpDir);
//path:/Users/ios/Library/Application Support/iPhone Simulator/6.1/Applications/BF38C9E3-1A4A-4929-B5F2-3E46E41CC671/tmp/

4、文件操作之NSFileManager

4.1 、在document中創建一個文件目錄

NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"documentsDirectory%@",documentsDirectory);
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testDirectory = [documentsDirectory :@"test"];
// 創建目錄
[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];

4.2 、 在test目錄下創建文件

創建文件怎麼辦呢?接著上面的代碼 testPath 要用拼接上你要生成的文件名,比如test11.txt。這樣才能在test目錄下寫入文件。
testDirectory是上面代碼生成的路徑哦,不要忘了。我往test文件夾里寫入三個文件,test11.txt ,test22.txt,text.33.txt。內容都是寫入內容,write String。
實現代碼如下:

NSString *testPath1 = [testDirectory :@"test1.txt"];
NSString *testPath2 = [testDirectory :@"test2.txt"];
NSString *testPath3 = [testDirectory :@"test3.txt"];

NSString *string = @"寫入內容,write String";

[fileManager createFileAtPath:testPath1 contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
[fileManager createFileAtPath:testPath2 contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
[fileManager createFileAtPath:testPath3 contents:[string dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];

4.3獲取目錄列里所有文件名
兩種方法獲取:subpathsOfDirectoryAtPath 和 subpathsAtPath

NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSLog(@"documentsDirectory%@",documentsDirectory);
NSFileManager *fileManage = [NSFileManager defaultManager];
NSString *myDirectory = [documentsDirectory :@"test"];
//方法一
NSArray *file = [fileManage subpathsOfDirectoryAtPath: myDirectory error:nil];
NSLog(@"%@",file);
//方法二
NSArray *files = [fileManage subpathsAtPath: myDirectory ];
NSLog(@"%@",files);

獲取剛才test目錄下的所以文件名:

兩種方法都是輸出

(
"test1.txt",
"test2.txt",
"test3.txt"
)

4.4 、fileManager使用操作當前目錄

//創建文件管理器
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
//更改到待操作的目錄下
[fileManager changeCurrentDirectoryPath:[documentsDirectory stringByExpandingTildeInPath]];

//創建文件fileName文件名稱,contents文件的內容,如果開始沒有內容可以設置為nil,attributes文件的屬性,初始為nil
NSString * fileName = @"testFileNSFileManager.txt";
NSArray *array = [[NSArray alloc] initWithObjects:@"hello world",@"hello world1", @"hello world2",nil];

//下面是將數組類型轉換為NSData類型
NSMutableData *data = [[NSMutableData alloc] init];
for (int i = 0; i < [array count]; ++i ){
NSString *str = [array objectAtIndex:i];
NSData *temp = [str dataUsingEncoding:NSUTF8StringEncoding];
[data appendData:temp];
}
//注意contents參數的類型是NSData類型
[fileManager createFileAtPath:fileName contents:data attributes:nil];

4.5 刪除文件
接著上面的代碼就可以將剛新建的 testFileNSFileManager.txt文件刪除!

[fileManager removeItemAtPath:fileName error:nil];

4.6 混合數據的讀寫 請參看原文最後面的內容。

『貳』 ios 怎麼獲取工程里的.caf 文件

獲取工程里的.caf文件,可以分為單獨獲取某個.caf文件和獲取全部.caf:

1、單獨獲取某個.caf文件

注意:要獲取工程文件的時候,要確保文件已經被添加到工程里!

『叄』 ios開發怎麼讀取plist文件

首先要知道讀取plist文件的方法,一般來說,使用代碼

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"listFileName" ofType:@"plist"];
NSArray *array = [[NSArray alloc] initWithContentsOfFile:plistPath];
NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

已經足夠了,此時可以使用NSLog常式查看array和dictionary的內容。不過,有時候受plist文件內容的限制,array內容可能為空。

其實,用dictionary就已經足夠了,在下面的例子里我們也只用dictionary。

1、運行Xcode4.2,新建一個Single View Application,名稱為ReadPlistFile,其他設置如下圖:

2、新建我們自己的plist文件:

File —> New —> New File,選擇Mac OS X下的Property List

文件名為 customInfo,Group選擇Supporting Files。

3、單擊新建的customInfo.plist,我們添加數據,如下圖:

注意,Type一項的類型,選擇的是Dictionary,以Source Code打開,顯示如下:

<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>Student</key>
<dict>
<key>Name</key>
<string>Yang</string>
<key>Sex</key>
<string>Male</string>
<key>Num</key>
<string>SX_010</string>
</dict>
<key>Mentor</key>
<dict>
<key>Name</key>
<string>Gu</string>
<key>Sex</key>
<string>Male</string>
</dict>
</dict>
</plist>

4、為視圖添加控制項:

單擊BIDViewController.xib,打開IB,拖幾個控制項上去,並設置好布局,如下圖:

上圖中所有的控制項都是Label,並設置了字體大小。

5、接下來就是映射唄,把五個灰色的Label都映射到BIDViewController.h文件中,類型都是OutLet,名稱依次是stuName,stuSex,stuNum,mtName,mtSex。

6、單擊BIDViewController.m,在viewDidLoad方法中的[super viewDidLoad]之後添加如下代碼:

//首先讀取studentInfo.plist中的數據
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"customInfo" ofType:@"plist"];
NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];

//將學生信息填入視圖
NSDictionary *tmpInfo = [dictionary objectForKey: @"Student"];
self.stuName.text = [NSString stringWithFormat:@"%@", [tmpInfo objectForKey: @"Name"]];
self.stuSex.text = [NSString stringWithFormat:@"%@", [tmpInfo objectForKey: @"Sex"]];
self.stuNum.text = [NSString stringWithFormat:@"%@", [tmpInfo objectForKey: @"Num"]];

//將導師信息寫入視圖
tmpInfo = [dictionary objectForKey: @"Mentor"];
self.mtName.text = [NSString stringWithFormat:@"%@", [tmpInfo objectForKey: @"Name"]];
self.mtSex.text = [NSString stringWithFormat:@"%@", [tmpInfo objectForKey: @"Sex"]];

7、運行,查看效果:

『肆』 ios 獲取文件目錄路徑方法大全

我們的app在手機中存放的路徑是:/var/mobile/Applications/4434-4453A-B453-4ADF535345ADAF344後面的目錄4434-4453A-B453-4ADF535345ADAF344是iPhone自動生成的,裡麵包含了四個文件夾: (1)AppName.app 目錄:這是應用程序的程序包目錄,包含應用程序本身。由於應用改程序必須經過簽名。所以再運行程序時,是不可以對這個目錄進行內容修改的,否則會造成應用無法啟動。 (2)Documents目錄:這是文檔目錄。有關應用的所有數據文件應該寫入到這個目錄下,這個目錄用於存儲用戶數據或者其他應該定期備份的信息。iTunes會同步改應用程序的此文件內容,適合存儲一些重要的數據 (3)Libarary目錄:庫目錄,這個目錄下面還有兩個子目錄:Caches 和 Preferences Preferences 目錄:包含應用程序的編號設置文件,存放NSUserDefaults保存的.plist文件。iTunes同步該應用時會同步該文件夾中的內容。 Caches 目錄:緩存目錄。用於存儲應用程序專用的支持文件,保存應用程序再次啟動過程中需要的信息。ITunes不會同步改文件夾,保存一些不需要備份的數據 (4)tmp目錄:臨時目錄。這個目錄用於存放臨時文件,保存應用程序再次啟動過程中不再需要的信息。iTunes不會同步此文件夾,系統可能在應用沒運行時就刪除該目錄下的文件,所以此目錄適合保存應用中的一些臨時文件,用完就刪除。 下面就是這些文件夾獲取路徑的方法: 例子: //下面是對該文件進行制定路徑的保存 //取得一個目錄下得所有文件名 //讀取某個文件 //或者 } Documents(NSDocumentDirectory)//用於寫入應用相關數據文件的目錄,在ios中寫入這里的文件能夠與iTunes共享並訪問,存儲在這里的文件會自動備份到雲端 Library/Caches(NSCachesDirectory)//用於寫入應用支持文件的目錄,保存應用程序再次啟動需要的信息。iTunes不會對這個目錄的內容進行備份 tmp(use NSTemporaryDirectory())//這個目錄用於存放臨時文件,只程序終止時需要移除這些文件,當應用程序不再需要這些臨時文件時,應該將其從這個目錄中刪除 Library/Preferences//這個目錄包含應用程序的偏好設置文件,使用 NSUserDefault類進行偏好設置文件的創建、讀取和修改

『伍』 DSYM文件

iOS平台中,dSYM文件是指具有調試信息的目標文件,文件名通常為:xxx.app.dSYM。如下圖所示:

為了方便找回Crash對應的dSYM文件和還原堆棧,建議每次構建或者發布APP版本的時候, 備份好dSYM文件

Bugly還原Crash堆棧時,需要根據UUID來匹配符號表文件,因此只有上傳的符號表文件的UUID與Crash對應APP的UUID一致時,才能准確地對堆棧進行還原。

通過命令查看UUID

通過符號表文件查看UUID
符號表文件的UUID與dSYM文件的UUID是一致的,因譽岩此可以通過符號表工具生成的符號表文件來查看dSYM文件的UUID:

生成符號表文件(.zip) ---> 解壓符號表文件(.symbol) ---> 使用文本編輯器打開符號表文件

其中符號表文件的「UUID」信息即Debug SO文件的UUID,亦是符號表文件的UUID,如果文件較大,建議使用「Sublime Text」等文本編輯器來打開符號表文件。

當我們軟體 release 模式打包或上線後,不會像我們在 Xcode 中那樣直觀的看到用崩潰的錯誤,這個時候我們就需薯跡要分析 crash report 文件了,iOS 設備中會有日誌文件保存我們每個應用出錯的函數內存地址,通過 Xcode 的 Organizer 可以將 iOS 設備中的 DeviceLog 導出成 crash 文件,這個時候我們就可以通過出錯的數虛並函數地址去查詢 dSYM 文件中程序對應的函數名和文件名。大前提是我們需要有軟體版本對應的 dSYM 文件,這也是為什麼我們很有必要保存每個發布版本的 Archives 文件了。

符號集是我們對ipa文件進行打包之後,和.app文件同級的後綴名為.dSYM的文件,這個文件必須使用Xcode進行打包才有。

每一個.dSYM文件都有一個UUID,和.app文件中的UUID對應,代表著是一個應用。而.dSYM文件中每一條崩潰信息也有一個單獨的UUID,用來和程序的UUID進行校對。

我們如果不使用.dSYM文件獲取到的崩潰信息都是不準確的。

符號集中存儲著文件名、方法名、行號的信息,是和可執行文件的16進制函數地址對應的,通過分析崩潰的.Crash文件可以准確知道具體的崩潰信息。
我們每次Archive一個包之後,都會隨之生成一個dSYM文件。每次發布一個版本,我們都需要備份這個文件,以方便以後的調試。進行崩潰信息符號化的時候,必須使用當前應用打包的電腦所生成的dSYM文件,其他電腦生成的文件可能會導致分析不準確的問題。

當程序崩潰的時候,我們可以獲得到崩潰的錯誤堆棧,但是這個錯誤堆棧都是0x開頭的16進制地址,需要我們使用Xcode自帶的symbolicatecrash工具來將.Crash和.dSYM文件進行符號化,就可以得到詳細崩潰的信息。

https://www.jianshu.com/p/0b6f5148dab8

http://foggry.com/blog/2015/07/27/ru-he-shou-dong-jie-xi-crashlog/

『陸』 iOS系統如何實現網路數據抓包

在進行iOS開發過程中,經常會遇到各種各樣的網路訪問問題,以前苦於沒有抓包工具,很多網路問題解決起來很痛苦。現在終於好了,本文提供兩種方式進行網路抓包:

1. 網路共享 + 可視化抓包工具

基本原理
原理比較簡單,ios設備通過代理方式共享連接mac電腦的無線網卡,使用抓包工具抓包,然後進行分析(我們推薦使用Wireshark,在MAC系統上也可以使用Paros工具)。

現在以MAC系統下Paros工具為例,詳細描述下抓包過程:

操作步驟
1) 首先將MAC電腦的乙太網共享給airport,使iOS設備能夠通過wifi連接

打開系統偏好設置,找到共享,選擇internet共享,在右側「通過以下方式將」選擇乙太網,「連接共享給其他電腦」選擇airPort。

2) 打開paros ,設置paros的本地代理paros下載地址(http://www.parosproxy.org/)

在paros的tools-》options中選擇local proxy,在Address 中輸入AirPort的ip地址。輸入埠8080。打開系統偏好設置,找到網路,選擇左側的AirPort,可以看到AirPort的地址為169.254.69.225,將該地址填入到上面提到的Address欄中。

3) 使用ios設備連接mac共享出來的網路:在iOS設備中,選擇設置-》通用-》網路-》wifi,找到共享的網路,加入。然後在該網路的纖細內容中的http代理部分,選擇手動,輸入paros中設置的代理ip和埠。

4) 下面就可以使用paros來監控iOS設備的網路,我們打開Safiri,在paros中即可察看到網路的所有請求。

2. tcpmp命令 + 可視化抓包工具

基本原理
tcpmp命令是一個網路的抓包的命令行,他能指定具體的設備,也能制定具體的五元組進行捕獲鏈路上的數據包。它可以再終端上列印出來也可以將捕獲到得數據寫入到一個文件,文件的格式是二進制形式,所以,我在打開該文件的時候才用的工具是UltraEdit。

當然也可以保存成Wireshark能夠識別的pcap格式,然後使用Wireshark進行查看。

操作步驟
1) 採用ssh登陸iphone手機,使用top命令獲取:

具體步驟如下:

a) 獲取設備IP地址(wifi地址):

b) 在PC上打開終端,輸入ssh root@IP地址:

輸入密碼:alpine (root用戶的默認密碼)

2) 通過「tcpmp -X -s0 -w /data.pcap」命令將tcp數據包保存到iOS設備的根目錄下。

3) 通過91助手等工具取出pcap文件,在Windows下使用雙擊使用Wireshark打開查看。

當然也可以不輸出到文件,tcpmp的命令格式和參數說明:

tcpmp [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 文件名 ]

[ -i 網路介面 ] [ -r 文件名] [ -s snaplen ]

[ -T 類型 ] [ -w 文件名 ] [表達式 ]

選型介紹:

-a 將網路地址和廣播地址轉變成名字;

-d 將匹配信息包的代碼以人們能夠理解的匯編格式給出;

-dd 將匹配信息包的代碼以c語言程序段的格式給出;

-ddd 將匹配信息包的代碼以十進制的形式給出;

-e 將捕獲的包數顯示出來

-f 將外部的Internet地址以數字的形式列印出來;

-l 使標准輸出變為緩沖行形式;

-n 不把網路地址轉換成名字;

-t 在輸出的每一行不列印時間戳;

-v 輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息;

-vv 輸出詳細的報文信息;

-c 在收到指定的包的數目後,tcpmp就會停止;

-F 從指定的文件中讀取表達式,忽略其它的表達式;

-i 指定監聽的網路介面;

-r 從指定的文件中讀取包(這些包一般通過-w選項產生);

-w 直接將包寫入文件中,並不分析和列印出來;

-T 將監聽到的包直接解釋為指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網路管理協議;)

在使用該命令的時候,我主要使用的主要選項是: -i [介面名] -w [文件名] -v -vv -c -X -e

例如:

我在從eth0捕獲100個數據包的時候,並將數據寫入到capture.cap文件中,命令格式為:

tcpmp -i eth0 -w capture.cap -v -vv -c 100 -X -e

抓取一個一個ip段之間的數據包:

tcpmp –s 0 –w socket host 10.1.3.9 and host 10.1.3.84

如果從eth0且通信協議埠為22,目標IP為192.168.1.100獲取數據:

tcpmp -i eth0 port 22 and src host 192.168.1.100

此外還有其他的一些關鍵詞:host,(主機) , net( 網關), port(埠) , src(源IP) , dst(目的IP), 正則表達式:and , or。

閱讀全文

與ios獲取文件名相關的資料

熱點內容
蘋果手機怎麼傳數據到新手機相冊 瀏覽:50
5s升級ios92無服務 瀏覽:354
ubuntu翻譯工具 瀏覽:665
wifi安裝教程 瀏覽:398
蘋果有些qq文件打不開 瀏覽:139
微信分身圖片緩存在哪個文件 瀏覽:544
眾籌用什麼網站 瀏覽:1
天馬座的幻想版本 瀏覽:536
微雲保存文件圖片沒有了 瀏覽:236
如何把excel表格圖片導出到文件夾 瀏覽:387
qq三國快速升級攻略 瀏覽:660
js監聽手機home事件 瀏覽:439
第2章linux的桌面管理副本 瀏覽:452
qq郵箱手機上登錄微信賬號密碼錯誤 瀏覽:627
編程如何讓人物重復發射子彈 瀏覽:853
db2查看錶空間文件 瀏覽:607
ps文件界面設置 瀏覽:779
c語言12位的數據應該怎麼存儲 瀏覽:953
將ape導入iphone 瀏覽:107
js組合快捷鍵 瀏覽:174

友情鏈接