Xcode 6 में, मेरे पास एक ऐप है जिसमें मैं Core Data का उपयोग कर रहा हूं, लेकिन iOS 8 iPhone सिम्युलेटर के लिए एप्लिकेशन समर्थन में कोई फ़ोल्डर नहीं है। मेरी फ़ाइलें और कोर डेटा साइक्लाइट डेटाबेस कहाँ संग्रहीत किए जा रहे हैं?
Xcode 6 में, मेरे पास एक ऐप है जिसमें मैं Core Data का उपयोग कर रहा हूं, लेकिन iOS 8 iPhone सिम्युलेटर के लिए एप्लिकेशन समर्थन में कोई फ़ोल्डर नहीं है। मेरी फ़ाइलें और कोर डेटा साइक्लाइट डेटाबेस कहाँ संग्रहीत किए जा रहे हैं?
जवाबों:
सिम्युलेटर निर्देशिका Xcode 6 बीटा के साथ स्थानांतरित कर दी गई है ...
~/Library/Developer/CoreSimulator
निर्देशिका को अपने ऐप के दस्तावेज़ फ़ोल्डर में ब्राउज़ करना थोड़ा अधिक कठिन है, उदाहरण के लिए,
~/Library/Developer/CoreSimulator/Devices/4D2D127A-7103-41B2-872B-2DB891B978A2/data/Containers/Data/Application/0323215C-2B91-47F7-BE81-EB24B4DA7339/Documents/MyApp.sqlite
~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
#if DEBUG NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]; NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName]; remove([aliasPath UTF8String]); [[NSFileManager defaultManager]createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil]; #endif
अब मुझे एक सिमलिंक मिल गया है जो काम करता है, भले ही iOS8 + XCode6 मेरे ऐप के डेटा GUID को हर बार बदलता है।
xcrun simctl list
आदेश सिम्युलेटर नाम और डिवाइस UDIDs के बीच पत्राचार को देखने के लिए इस्तेमाल किया जा सकता। या अधिक विशेष रूप से xcrun simctl list devices
कमांड।
मैं आपको सुझाव दूंगा कि आप अपने सिमुलेटर फ़ाइलों को खोजने के लिए SimPenders का उपयोग करें। यह एक मेनू बार आइटम है जो आपके सिम्युलेटर ऐप्स को ट्रैक करता है और आपको सीधे उनके फ़ोल्डर्स और सामग्री पर जाने देता है। यह विस्मयकारी है।
मुझे SimulatorManager एप्लिकेशन बहुत उपयोगी लगा। यह आपको सीधे इंस्टॉल किए गए सिमुलेटर के एप्लिकेशन फ़ोल्डर में ले जाता है। मैंने 7.1, 8.0 और 8.1 सिमुलेटर के साथ प्रयास किया है।
सिमुलेटरमैनेजर सिस्टम ट्रे में एक आइकन के रूप में रहता है और "लॉन्च एट लॉगइन" का विकल्प प्रदान करता है।
नोट : यह केवल Xcode 6 (मेरे मामले में 6.1.1) और इसके बाद के संस्करण के साथ काम करता है।
उम्मीद है की वो मदद करदे!
यह जानने के लिए कि आपके .sqlite फ़ाइल को आपके AppDelegate.m में कहाँ संग्रहीत किया गया है, निम्नलिखित कोड जोड़ें
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
अब इस विधि को AppDelegate.m में कॉल करें
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//call here
[self applicationDocumentsDirectory];
}
मैंने इसके साथ कुछ समय के लिए कुश्ती की। यह केवल मेरे स्थानीय साइक्लाइट डीबी को पाने के लिए एक बहुत बड़ा दर्द बन गया। मैंने यह स्क्रिप्ट लिखी और इसे XCode के अंदर कोड स्निपेट बना दिया। मैं इसे अपने AppDidFinishLaunching के अंदर अपने appDelegate के अंदर रखता हूं।
//xcode 6 moves the documents dir every time. haven't found out why yet.
#if DEBUG
NSLog(@"caching documents dir for xcode 6. %@", [NSBundle mainBundle]);
NSString *toFile = @"XCodePaths/lastBuild.txt"; NSError *err = nil;
[DOCS_DIR writeToFile:toFile atomically:YES encoding:NSUTF8StringEncoding error:&err];
if(err)
NSLog(@"%@", [err localizedDescription]);
NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName];
remove([aliasPath UTF8String]);
[[NSFileManager defaultManager] createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil];
#endif
यह आपके ड्राइव के रूट पर एक simlink बनाता है। (आपको पहली बार इस फ़ोल्डर को स्वयं बनाना होगा, और इसे चोदना होगा, या आप स्थान को किसी अन्य स्थान पर बदल सकते हैं) फिर इसे स्थापित करें xcodeway प्लगइन https://github.com/onmyway133/XcodeWay
मैंने इसे थोड़ा संशोधित किया ताकि यह मुझे cmd + d को बस दबाने की अनुमति देगा और यह मेरे वर्तमान एप्लिकेशन के लगातार दस्तावेज़ निर्देशिका के लिए एक खोजक वाइन्डर खोलेगा। इस तरह, कोई फर्क नहीं पड़ता कि कितनी बार XCode आपके पथ को बदलता है, यह केवल रन पर बदलता है, और यह प्रत्येक रन पर तुरंत आपके सिमलिंक को अपडेट करता है।
मुझे आशा है कि यह दूसरों के लिए उपयोगी है!
खोजक खोलें> लाइब्रेरी> डेवलपर> कोरसिम्युलेटर> उपकरण
फिर फाइंडर से अरेंजमेंट आइकन को बदलें तिथि जोड़ें
अपना एप्लिकेशन> डेटा> कंटेनर> डेटा> एप्लिकेशन> चुनें
अपना ऐप चुनें> डॉक्यूमेंट्स> यहां आपकी डीबी फाइल है
मेरे मामले में:
/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite
अन्यथा ऐसा करें:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
- यह डेटा फ़ोल्डर के लिए पूर्ण पथ मुद्रित करेगा।
स्विफ्ट:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
फाइंडर का उपयोग करें -> फोल्डर पर जाएं और एप्लिकेशन फोल्डर तक पहुंचने के लिए दिए गए बेसपे को एंटर करें
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"%@",basePath);
सिम्युलेटर फ़ाइल को ~ / लाइब्रेरी / डेवलपर / कोरसिम्युलेटर / डिवाइसेस / ... में डालता है लेकिन / डिवाइसेस के बाद का पथ सभी के लिए अलग है।
इस आसान विधि का उपयोग करें। यह वर्तमान उपयोगकर्ता के लिए अस्थायी निर्देशिका का पथ देता है और कोई तर्क नहीं लेता है।
NSString * NSTemporaryDirectory ( void );
इसलिए मेरे ViewController वर्ग में मैं आमतौर पर अपने viewDidLoad में इस लाइन को केवल एक संदर्भ के लिए रखता हूं जब मुझे अपनी CoreData संग्रहीत फ़ाइल को हथियाने की आवश्यकता होती है। उम्मीद है की यह मदद करेगा।
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(नोट: खोजकर्ता मेनू से पथ पर जाने के लिए, गो पर क्लिक करें और छिपी निर्देशिका को खोलने के लिए ~ / लाइब्रेरी टाइप करें फिर खोजक विंडो में आप अपने कंसोल पर दिखाए गए पथ पर क्लिक कर सकते हैं।)
यह स्थान एक बार फिर से बदल गया है, यदि स्विफ्ट का उपयोग कर रहा है, तो यह पता लगाने के लिए इसका उपयोग करें कि फ़ोल्डर कहाँ है (यह AppDelegate.swift फ़ाइल से कॉपी किया गया है जो Apple आपके लिए बनाता है यदि यह आपके मशीन पर काम नहीं करता है, तो खोज करें सही वाक्यविन्यास के लिए वह फ़ाइल, यह Xcode 6.1 और iOS 8 सिम्युलेटर का उपयोग करके मेरा काम करता है):
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
सिमुलेटर के तहत स्थित हैं:
~/Library/Developer/CoreSimulator/
यहां, उन्हें UUID नामों वाली निर्देशिका के रूप में सूचीबद्ध किया गया है। नवीनतम को खोजने के लिए 'तिथि संशोधित' द्वारा सॉर्ट का उपयोग करें। अंदर नेविगेट करने के लिए:
/data/Containers/Data/Application/
यहां आपको उस डिवाइस पर सभी एप्लिकेशन की एक सूची मिलेगी। आप नवीनतम एप्लिकेशन प्राप्त करने के लिए इसे फिर से सॉर्ट कर सकते हैं।
नोट: हर बार जब आप ऐप चलाते हैं, तो Xcode निर्देशिका नाम बदल देता है, इसलिए डेस्कटॉप पर उपनाम / शॉर्ट कट बनाने पर भरोसा न करें।
सबसे आसान तरीका है यहां ऐप का इस्तेमाल करना , जो सबकुछ अपने आप करता है।
मैंने यह स्क्रिप्ट बनाई है जो किसी भी सिम्युलेटर के लिए बनाए गए नवीनतम ऐप को ज़िप करेगा और इसे डेस्कटॉप पर ज़िप करेगा।
https://gist.github.com/Gerst20051/8ca49d5afbf09007b3696fab6e9f425c
#!/bin/bash
DESTINATION_DIR="$HOME/Desktop"
APP_PATH=$(find ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Bundle/Application/*/*.app -type d -maxdepth 0 -print0 | xargs -0 ls -td | head -n1)
APP_DIRNAME=$(dirname "$APP_PATH")
APP_BASENAME=$(basename "$APP_PATH")
FILE_NAME="${APP_BASENAME%.*}"
cd "$APP_DIRNAME"
zip -qr "$DESTINATION_DIR/$FILE_NAME.zip" "$APP_BASENAME"
स्विफ्ट 4 या स्विफ्ट 5 में आप उपयोग कर सकते हैं NSHomeDirectory()
।
Xcode 10 (या Xcode 11) में सबसे आसान तरीका आपके ऐप को रोकना है (जैसे कि जब यह ब्रेकपॉइंट मारता है) और इस लाइन को डीबगर कंसोल में चलाएं:
po NSHomeDirectory()
po
प्रिंट ऑब्जेक्ट के लिए खड़ा है और अधिकांश चीजों को प्रिंट करता है
1. NSTemporaryDirectory() gives this:
/Users/spokaneDude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/199B1ACA-A80B-44BD-8E5E-DDF3DCF0D8D9/tmp
2. remove "/tmp" replacing it with "/Library/Application Support/<app name>/" --> is where the .sqlite files reside
स्विफ्ट 4 के साथ, आप अपने ऐप की होम डायरेक्टरी पाने के लिए नीचे दिए गए कोड का उपयोग कर सकते हैं। आपके ऐप की डॉक्यूमेंट डायरेक्टरी वहां मौजूद है।
print(NSHomeDirectory())
मुझे लगता है कि आप पहले से ही जानते हैं कि आपके ऐप की होम डायरेक्टरी परिवर्तनशील है, इसलिए यदि आप अपने कोडबेस में अतिरिक्त कोड नहीं जोड़ना चाहते हैं, तो SimPholder आपके लिए एक अच्छा टूल है।
और आगे, आपको आश्चर्य हो सकता है कि एक उपकरण है, जो आपके ऐप के होम डायरेक्टरी को बदलने के बाद हर बार उसी SQLite डेटाबेस को बंद करने और फिर से खोलने से समय बचाने में मदद कर सकता है। और जवाब हाँ है, एक उपकरण मुझे पता है कि SQLiteFlow है । यह दस्तावेज़ से, यह कहता है कि:
डेटाबेस फ़ाइल नाम या निर्देशिका परिवर्तन संभालें। यह SQLiteFlow iOS सिम्युलेटर में आपके SQLite डेटाबेस के साथ काम कर सकता है।
यहाँ अंतिम प्रयुक्त सिम्युलेटर और अनुप्रयोग के लिए sh है । बस sh चलाएं और मुद्रित पाठ और कॉपी पेस्ट करें और खोजक में शो के लिए कमांड चलाएं।
#!/bin/zsh
lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
echo $lastUsedSimulatorAndApplication