تطبيق lauching مع url (عبر uiapplicationDelegate's HandlePenurl) يعمل بموجب iOS 4 ، ولكن ليس بموجب iOS 3.2

StackOverflow https://stackoverflow.com/questions/3612460

سؤال

لقد قمت بتنفيذ UiapplicationDelegate's

application:didFinishLaunchingWithOptions:

و

application:handleOpenURL:

وفقا للمواصفات ، أي ،

application:didFinishLaunchingWithOptions:
returns YES 

و

application:handleOpenURL: opens the URL. 

يعمل الرمز بموجب iOS 4 (في كلتا الحالتين ، أي عندما يتم إطلاق التطبيق وعندما يصبح نشطًا من الحالة المعلقة). ومع ذلك ، فإن الكود لا يعمل بموجب iOS 3.2.

هل كانت مفيدة؟

المحلول

أعطي إجابة على سؤالي. اكتشفني أن الحل استغرق بعض الوقت وكان محبطًا للغاية. إذا قمت بإجراء بحث على الإنترنت ، فستجد بعض الإجابات الجزئية ، لكن الأمر لا يزال يستغرق مني بعض الوقت للعمل على الحل التالي وآمل أن يضيف بعض الوضوح.

أولاً ، يبدو أن السلوك الموصى به لتطبيقك هو ما يلي (انظر فتح أنواع الملفات المدعومة في iOS Ref Lib):

  • لا تنفذ applicationDidFinishLaunching: (انظر الملاحظة في UiapplicationDelegate).
  • ينفذ application:didFinishLaunchingWithOptions: وتحقق من عنوان URL ، ارجع نعم إذا كنت تستطيع فتحه ، وإلا لا ، ولكن لا تفتحه.
  • ينفذ application:handleOpenURL: وافتح عنوان URL ، ارجع نعم إذا نجحت ، وإلا لا.

في نظام التشغيل iOS 4 ، يؤدي تمرير عنوان URL إلى التطبيق إلى أحد السلوكيات التالية:

  • إذا تم إطلاق التطبيق ثم application:didFinishLaunchingWithOptions: يسمى و application:handleOpenURL: يسمى إذا و application:didFinishLaunchingWithOptions: عاد نعم.
  • إذا أصبح التطبيق نشطًا من الحالة المعلقة بعد ذلك application:didFinishLaunchingWithOptions: لا يسمى ولكن application:handleOpenURL: يسمى.

ومع ذلك ، في iOS 3.2 يبدو كما لو application:handleOpenURL: لا يسمى أبدا! تلميح إلى أن السلوك مختلف بموجب iOS 3.2 يمكن العثور عليه في التعامل مع طلبات URL. هناك تجد ذلك application:handleOpenURL: يسمى إذا application:didFinishLaunchingWithOptions: لم ينفذ ، ولكن applicationDidFinishLaunching: تم تنفيذه. ولكن application:handleOpenURL: لا يسمى إذا application:didFinishLaunchingWithOptions: تم تنفيذه.

وبالتالي ، فإن حل واحد لجعل الكود يعمل تحت 3.2 و 4.0 هو:

  • افتح عنوان URL في application:didFinishLaunchingWithOptions:, ، ولكن بعد ذلك العودة لا لمنع ذلك application:handleOpenURL: يسمى.
  • افتح عنوان URL في application:handleOpenURL:, ، في حال كنت أقل من 4.0 وكان التطبيق في حالة تعليق.

لقد وجدت هذا الحل في منشور آخر ، لكنني كنت مرتبكًا ، لأنه يتناقض مع التوصية الواردة في وثائق iOS Ref Lib (أي أنه يجب علينا العودة بنعم في application:didFinishLaunchingWithOptions:). (في تلك المرحلة لم أدرك أن الوثائق تتناقض معها).

أعتقد أن سلوك iOS 4.0 الحالي سيكون السلوك المستقبلي الذي أفضل الحل التالي:

  • لا تنفذ applicationDidFinishLaunching:.
  • ينفذ application:didFinishLaunchingWithOptions: وتحقق من عنوان URL ، ارجع نعم إذا كنت تستطيع فتحه ، وإلا لا ، ولكن لا تفتحه. إذا كنا على 3.2 ، افتح عنوان URL.
  • ينفذ application:handleOpenURL: وافتح عنوان URL ، ارجع نعم إذا نجحت ، وإلا لا.

لذا باختصار ، أقوم بتنفيذ سلوك iOS 4 وأضفت السطر التالي إلى application:didFinishLaunchingWithOptions:

    if([[[UIDevice currentDevice] systemVersion] hasPrefix:@"3.2"]) {
        [self application:application handleOpenURL:url];
    }

مما يجعل الكود يعمل تحت 3.2.

نصائح أخرى

application:handleOpenURL: تم إهماله الآن.

اعتبارًا من iOS 4.2 ، يمكنك استخدام هذا لفتح عناوين URL:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

توثيق:

https://developer.apple.com/library/ios/#documentation/uikit/reference/uiapplicationdelegate_protocol/reference/reference.html

بدأت في كتابة التطبيق الذي استخدم Dropbox API. لفهم المفهوم ، قمت بتشغيل تطبيق عينة باستخدام المفتاح/السر المذكور في Dropbox/Developer توثيق. بمجرد بدء تشغيل تطبيق التطبيق ، استخدمت نفس المفتاح/القيم السرية لتطبيقي.

لتطبيق عينة ، يتم تنفيذ تنفيذ مقبض المقبض (أو OpenUrl على iOS 4.2) كما هو متوقع. لسبب غريب ، لم يكن هذا هو الحال بالنسبة لتطبيقي. أدخل تطبيقي الخلفية لإظهار شاشة تسجيل الدخول وصفحة المصادقة في Dropbox. بعد تسجيل الدخول والمصادقة الناجحين ، لم يدخل تطبيقي المقدمة. كان هذا صحيحًا لكل من محاكاة النظام الأساسي والجهاز (iPad)

جربت كل شيء تقريبًا مدرجًا على الإنترنت بما في ذلك هذا المنشور. شكرًا. لم يكن هناك نجاح ، رغم ذلك.

في النهاية ، بدأت العمل في طلبي عندما فعلت:

  • على Simulator ، حدد "iOS Simulator -> إعادة تعيين المحتوى والإعدادات" ، وإعادة تعيين.
  • على الجهاز ، قمت بحذف عينة من التطبيق القابل للتنفيذ والذي بدوره حذف ذاكرة التخزين المؤقت المرتبطة به.

أضف ما يلي إلى نهاية application:DidFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    ...    

    NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
    if (url != nil && [url isFileURL]) {
        return YES;
    }  else return NO;
} // End of application:didFinishLaunchingWithOptions:

// New method starts 
-(BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    mvc = [nc.viewControllers objectAtIndex:0];
    if (url != nil && [url isFileURL]) {
        [mvc handleOpenURL:url];
    }
    return YES;
}

حيث MVC هو الخاص بي الرئيسي في ViewController ، و NC وحدة تحكم التنقل الخاصة بي.

ثم في MainViewController ، افعل شيئًا كهذا:

- (void)handleOpenURL:(NSURL *)url {
    [self.navigationController popToRootViewControllerAnimated:YES];

    // Next bit not relevant just left in as part of the example
    NSData *jsonData = [NSData dataWithContentsOfURL:url];        
    NSError *error;
    NSDictionary *dictionary = [[NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error] objectAtIndex:0];
    [self managedObjectFromStructure:dictionary withManagedObjectContext:self.context];
    ...
}

بعد الإعلان عن مقابض في .H بالطبع.

شكراً لكريستيان على بذل الجهد لهذا الغرض.

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