هل يمكنني إجبار مستخدم iPhone على ترقية تطبيق؟

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

  •  19-09-2019
  •  | 
  •  

سؤال

هل من الممكن إجبار المستخدم على الترقية بمجرد وجود إصدار جديد من تطبيقي المتوفر في متجر iTunes؟

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

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

المحلول

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

* تعديل *هذه الإجابة لم تعد صحيحة. رؤية الإجابات الأخرى المبذولة للحقيقة الحالية.

نصائح أخرى

لقد قمت بهذه الميزة من خلال الحصول على نسخة من iTunes WebService ومقارنة مع الإصدار الحالي .. فيما يلي رمزي

        NSString *version = @"";
        NSURL *url = [NSURL URLWithString:@"http://itunes.apple.com/lookup?id=<Your app ID>"];
        versionRequest = [ASIFormDataRequest requestWithURL:url];
        [versionRequest setRequestMethod:@"GET"];
        [versionRequest setDelegate:self];
        [versionRequest setTimeOutSeconds:150];
        [versionRequest addRequestHeader:@"Content-Type" value:@"application/json"]; 
        [versionRequest startSynchronous];

        //Response string of our REST call
        NSString* jsonResponseString = [versionRequest responseString];

        NSDictionary *loginAuthenticationResponse = [jsonResponseString objectFromJSONString];

        NSArray *configData = [loginAuthenticationResponse valueForKey:@"results"];

        for (id config in configData) 
        {
            version = [config valueForKey:@"version"];
        }
   //Check your version with the version in app store
        if (![version isEqualToString:[itsUserDefaults objectForKey:@"version"]]) 
        {
            ProAlertView *createUserResponseAlert = [[ProAlertView alloc] initWithTitle:@"New Version!!" message: @"A new version of app is available to download" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: @"Download", nil];
        [createUserResponseAlert show]; 
        [createUserResponseAlert release];
        }

ووضع معرف التطبيق في رابط iTunes يرى الكود أدناه ..

- (void)alertView:(UIAlertView *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    // the user clicked one of the OK/Cancel buttons
    if (buttonIndex == 1)
    {
        NSString *iTunesLink = @"itms-apps://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftwareUpdate?id=<appid>&mt=8";
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink]];
    }
}

ملاحظة: تحتاج إلى عمل الإطار JSONKIT وإطار Asihttp لإجراء مكالمات Webservice ..

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

-(BOOL) needsUpdate{
    NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString* appID = infoDictionary[@"CFBundleIdentifier"];
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]];
    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

    if ([lookup[@"resultCount"] integerValue] == 1){
        NSString* appStoreVersion = lookup[@"results"][0][@"version"];
        NSString* currentVersion = infoDictionary[@"CFBundleShortVersionString"];
        if (![appStoreVersion isEqualToString:currentVersion]){
            NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion);
            return YES;
        }
    }
    return NO;
}

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

// iTunesLink should be your applications link
NSString *iTunesLink = @"http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=284417350&mt=8";


[[UIApplication sharedApplication] openURL:[NSURL URLWithString:iTunesLink]];

تم نشر هذا السؤال في الأصل قبل 7 سنوات، وبينما تبقى بعض الإجابات ذات صلة، إليك نهج أكثر حديثة.

أوصي https://github.com/artsabintsev/siren. وهو SWIFT 3 متوافق ويمكن تثبيته مع Cocoapods أو قرطاج.

Cocoapods، SWIFT 3 الدعم:

pod 'Siren'

قرطاج:

github "ArtSabintsev/Siren"

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

يمكن

لقد بدأت مشروعا مفتوحا في القضبان (Apache 2.0) لإنشاء حل لهذه المشكلة. إنه يطلق عليه التطبيق - [CTRL]، وهو أمر عمل جاري للغاية، لكنك مرحب بك لاستخدامها وأرحب بمساهمات من أي نوع. إذا كان بإمكاني الحصول على هذا الأمر وتشغيله في وقت فراغي، فسوف أقدم هذا لجميع مطوري التطبيقات بمستوى معقول للغاية من الخدمة المجانية وبالطبع ستتمكن كل شركة دائما من الدوران للنشر الخاص بها.

إنه هنا على جيثب: https://github.com/slalomdigital/applicationctrl.

المساهمة ومساعدتي في حل هذه المشكلة للحصول على الخير!

لا توجد طريقة آلية للقيام بذلك، سيتعين عليك كتابة شيء يدويا.

