تطبيق lauching مع url (عبر uiapplicationDelegate's HandlePenurl) يعمل بموجب iOS 4 ، ولكن ليس بموجب iOS 3.2
-
26-09-2019 - |
سؤال
لقد قمت بتنفيذ 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
توثيق:
بدأت في كتابة التطبيق الذي استخدم 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 بالطبع.
شكراً لكريستيان على بذل الجهد لهذا الغرض.