سؤال

أحاول إنشاء مجلد داخل مجلد /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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top