NSFileManager إنشاء مجلد (خطأ الكاكاو 513.)
-
27-09-2019 - |
سؤال
أحاول إنشاء مجلد داخل مجلد /Sounds في تطبيقي.
-(void)productPurchased:(UAProduct*) product {
NSLog(@"[StoreFrontDelegate] Purchased: %@ -- %@", product.productIdentifier, product.title);
NSFileManager *manager = [NSFileManager defaultManager];
NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSError *error;
NSString *dataPath = [NSString stringWithFormat:@"%@/sounds/%@", bundleRoot, product.title];
if (![manager fileExistsAtPath:dataPath isDirectory:YES]) {
[manager createDirectoryAtPath:dataPath withIntermediateDirectories:YES attributes:nil error:&error];
NSLog(@"Creating folder");
}
NSLog(@"%@", error);
}
لكني أحصل على هذا الخطأ:
Error Domain=NSCocoaErrorDomain Code=513 "The operation couldn’t be completed. (Cocoa error 513.)" UserInfo=0x175120 {NSFilePath=/var/mobile/Applications/D83FDFF9-2600-4056-9047-05F82633A2E4/App.app/sounds/Test Tones, NSUnderlyingError=0x117520 "The operation couldn’t be completed. Operation not permitted"}
ما الخطأ الذي افعله؟ شكرًا.
المحلول
إذا بحثت عن Google في مجال الخطأ NSCocoaErrorDomain
تجد أن الرمز 513
يترجم إلى الخطأ NSFileWriteNoPermissionError
.
هذا يوفر لك الفكرة الحاسمة لحل هذه المشكلة:
على وجه التحديد ، لا يمكنك تعديل محتويات مجلد حزمة التطبيق المترجمة. هذا لأن الحزمة هي التطبيق المترجم.
عندما تقوم في النهاية بتوزيع التطبيق من خلال متجر تطبيقات iTunes ، يحتوي التطبيق على توقيع رقمي يقوم بالتحقق من صحة محتويات التطبيق. يتم إنشاء هذا التوقيع في وقت الترجمة.
إذا حاولت تغيير الحزمة بعد التجميع ، فإن التطبيق يتغير ولم يعد التوقيع الرقمي صالحًا. هذا يبطل التطبيق - من يعرف ما هو الكود الموجود هناك ، أليس كذلك؟ - ولن يتمكن المستخدمون النهائيون من تشغيله. لذلك قامت Apple بإعداد iOS لرمي خطأ إذا حاولت تعديل الحزمة.
بدلاً من الكتابة إلى الحزمة ، يمكن لتطبيقك الكتابة إليه واحد من ثلاثة مجلدات خاصة بالتطبيقات: Documents
, Temp
و Cache
. على الأرجح ، سترغب في الكتابة إلى Documents
مجلد.
لا يمكن الوصول إلى هذه المجلدات إلا لتطبيقك. لا يمكن لأي تطبيق آخر الوصول إلى محتويات هذه المجلدات. (وبالمثل ، لا يمكن تطبيقك الوصول إلى مجلدات تطبيق آخر.)
يمكنك إعداد تطبيقك للسماح للمستخدم النهائي بإدارة الوصول إلى بيانات الملف عبر iTunes ، عبر دعم مشاركة ملفات سطح المكتب.
نصائح أخرى
هذا لأنه يجب ألا تعدل حزمة تطبيقك في وقت التشغيل. بدلاً من ذلك ، يجب أن يكون لديك مجلد في مكان آخر حيث يمكنك إضافة موارد.
تعديل:
الخطأ الذي تراه على الأرجح لأنه لا يمكنك الكتابة إلى الحزمة.
أواجه نفس المشكلة ، عند استخدام أ سجل مكتبة. أخيرًا ، إنها مشكلة تنسيق المسار. افحص ال dataPath
صيغة. اذا كانت Case 1
, ، إنه صالح. في حالتي ، إنه Case 2
, ، لذلك فشلت في إنشاء دليل.
// Case 1
/var/mobile/Containers/Data/Application/5FB2CD2D-91DC-4FB2-8D6F-06369C70BB4A/Library/Caches/AppLogs
// Case 2, invalid format
file://var/mobile/Containers/Data/Application/5FB2CD2D-91DC-4FB2-8D6F-06369C70BB4A/Library/Caches/AppLogs
إذا dataPath
لديه بادئة ، على سبيل المثال: file://
, ، أنه غير صالحة.
أما بالنسبة لمثيل NSURL
, path
سيعود السلسلة مثل case 1
, ، و absolutePath
سيعود السلسلة مثل case 2
.