سؤال

في لعبة أقوم بتطويرها باستخدام Gamecenter ، أريد التعامل مع السيناريو التالي:

  1. يبدأ المستخدم اللعبة. لقد أظهر تنبيه النظام الذي يطالبه بتسجيل الدخول إلى Gamecenter. يتجاهلها الآن.
  2. بعد فترة من الوقت ، يريد المستخدم تسجيل الدخول إلى Gamecenter والنقر فوق (على سبيل المثال) عنصر قائمة المتصدرين. اختار الإلغاء بدلاً من تسجيل الدخول ، في الوقت الحالي.
  3. تتكرر العملية عدة مرات. في النهاية ، يريد المستخدم تسجيل الدخول إلى Gamecenter. ينقر على عنصر قائمة المتصدرين مرة أخرى.

في اختباراتي ، وجدت أن التنبيه المنبثقة التي أثارتها الدعوة إلى "antensionWithCompletionHandler" (كما تم استدعاؤها من قبل عينة Apple GamecenterManager) التي تشير إلى تسجيل الدخول إلى Gamecenter فقط لا يظهر عدد محدود من المرات (4 أو 5). في المرة الأخيرة التي تظهر فيها ، تقول "Game Center Distibled ، قم بتسجيل الدخول مع تطبيق مركز اللعبة لتمكين" بعد ذلك ".

لعب الفواكبة حاولت تكرار هذا. ومع ذلك ، في حالتهم ، يظهر المنبثقة التي تقول "Game Center Distibed" في كل مرة أقوم فيها بالنقر فوق عنصر Gamecenter (الإنجازات ، على سبيل المثال).

ما أود القيام به هو تكرار الوظيفة: أي ، إذا لم يتم تسجيل الدخول إلى Gamecenter ، لتظهر تنبيه مركز اللعبة القياسي في جميع الأوقات التي تنقر عليها على عنصر قائمة المتصدرين.

هل هناك طريقة لمعرفة ما إذا كان تنبيه "تسجيل الدخول إلى مركز اللعبة" القياسي قد ظهر ، أو لإجباره على الظهور في جميع الأوقات (وليس فقط أول محاولتين)؟

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

المحلول

السلوك هو شيء ، بعد محاولات غير ناجحة - تعطيل مركز Gamecenter للتطبيق. إعادة تشغيل التطبيق أو الذهاب لتسجيل الدخول في Gamecenter نفسه سيعيده عبر الإنترنت.

لقد نسيت أي مستند قرأته ، ولكن هناك مستند Apple الذي يفسر هذا السلوك.

نصائح أخرى

فيما يلي فكرة لتنكر هذه القضية:

بغض النظر عما إذا تم إلغاء "gc anustrictionWithCompletionHandler"-تم إلغاء request

  • بواسطة المستخدم النقر على "إلغاء" في مربع الحوار

أو بسبب حقيقة ذلك

  • تم تعطيل GC على الجهاز (الذي يحدث بعد أن يقوم المستخدم بإلغاء التنبيه Dialog 3 مرات بالضبط (في iOS 5 على الأقل))

ستتلقى دائمًا nserror مع الكود 2 يقول "تم إلغاء العملية المطلوبة.".

المميز الوحيد الذي يمكن أن أجده هو الوقت الذي تم إقراره بين anthunticateWithCompletionHandler-Request وتنفيذ معالج الانتهاء.

لذلك عند إرسال الطلب ، أقوم بتوفير الوقت:

requestTime = [NSDate date]; 

وفي معالج الإنجاز الخاص بي ، أقيس الوقت الذي انقضت:

NSDate* now = [NSDate date];
CFTimeInterval elapsedTimeSinceAuthenticationRequest = [now timeIntervalSinceDate:requestTime];
NSLog(@"time Elapsed: %f", elapsedTimeSinceAuthenticationRequest);

إذا قام المستخدم بإلغاء الطلب ، فسيكون الوقت الذي تم تمريره أطول بكثير مقارنة بالوقت الذي تم إقراره إذا ألغت GC العملية. في اختباراتي ، استغرق الأمر مستخدمًا ثانية واحدة على الأقل لإلغاء مربع الحوار ، في حين أن طلب GC استغرق أقل من 0.1 ثانية (على جهاز iPhone 4)

بالطبع ، قد تختلف هذه القيم وفقًا للجهاز الذي يعمل عليه الرمز وعلى ما الذي ينشغل به المعالج في الوقت الحالي. أحد المآسيد الذي قمت بفحصه بالفعل هو إطلاق التطبيق: إذا كنت ترسل antanketicationRequest أثناء ApplicationDidFinishLaunching كما اقترحت Apple ، فقد استغرق الأمر وقتًا أطول من GC لإلغاء الطلب في حالتي ، لأن الجهاز مشغول بتحميل طرق العرض وأي شيء ضروري لإطلاقه التطبيق.

لذلك اسمحوا لي أن أعرف إذا جربت هذا الحل وإذا كان يعمل من أجلك ، كما سأفعل مرة واحدة أن أجري المزيد من الاختبارات ...

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

مجرد ملاحظة ، لست متأكدًا مما إذا كان سيتم الموافقة على ذلك أم لا لأنني أقوم بتكرار رسالة خطأ Apple.

-(void) gcLogin: (id) sender {
    [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) {
        if(error) {
            if([[error domain] isEqualToString:GKErrorDomain] && [error code] == GKErrorCancelled) {
                [ResourceManager showAlertWithTitle:@"GameCenter Disabled" message:@"Sign in with Game Center application to enable"];
                mGameCenterCancelled = YES;
            }
            NSLog(@"%@", [error description]);
        } else { 
            [self updateMenu];
            mGameCenterCancelled = NO;
        }
    }];
}

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

نظرًا لأننا نركض في صندوق الرمل أثناء التطوير ، فقد يكون هذا السلوك بالطبع شيئًا يتصرف بشكل مختلف أثناء الإنتاج ، لكن هذا ليس بالأمر السهل لمعرفة ذلك.

قد يكون الرابط مفيدًا (الفقرات الثلاث الأولى):http://developer.apple.com/library/ios/#documentation/networkinginternet/conceptual/gamekit_guide/users/users.html#//apple_ref/doc/uid/tp40008304-sw9

النقطة الرئيسية هي في مستطيل "مهم".

I'm facing the same issue. Though I couldn't find a way to enforce poping up the same dialog for logging into Game Center, I did find a way to implement a warning message saying 'gamecenter is disabled' when user clicks on a leaderboard icon:

if([GKLocalPlayer localPlayer].authenticated == NO)
{
// Prompt a warning message alert saying game center is disabled
}
else
{
// Proceed with opening leaderboard
}

Hope this helps!

يبدو أن iOS ستعطيل مركز الألعاب تمامًا ومنعه من المطالبة بعد أن يختار المستخدم تعطيل مركز الألعاب (سيظهر الخيار في علامة Cancel Center الخامسة الخامسة).

لاستعادة الجهاز إلى الحالة الأصلية حيث ستظهر موجه تسجيل الدخول مرة أخرى. ما عليك سوى تسجيل الدخول باستخدام تطبيق Center Game باستخدام حساب مركز عمل عادي (غير اختبار). بمجرد دخولك ، قم بتسجيل الخروج. يجب أن تبدأ في حثك مرة أخرى على تطبيقك.

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