يجب ألا تحتوي خطة عملك / التصميم على عبارة "إجبار المستخدم". يغضب الناس عندما تجعلهم يفعلون شيئا. تخيل مستخدم في عجلة من امرنا يفتح التطبيق الخاص بك قليلا في صباح أحد الأيام فقط لا يكتشف أنك تجبره على الترقية قبل أن يتمكن من استخدام التطبيق لما يحتاجه. تخيل أنه عالق في البرية الاضطرار إلى استخدام الحافة للتنزيل. لن يكون سعيدا.

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

لقد تم تكييفها عن طريق الخبرة في Cringe كلما رأيت "المزيد من الميزات" المستخدمة لوصف إصدار جديد من البرامج لأن هذا يعني حتما ميزة الميزة. يميل المصممون إلى إبقاء تطعيم المزيد والمزيد من الميزات على التطبيقات حتى يقوم تطبيق واحد بكل شيء. هذا خطير بشكل خاص على منصة مثل iPhone حيث يقوم تطبيق واحد بالعديد من الأشياء يتغلب بسرعة على الواجهة واستجابة التطبيق.

IDED01: تعليقي هنا كيفية تحديث تطبيق بعد دفع المستخدمين للترقية قد تكون أيضا ذات صلة بخططك. إذا تخفض تصميم الترقية الخاص بك Apple من حلقة الإيرادات، فإنه غير مبتدئ.

تحديث:

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

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

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

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

رفضت Apple هذا.

حتى العودة إلى لوحة التصميم!

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

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

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

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

مرحبا لأي شخص في المستقبل وجدت هذا البرنامج التعليمي الذي يجب أن يساعد أي شخص، فقد ساعدني.

http://codewithris.com/tutorial-how-to-implement-in-app-update-functional-in-your-iphoneipad-app/

تحرير (سيبدو الكود الخاص بك شيئا مشابها لما هو أدناه):

// Try to get version 
NSString *versionNumber = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

NSURL *updateUrl = [NSURL URLWithString:@"http://yourdomain.com/yourupdatefile.xml"];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:updateUrl
                                            cachePolicy:NSURLCacheStorageNotAllowed
                                        timeoutInterval:20.0];
NSURLResponse *response = nil;
NSError *error = nil;
NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest
                                     returningResponse:&response
                                                 error:&error];
// Check no error, then parse data
if (error == nil)
{
    // Parse response into a dictionary
    NSPropertyListFormat format;
    NSString *errorStr = nil;
    NSDictionary *dictionary = [NSPropertyListSerialization propertyListFromData:data
                                                                mutabilityOption:NSPropertyListImmutable
                                                                          format:&format
                                                                errorDescription:&errorStr];        
    if (errorStr == nil)
    {
        @try {

            // Try to see if the current app version exists in the update xml
            NSString *itunesUrl = [dictionary objectForKey:versionNumber];

            if (itunesUrl)
            {
                // Show dialog to ask user to update!
            }
            else {
                // Version not in XML
            }
        } @catch (NSException *e) {
            // Error with retrieving the key
        }
    }
    else {
        // Error with parsing data into dictionary
    }
}

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

-(BOOL) needsUpdate{
    NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString* appID = infoDictionary[@"CFBundleIdentifier"];
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]];
    NSData* data = [NSData dataWithContentsOfURL:url];
    NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

    if ([lookup[@"resultCount"] integerValue] == 1){
        NSString* appStoreVersion = lookup[@"results"][0][@"version"];
        NSString* currentVersion = infoDictionary[@"CFBundleShortVersionString"];
        if (![appStoreVersion isEqualToString:currentVersion]){
            NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion);
            return YES;
        }
    }
    return NO;
}

في ال:

if (![appStoreVersion isEqualToString:currentVersion]){
                NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion);
                return YES;
            }

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

يمكنك استخدام عنوان URL أدناه للحصول على معلومات لأي تطبيق تعرفه فقط معرف Apple الخاص بك.

يمكنك الحصول على معرف Apple هذا في itunesconnect.com> تطبيقك> صفحة معلومات التطبيق

احصل على: http://itunes.apple.com/lookup؟id=.

بالطبع لا توجد طريقة. يجب على المستخدم اتخاذ القرار إذا أراد تنزيل إصدار أحدث من التطبيق الخاص بك أم لا.

سيعرض AppStore إذا كان هناك إصدارات adenew، لذلك أنا أيضا لا أعتقد أن Apple تسمح بذلك. أيضا أنا لا أعرف كيف ستفعل هذا؟ يمكنك التحقق من ذلك عبر اتصال بالإنترنت، لكن هذه ليست الطريقة التي تحبها Apple ولأنك لن تتحمل فرصة للقيام بذلك.

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