วิธีที่เหมาะสมในการออกจากแอปพลิเคชั่น iPhone?


277

ฉันกำลังเขียนโปรแกรมแอพ iPhone และฉันจำเป็นต้องบังคับให้ออกเนื่องจากการกระทำของผู้ใช้บางอย่าง หลังจากล้างหน่วยความจำที่แอพจัดสรรแล้ววิธีการที่เหมาะสมในการโทรออกเพื่อยกเลิกแอปพลิเคชันคืออะไร


34
มีวิธีที่เหมาะสมเพียงทางเดียวคือ - ปุ่มหน้าแรก ..
เบริลเลียม

5
สถานการณ์เดียวที่ฉันสามารถจินตนาการได้ว่าทุกคนกำลังพิจารณาที่จะออกจากโปรแกรมเป็นสถานการณ์ต่อไปนี้: แอปเริ่มต้นแสดงเงื่อนไขการใช้งานปฏิเสธที่จะยอมรับแล้วออกจากแอป นี่เป็นสิ่งที่บางยี่ห้อกดดันนักพัฒนาให้ทำ แต่มันผิด
แดเนียล

6
@Daniel โดยปกติคุณใส่ข้อจำกัดความรับผิดชอบ / เงื่อนไขการใช้งาน (EULA) ลงใน iTunes ที่เชื่อมต่อเมื่อคุณอัพโหลดแอพ หากผู้ใช้ดาวน์โหลดแอปของคุณหมายความว่าพวกเขายอมรับ EULA ของคุณแล้ว
Paul de Lange

8
มีเหตุผลที่ถูกต้องอย่างสมบูรณ์สำหรับการบังคับให้ออกจากแอป iOS กรณีของฉันคือฉันแจกจ่ายแอพเวอร์ชันเบต้าล่วงหน้าของฉัน รุ่นเบต้าจะเปิด IAP ทั้งหมดฟรี สิ่งเหล่านี้มีกำหนดเวลาและจำเป็นต้องหมดอายุหลังจากนั้นสองสามสัปดาห์ ดังนั้นฉันจึงใช้คำตอบด้านล่างเพื่อฆ่าแอปหลังจากระยะเวลาเบต้าสิ้นสุดลง ฉันจะลบสิ่งนี้ในเวอร์ชันสด แต่ยังคงคำตอบช่วยฉันและถูกต้อง!
badweasel

5
เหตุผลหนึ่งที่ถูกต้องในการออกจากแอปคือถ้าเป็นแอปที่ใช้งานพื้นหลังที่มีอายุการใช้งานยาวนานและแอปเข้าสู่สถานะที่ไม่จำเป็นต้องรันในพื้นหลังอีกต่อไป ตัวอย่างเช่นผู้ใช้ออกจากระบบ ในกรณีนี้มันจะเหมาะสมที่จะออกเพื่อที่ว่าเมื่อแอปถัดไปเริ่มมันจะเริ่มต้นใหม่ สิ่งนี้จะทำหน้าที่เป็นตาข่ายนิรภัยเพื่อป้องกันการรั่วไหลของหน่วยความจำด้วยเหตุผลอื่น ๆ หมายเหตุในกรณีนี้แอปจะออกจากพื้นหลังดังนั้นผู้ใช้จะไม่สังเกตเห็นอะไรผิดปกติ
frankodwyer

คำตอบ:


217

คุณเคยลองexit(0)ไหม

หรือ[[NSThread mainThread] exit]แม้ว่าฉันจะไม่ได้ลองก็ตามดูเหมือนว่าจะเป็นทางออกที่เหมาะสมกว่า


85
เนื่องจากการทำเช่นนี้เป็น Apple no-no (อาจทำให้แอปของคุณถูกปฏิเสธใน app-store สำหรับอินเทอร์เฟซที่ไม่ได้มาตรฐาน) ให้พิจารณาคำตอบของเดือนสิงหาคมว่าเป็น "ทางที่ถูกต้อง" FYI คำตอบนี้ (ของเบร็ท) ถูกต้องสำหรับโปรแกรม C ทั้งหมดและ NSThread สำหรับโปรแกรม Cocoa ทั้งหมด
Olie

21
ใน Tech Q&A QA1561 แอปเปิ้ลไม่สนับสนุนการใช้ทางออกเนื่องจากทำให้แอปพลิเคชันขัดข้อง developer.apple.com/iphone/library/qa/qa2008/qa1561.html
progrmr

8
[[NST ข้อความหลักเธรด] ออก] ทำให้แอปพลิเคชันของคุณหยุดทำงานเนื่องจากการออกไม่ใช่วิธีการแบบอินสแตนซ์ exit (0) จะส่งแอปไปยังพื้นหลังใน iOS 4 การโทรออก (0) อีกครั้งจะทำให้เกิดปัญหา อย่างน้อยก็ในเครื่องจำลอง
user123444555621

10
ฉันเข้าใจว่าทำไมผู้คนมากมายถึงให้คำแนะนำในเรื่องนี้ แต่จะให้เครดิตกับนักพัฒนาได้อย่างไร พวกเราทุกคนเป็นผู้ใหญ่ที่นี่และเราต้องการทราบเกี่ยวกับคุณลักษณะนี้ ฉันพบว่ามีประโยชน์มากสำหรับการสร้าง QA ภายในและเมื่อฉันค้นหาครั้งแรกดีใจที่เห็นคำตอบ "ไม่ถูกต้อง" นี้
evanflash

7
@ Kevin "อย่าทำอย่างนั้น" ไม่ใช่คำตอบที่ถูกต้อง ให้คำเตือนและการปฏิเสธความรับผิดชอบหากคุณต้องการ แต่คำตอบที่ถูกต้องเพียงคำเดียวสำหรับ "ฉันจะทำอย่างไร" คือ "นี่คือวิธีการทำ" ถ้าฉันกำลังค้นหาวิธีที่จะทำบางสิ่งบางอย่าง (บางทีฉันต้องการบังคับให้มันออกในขณะที่การดีบั๊ก) คนประกาศอย่างถูกต้องว่า "คุณไม่ได้!" และพยายามฝังคำตอบที่ฉันต้องการคือการเสียเวลาของฉัน อย่างไรก็ตามหลายคนอาจมีเหตุผลที่ไม่ดีที่จะทำอะไรบางอย่างคำตอบ StackOverflow ที่ถูกต้องคือคำตอบที่ตอบคำถามเพราะคนที่มีเหตุผลที่ดีจะค้นหาวิธีของพวกเขาเช่นกัน
Glenn Maynard

274

บน iPhone ไม่มีแนวคิดในการเลิกใช้แอพ การกระทำเพียงอย่างเดียวที่ควรทำให้แอปเลิกใช้คือแตะปุ่มหน้าหลักบนโทรศัพท์และนั่นไม่ใช่สิ่งที่นักพัฒนาซอฟต์แวร์สามารถเข้าถึงได้

แอปของคุณไม่ควรบอกเลิกด้วยตัวเอง เนื่องจากผู้ใช้ไม่ได้กดปุ่มโฮมการกลับไปที่หน้าจอหลักใด ๆ จะทำให้ผู้ใช้รู้สึกว่าแอปของคุณล้มเหลว สิ่งนี้ทำให้เกิดความสับสนพฤติกรรมที่ไม่ได้มาตรฐานและควรหลีกเลี่ยง


13
อย่างที่ฉันพูดมันเป็นพฤติกรรมที่ไม่ได้มาตรฐานและควรหลีกเลี่ยง แอพของ iPhone ไม่ใช่แอปบนเดสก์ท็อป อย่าปฏิบัติกับพวกเขาเช่นนี้
สิงหาคม

8
ฉันสามารถเข้าใจความเห็นของแอปเปิ้ล แต่ฉันมีสถานการณ์ที่คล้ายกันแอปพลิเคชันของฉันต้องการการเข้าถึงอินเทอร์เน็ตหากไม่สามารถใช้งานได้พวกเขาควรจะออกจากแอปแทนที่จะมีเพียงข้อความแสดงข้อผิดพลาด
Anthony Main

22
เรามีแอพที่ช่วยให้ผู้คนนอนหลับ พวกเขาต้องการให้แอปยุติหลังจากช่วงเวลาที่กำหนดเพื่อลดการสิ้นเปลืองแบตเตอรี่ ฉันคิดว่ากรณีนี้เป็นที่ยอมรับ - เนื่องจากผู้ใช้หวังว่าจะนอนหลับและไม่สามารถออกจากแอปด้วยตนเองได้
JamesSugrue

36
ฉันยังไม่เห็นด้วย เมื่อพวกเขาตื่นขึ้นมาแอพนี้ "หายไป" ทำให้ผู้ใช้สงสัยว่าเกิดอะไรขึ้น ให้ตั้งค่าตัวจับเวลาในแอปของคุณแทนจากนั้นเมื่อหมดเวลาใช้งานแอพ - ไม่มีกิจกรรม แอพที่ไม่ทำอะไรเลยจะไม่ทำให้แบตเตอรี่หมด Springboard เป็นแอพเช่นกัน - มันไม่ได้ปิดตัวลงเพียงเพื่อประหยัดพลังงาน แต่จะรอให้ผู้ใช้ป้อนข้อมูลแทน
สิงหาคม

8
นี่ไม่ได้ตอบคำถามจริงๆ มันถูกต้อง 100% แต่ฉันคิดว่าจะเป็นการแสดงความคิดเห็นในคำถามของ OP หรือคำตอบที่ยอมรับได้
Ben Zotto

49

exit (0) ปรากฏต่อผู้ใช้เป็นข้อขัดข้องดังนั้นแสดงข้อความยืนยันให้ผู้ใช้ หลังจากยืนยันการระงับ (ปุ่มโฮมกดโปรแกรม) และรอ 2 วินาทีในขณะที่แอพทำงานเป็นพื้นหลังพร้อมภาพเคลื่อนไหวแล้วออกจากมุมมองของผู้ใช้

-(IBAction)doExit
{
    //show confirmation message to user
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Confirmation"
                                                 message:@"Do you want to exit?"
                                                delegate:self
                                       cancelButtonTitle:@"Cancel"
                                       otherButtonTitles:@"OK", nil];
    [alert show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex != 0)  // 0 == the cancel button
    {
        //home button press programmatically
        UIApplication *app = [UIApplication sharedApplication];
        [app performSelector:@selector(suspend)];

        //wait 2 seconds while app is going background
        [NSThread sleepForTimeInterval:2.0];

        //exit app when app is in background
        exit(0);
    }
}

1
แอปเปิ้ลจะอนุมัติ "ทางออก (0)" นี้ไหม เพราะบางคนบอกว่าแอปเปิ้ลจะปฏิเสธแอปของคุณเมื่อคุณใช้ทางออก 0
Gajendra K Chauhan

2
@GajendraKChauhan exit(0)ไม่สำคัญ แอพของคุณมี "พฤติกรรมเลิก" พฤติกรรมการออกจากตัวเองนั้นเป็นสิ่งต้องห้ามใน AppStore ยกเว้นบางแอพที่ทำโดยบุคคลที่สามที่สำคัญมาก นอกจากนี้พฤติกรรมการเลียนแบบปุ่มโฮมอาจถูกปฏิเสธได้เช่นกัน
Eonil

41

ตรวจสอบคำถามและคำตอบได้ที่นี่: https://developer.apple.com/library/content/qa/qa1561/_index.html

ถาม: ฉันจะออกจากโปรแกรม iOS ได้อย่างไร

ไม่มี API ที่ให้ไว้สำหรับการยกเลิกแอปพลิเคชัน iOS อย่างงดงาม

ใน iOS ผู้ใช้กดปุ่มโฮมเพื่อปิดแอปพลิเคชัน หากแอปพลิเคชันของคุณมีเงื่อนไขที่ไม่สามารถใช้งานได้ตามที่ต้องการแนวทางที่แนะนำคือการแสดงการแจ้งเตือนสำหรับผู้ใช้ที่ระบุลักษณะของปัญหาและการดำเนินการที่เป็นไปได้ที่ผู้ใช้สามารถทำได้ - เปิด WiFi อนุญาตให้ผู้ใช้ยกเลิกแอปพลิเคชันตามดุลยพินิจของตนเอง

คำเตือน:อย่าเรียกใช้exitฟังก์ชัน แอปพลิเคชันการโทรexitจะปรากฏต่อผู้ใช้เพื่อให้เกิดความผิดพลาดแทนที่จะทำการยกเลิกอย่างนุ่มนวลและเคลื่อนไหวกลับไปที่หน้าจอโฮม

นอกจากนี้ข้อมูลอาจไม่ถูกบันทึกเพราะ-applicationWillTerminate:และUIApplicationDelegateวิธีการที่คล้ายกันจะไม่ถูกเรียกใช้หากคุณโทรออก

หากในระหว่างการพัฒนาหรือทดสอบจำเป็นต้องยกเลิกแอปพลิเคชันของคุณแนะนำให้ใช้abortฟังก์ชันหรือassertมาโคร


2
เพิ่งเพิ่ม AlertView โดยไม่มีปุ่มเพื่อให้สอดคล้องกับสิ่งนี้ ง่าย.
Schultz9999

คำตอบที่ดีเพียงทำงานกับทางออก (0) และไม่รู้ว่ามันเป็นของ api ส่วนตัว
Alex Cio

39

มันไม่ใช่วิธีการออกจากโปรแกรม แต่เป็นวิธีการบังคับให้คนออกจากโปรแกรม

UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Hit Home Button to Exit" message:@"Tell em why they're quiting" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[anAlert show];

2
อย่างน้อยในโปรแกรมจำลองหากคุณทำเช่นนี้การแจ้งเตือนจะยังคงอยู่เมื่อผู้ใช้เปิดแอปอีกครั้ง ดังนั้นฉันขอแนะนำให้พวกเขาอย่างน้อยหนึ่งปุ่ม
cheshirekow

ใช้คำตอบของ Kalyan เพื่อให้แอปหยุดทำงานเมื่อกดปุ่มโฮม
Timur Kuchkarov

ปัญหาเกี่ยวกับสิ่งนี้คือมันไม่ได้ออกจากแอปดังนั้นสิ่งที่นักพัฒนาอาจต้องการทำโดยออก (การโยน UI ที่ไม่ถูกต้อง / เก่า, การล้างค่าคงที่และอื่น ๆ ) จะไม่ถูกดำเนินการยกเว้นว่าผู้ใช้เลื่อนแอปพลิเคชัน ปิด.
Ben Leggiero

นี่ไม่ได้ฆ่าแอพ
ดัสติน

38

ไปที่ info.plist ของคุณและตรวจสอบปุ่ม "แอปพลิเคชันไม่ทำงานในพื้นหลัง" เวลานี้เมื่อผู้ใช้คลิกปุ่มหน้าแรกแอปพลิเคชันจะออกอย่างสมบูรณ์


1
แต่กระบวนการพื้นหลังก็ยังถูกไล่ออก
Gajendra K Chauhan

17

เพิ่มUIApplicationExitsOnSuspendคุณสมบัติในการapplication-info.plisttrue


การตั้งค่านี้สามารถเปลี่ยนแปลงได้ในเวลาทำงานหรือไม่? ฉันหมายถึงฉันต้องการที่จะอยู่ในพื้นหลังยกเว้นเมื่อแอพของฉันเลือกที่จะออกจากการหยุดชั่วคราวครั้งต่อไป - ในเวลาใดฉันจะแนะนำ UIApplicationExitsOnSuspend เป็นไปได้ไหม
Motti Shneor

13

หลังจากการทดสอบฉันสามารถพูดได้ดังนี้:

  • การใช้อินเทอร์เฟซส่วนตัว: [UIApplication sharedApplication]จะทำให้แอปพลิเคชันดูเหมือนว่าจะเกิดข้อผิดพลาด แต่จะเรียก- (void)applicationWillTerminate:(UIApplication *)applicationก่อนทำเช่นนั้น
  • การใช้exit(0);จะเป็นการยกเลิกแอปพลิเคชัน แต่จะมีลักษณะ "ปกติ" (ไอคอนของกระดานกระโดดน้ำปรากฏตามที่คาดไว้พร้อมเอฟเฟกต์ซูมออก) แต่จะไม่เรียก- (void)applicationWillTerminate:(UIApplication *)applicationวิธีการมอบหมาย

คำแนะนำของฉัน:

  1. ด้วยตนเองโทร- (void)applicationWillTerminate:(UIApplication *)applicationบนผู้รับมอบสิทธิ์
  2. โทรexit(0);.

Apple บอกว่าจะไม่ใช้ exit เนื่องจาก "การโทรออกจากแอปพลิเคชันจะปรากฏต่อผู้ใช้ว่าเกิดข้อผิดพลาดแทนที่จะทำการเลิกอย่างนุ่มนวลและสร้างภาพเคลื่อนไหวกลับไปที่หน้าจอหลัก" developer.apple.com/library/ios/#qa/qa2008/ qa1561.html
MickyD

8

ApplicationDelegate ของคุณได้รับแจ้งจากการเลิกโดยเจตนาโดยผู้ใช้:

- (void)applicationWillResignActive:(UIApplication *)application {

เมื่อฉันได้รับการแจ้งเตือนนี้ฉันแค่โทร

        exit(0);

ซึ่งทำงานทั้งหมด และสิ่งที่ดีที่สุดคือมันเป็นความตั้งใจของผู้ใช้ที่จะเลิกซึ่งเป็นสาเหตุที่ไม่ควรมีปัญหาในการโทรหาที่นั่น

ในแอปเสียงของฉันมีความจำเป็นต้องออกจากแอปหลังจากที่ผู้คนซิงค์อุปกรณ์ของพวกเขาในขณะที่เพลงยังคงเล่นอยู่ ทันทีที่การซิงค์เสร็จสมบูรณ์ฉันจะได้รับการแจ้งเตือน แต่การเลิกใช้แอพในทันทีหลังจากนั้นจะดูเหมือนเป็นความผิดพลาด

ดังนั้นแทนที่จะตั้งค่าสถานะให้ออกจากแอปในการดำเนินการฉากหลังถัดไปแทน สิ่งใดที่ใช้ได้สำหรับการรีเฟรชแอปหลังจากซิงค์


1
นี่ไม่ใช่ทางออกที่ดีเนื่องจากแอปพลิเคชันจะลาออกจากการใช้งานด้วยเหตุผลอื่นเช่นการโทรเข้า
frankodwyer

ทางออกคือการเพิ่มการตรวจสอบที่ออกเฉพาะในกรณีที่เป็นประโยชน์ ตัวอย่างเช่นหากผู้ใช้อยู่บนหน้าจอเริ่มต้น ถ้าอย่างนั้นมันก็โอเคแม้ว่า phonecall จะเข้ามา Apple ไม่ได้ปฏิเสธสิ่งนี้ตั้งแต่ iOS 2 ในแอพของฉัน stackoverflow.com/a/43906936/712124
cat

6

แอพของฉันถูกปฏิเสธเมื่อไม่นานมานี้ฉันใช้วิธีการที่ไม่มีเอกสาร ตัวอักษร:

"น่าเสียดายที่ไม่สามารถเพิ่มลงใน App Store ได้เนื่องจากใช้ API ส่วนตัวไม่อนุญาตให้ใช้ API ที่ไม่ใช่สาธารณะซึ่งระบุไว้ในข้อตกลงสิทธิ์ใช้งานโปรแกรมนักพัฒนาซอฟต์แวร์ iPhone 3.3.1:

"3.3.1 แอปพลิเคชันอาจใช้ Documented APIs ในลักษณะที่กำหนดโดย Apple เท่านั้นและต้องไม่ใช้หรือโทร API ส่วนตัวใด ๆ "

API ที่ไม่ใช่แบบสาธารณะที่รวมอยู่ในแอปพลิเคชันของคุณจะยุติการใช้งานด้วย "


6

แอปเปิ้ลพูดว่า:

"คำเตือน: อย่าเรียกใช้ฟังก์ชั่น exit แอพพลิเคชั่นที่โทรออกจะปรากฏขึ้นต่อผู้ใช้ว่าเกิดข้อผิดพลาดแทนที่จะทำการเลิกอย่างนุ่มนวลและเคลื่อนไหวกลับไปที่หน้าจอโฮม"

ฉันคิดว่านี่เป็นข้อสมมติฐานที่ไม่ดี หากผู้ใช้แตะที่ปุ่มออกและมีข้อความปรากฏขึ้นว่า: "แอปพลิเคชันจะออกจากตอนนี้" จะไม่ปรากฏว่ามีข้อผิดพลาด Apple ควรให้วิธีที่ถูกต้องในการออกจากแอปพลิเคชัน (ไม่ใช่ออก (0))


3
พวกเขาเรียกมันว่าปุ่ม Home ซึ่งอยู่ที่ด้านล่างของ iDevice ดังนั้นด้วยเหตุนี้จึงไม่จำเป็นต้องสร้างปุ่มออกของคุณเองเลย
Popeye

4

นี่เป็นคำตอบที่ดี แต่ได้ตัดสินใจขยาย:

คุณไม่สามารถรับแอปพลิเคชันของคุณได้รับการยอมรับจาก AppStore โดยไม่อ่านหลักเกณฑ์การเชื่อมต่อ iOS Human Human (พวกเขาสงวนสิทธิ์ที่จะปฏิเสธคุณในการทำสิ่งใด ๆกับพวกเขา) ส่วน "อย่าออกโดยทางโปรแกรม" http://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices html เป็นแนวทางที่ถูกต้องในวิธีที่คุณควรปฏิบัติต่อในกรณีนี้

หากคุณเคยมีปัญหากับแพลตฟอร์ม Apple คุณไม่สามารถหาวิธีแก้ปัญหาได้ง่ายให้ปรึกษา HIG เป็นไปได้ที่ Apple ไม่ต้องการให้คุณทำและพวกเขามักจะ (ฉันไม่ใช่ Apple ดังนั้นฉันจึงไม่สามารถรับประกันได้เสมอ) ในเอกสารของพวกเขา


3

อืมคุณอาจต้อง 'ออกจากแอปพลิเคชันถ้าพูดว่าแอปพลิเคชันของคุณต้องการการเชื่อมต่ออินเทอร์เน็ต คุณสามารถแสดงการแจ้งเตือนจากนั้นทำสิ่งนี้:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}

9
ไม่คุณไม่จำเป็นต้องยกเลิก ตัวอย่างเช่นแอป iTunes เมื่อไม่สามารถตรวจจับการเชื่อมต่อที่เหมาะสมเพียงวางหน้าจอที่ระบุว่าไม่ได้เชื่อมต่อ มันไม่ได้เลิกเพียง แต่แจ้งให้ผู้ใช้ทราบถึงสิ่งที่เกิดขึ้น จากนั้นผู้ใช้ออกจากการแตะปุ่มโฮม
สิงหาคม

1
แอปเข็มทิศจะหยุดทำงานหากไม่สามารถใช้งานได้
Josh Lee

3

เราไม่สามารถออกจากแอปใช้exit(0), abort()ฟังก์ชั่นเช่นแอปเปิ้ลขอกีดกันการใช้ฟังก์ชั่นเหล่านี้ แม้ว่าคุณจะสามารถใช้ฟังก์ชั่นนี้เพื่อการพัฒนาหรือทดสอบได้

หากในระหว่างการพัฒนาหรือทดสอบจำเป็นต้องยกเลิกแอปพลิเคชันของคุณแนะนำให้ยกเลิกการทำงานหรือยืนยันแมโคร

โปรดค้นหากระทู้ถามตอบ Apple เพื่อรับข้อมูลเพิ่มเติม

เนื่องจากการใช้ฟังก์ชันนี้สร้างความประทับใจเหมือนกับแอปพลิเคชันหยุดทำงาน ดังนั้นฉันจึงมีข้อเสนอแนะบางอย่างเช่นเราสามารถแสดงข้อความแจ้งเตือนพร้อมข้อความบอกเลิกเพื่อแจ้งให้ผู้ใช้ทราบเกี่ยวกับการปิดแอปเนื่องจากฟังก์ชั่นบางอย่างไม่ทำงาน

แต่ iOS Human Interface Guideline สำหรับการเริ่มต้นและหยุดแอพแนะนำว่าอย่าใช้ปุ่ม Quit หรือ Closeเพื่อยกเลิกแอปพลิเคชัน หาก แต่พวกเขากำลังแนะนำให้แสดงข้อความที่เหมาะสมเพื่ออธิบายสถานการณ์

แอพ iOS จะไม่แสดงตัวเลือกปิดหรือปิด ผู้คนหยุดใช้แอพเมื่อพวกเขาเปลี่ยนไปใช้แอพอื่นกลับไปที่หน้าจอหลักหรือทำให้อุปกรณ์อยู่ในโหมดสลีป

อย่าออกจากแอป iOS โดยทางโปรแกรม คนมักจะตีความว่านี่เป็นความผิดพลาด หากมีสิ่งใดขัดขวางแอปของคุณทำงานตามที่ตั้งใจไว้คุณต้องแจ้งผู้ใช้เกี่ยวกับสถานการณ์และอธิบายว่าพวกเขาสามารถทำอะไรได้บ้าง


2

นอกเหนือจากข้างต้นคำตอบที่ดีฉันแค่อยากจะเพิ่มคิดเกี่ยวกับการล้างหน่วยความจำของคุณ

หลังจากที่แอปพลิเคชันของคุณออกแล้ว iPhone OS จะล้างข้อมูลแอปพลิเคชันของคุณโดยอัตโนมัติดังนั้นการเพิ่มหน่วยความจำด้วยตนเองเพียงแค่เพิ่มระยะเวลาที่แอปพลิเคชันของคุณจะออก


โปรดแก้ไขคำตอบของคุณในสถานการณ์ปัจจุบันของ IOS4.0 และ UP .. : P
rptwsthi

2
- (IBAction)logOutButton:(id)sender
{
   //show confirmation message to user
   CustomAlert* alert = [[CustomAlert alloc] initWithTitle:@"Confirmation" message:@"Do you want  to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
   alert.style = AlertStyleWhite;
   [alert setFontName:@"Helvetica" fontColor:[UIColor blackColor] fontShadowColor:[UIColor clearColor]];
   [alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

   if (buttonIndex != 0)  // 0 == the cancel button
   {
      //home button press programmatically
      UIApplication *app = [UIApplication sharedApplication];
      [app performSelector:@selector(suspend)];
      //wait 2 seconds while app is going background
      [NSThread sleepForTimeInterval:2.0];
      //exit app when app is in background
      NSLog(@"exit(0)");
      exit(0);
  }
}

1

ฉันใช้วิธี [[NSMutableArray ใหม่] addObject: nil] ดังกล่าวข้างต้นเพื่อบังคับให้ออก (ขัดข้อง) แอปโดยไม่ต้องทำการโทรออกจากนิทาน (0)

ทำไม? เพราะแอพของฉันใช้ใบรับรองปักหมุดในการเรียก API เครือข่ายทั้งหมดเพื่อป้องกันการโจมตีจากคนกลาง สิ่งเหล่านี้รวมถึงการเริ่มต้นเรียกแอปทางการเงินของฉันเมื่อเริ่มต้น

หากการรับรองความถูกต้องของใบรับรองล้มเหลวการเริ่มต้นการโทรทั้งหมดของฉันเกิดข้อผิดพลาดและปล่อยให้แอปของฉันอยู่ในสถานะไม่แน่นอน การปล่อยให้ผู้ใช้กลับบ้านแล้วกลับเข้ามาในแอปไม่ได้ช่วยเว้นแต่ว่าแอพนั้นได้รับการชำระล้างโดยระบบปฏิบัติการแล้วก็ยังไม่ได้กำหนดค่าเริ่มต้นและไม่น่าเชื่อถือ

ดังนั้นในกรณีนี้เราถือว่าเป็นการดีที่สุดที่จะแจ้งเตือนให้ผู้ใช้ทราบว่าแอปทำงานในสภาพแวดล้อมที่ไม่ปลอดภัยจากนั้นเมื่อพวกเขากด "ปิด" บังคับให้ออกจากแอปโดยใช้วิธีดังกล่าวข้างต้น


ฉันไม่เห็นสิ่งที่ทำให้คุณไม่สามารถแสดงการแจ้งเตือนทางโลกเต็มหน้าจอเดียวบอกผู้ใช้ว่าแอปไม่สามารถใช้งานได้สำหรับเหตุผล "การยึดใบรับรอง" และนั่นคือเหตุผล ในที่สุดผู้ใช้จะปิดแอป คุณอาจไม่ทราบ แต่ iOS ขอสงวนสิทธิ์ในการฆ่ากระบวนการของคุณ (รักษาสถานะของมัน) และกู้คืนในภายหลังและ "วงจรชีวิต" ของแอปพลิเคชั่น iOS นั้นไม่ได้อยู่ในมือคุณจริงๆ ความผิดพลาดของคุณ - เป็นเพียงความผิดพลาดและระบบปฏิบัติการอาจเลือกที่จะรื้อฟื้นแอปต่อไป
Motti Shneor

ว้าวโพสต์เก่าสามปี อย่างไรก็ตามสถาปัตยกรรมแอปใหม่นั้นทำได้โดยใช้ปุ่มลองใหม่ที่ลอง API และปล่อยหน้าจอบล็อกหรือส่งกลับไปยังหน้าจอบล็อกด้วยข้อผิดพลาดใหม่
Michael Long

โครงสร้างแอปเก่านั้นค่อนข้างจะไม่อนุญาตให้มีวิธีที่ดีในการลองการเรียก API เริ่มต้นอีกครั้งและแอพนั้นอยู่ในสถานะที่ไม่สอดคล้องกัน เราอาจใช้หน้าจอบล็อกถาวร แต่ผู้ใช้ต้องบังคับให้ออกจากแอปด้วยตนเองและมีการตัดสินใจว่าผู้ใช้ทุกคนไม่ทราบวิธีการดับเบิลคลิกและบังคับให้ออกจากแอป ง่ายขึ้นในวันนี้ แต่ค่อนข้างซ่อนอยู่เมื่อสามปีก่อน
Michael Long

1
[[UIApplication sharedApplication] terminateWithSuccess];

มันทำงานได้ดีและโทรอัตโนมัติ

- (void)applicationWillTerminateUIApplication *)application delegate.

เพื่อลบคำเตือนเวลารวบรวมเพิ่มรหัสนี้

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 

5
นี่เป็นวิธีการส่วนตัวดิเอโก Mercado ได้อธิบายไว้ข้างต้นว่าแอปของเขาถูกปฏิเสธแล้วจึงเสี่ยงเช่นนั้น
RVN

ใช้ API ส่วนตัวจะได้รับแอปที่ Apple ปฏิเสธ
ZYiOS

2
สำหรับแอปขององค์กร - นี่อาจเป็นโซลูชัน
user1140780

- (IBAction) exitApp: (id) ผู้ส่ง {SEL selector = NSSelectorFromString (@ "terminateWithSuccess"); [self performSelector: selector withObject: [UIApplication sharedApplication]]; }
unom

@unmircea แสดงความเห็นผ่านหรือไม่
Awesome-o

1

คุณไม่ควรเรียกใช้ฟังก์ชันโดยตรง exit(0)เนื่องจากจะออกจากแอปพลิเคชั่นทันทีและจะดูเหมือนว่าแอพของคุณเกิดขัดข้อง ดังนั้นดีกว่าที่จะแสดงการแจ้งเตือนการยืนยันให้ผู้ใช้และให้พวกเขาทำเอง

สวิฟท์ 4.2

func askForQuit(_ completion:@escaping (_ canQuit: Bool) -> Void) {
    let alert = UIAlertController(title: "Confirmation!", message: "Do you want to quit the application", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(true)
    }))
    alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.cancel, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(false)
    }))
    self.present(alert, animated: true, completion: nil)
}

/// Will quit the application with animation
func quit() {
    UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
    /// Sleep for a while to let the app goes in background
    sleep(2)
    exit(0)
}

การใช้งาน:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}

0

ผู้ใช้ควรตัดสินใจเมื่อแอพออก ฉันไม่คิดว่ามันเป็นการโต้ตอบกับผู้ใช้ที่ดีเมื่อแอพหยุดทำงาน ดังนั้นจึงไม่มี API ที่ดีสำหรับมันมีเพียงปุ่มโฮมเท่านั้นที่มี

หากมีข้อผิดพลาด: ใช้งานได้ดีขึ้นหรือแจ้งผู้ใช้ หากจะต้องมีการรีสตาร์ท: ใช้งานได้ดีกว่าการแจ้งเตือนผู้ใช้

มันฟังดูโง่เง่า แต่เป็นการดีที่จะออกจากแอปโดยไม่แจ้งให้ผู้ใช้ตัดสินใจและไม่แจ้งเตือนเขา และเนื่องจากมีปุ่มโฮมสำหรับการโต้ตอบกับผู้ใช้ Apple จึงไม่ควรมี 2 สิ่งสำหรับฟังก์ชั่นเดียวกัน (ออกจากแอป)


0

ออกจากแอปด้วยวิธีอื่นนอกเหนือจากปุ่มโฮมนั้นไม่ใช่ iOS จริงๆวิธี

แม้ว่าฉันจะเป็นผู้ช่วยตัวนี้ แต่ก็ไม่ได้ใช้สิ่งส่วนตัว

void crash()
{ [[NSMutableArray new] addObject:NSStringFromClass(nil)]; }

แต่ก็ยังไม่ได้มีไว้สำหรับการผลิตในกรณีของฉัน มีไว้สำหรับการทดสอบการรายงานข้อขัดข้องหรือเพื่อรีสตาร์ทอย่างรวดเร็วหลังจากการรีเซ็ตข้อมูลหลัก เพียงทำให้ปลอดภัยที่จะไม่ถูกปฏิเสธถ้าฟังก์ชั่นที่เหลืออยู่ในรหัสการผลิต


0

Swift 4.2 (หรือเก่ากว่า)

Darvinสามารถเรียกใช้ไลบรารีได้

import Darwin

exit(0) // Here you go

หมายเหตุ: สิ่งนี้ไม่ได้รับการแนะนำในแอปพลิเคชัน iOS

การทำเช่นนี้จะทำให้คุณได้รับบันทึกข้อผิดพลาด


0

ใน iPadOS 13 ตอนนี้คุณสามารถปิดทุกฉากแบบนี้:

for session in UIApplication.shared.openSessions {
    UIApplication.shared.requestSceneSessionDestruction(session, options: nil, errorHandler: nil)
}

การดำเนินการนี้จะเรียกapplicationWillTerminate(_ application: UIApplication)ตัวแทนแอปของคุณและยกเลิกแอปในท้ายที่สุด

แต่ระวังสองสิ่ง:

ข้อมูลเพิ่มเติมเกี่ยวกับฉากต่างๆใน iOS / iPadOS 13: https://developer.apple.com/documentation/uikit/app_and_environment/scenes


-1

ออกจากแอปด้วยวิธีอื่น

แม้ว่าฉันจะเป็นผู้ช่วยตัวนี้ แต่ก็ไม่ได้ใช้สิ่งส่วนตัว

ออก (0);


-1

อาจเหมาะสมที่จะออกจากแอพหากเป็นแอปที่มีอายุการใช้งานยาวนานและดำเนินการในพื้นหลังเช่นรับการอัปเดตตำแหน่ง (โดยใช้การอัปเดตตำแหน่งความสามารถในการพื้นหลังสำหรับที่)

ตัวอย่างเช่นสมมติว่าผู้ใช้ล็อกเอาท์จากแอปที่อ้างอิงตำแหน่งของคุณและผลักแอปไปที่พื้นหลังโดยใช้ปุ่มหน้าแรก ในกรณีนี้แอปของคุณอาจยังคงทำงานต่อไป แต่อาจเหมาะสมกว่าที่จะออก มันจะดีสำหรับผู้ใช้ (ปล่อยหน่วยความจำและทรัพยากรอื่น ๆ ที่ไม่จำเป็นต้องใช้) และดีสำหรับความเสถียรของแอป (เช่นทำให้แน่ใจว่าแอปเริ่มต้นใหม่เป็นระยะเมื่อเป็นไปได้คือความปลอดภัยสุทธิจากหน่วยความจำรั่วและหน่วยความจำต่ำอื่น ๆ ปัญหา)

สิ่งนี้สามารถทำได้ (แม้ว่าอาจจะไม่ควรดูด้านล่าง :-) ได้ด้วย:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
        exit(0);
    } else {
       // normal handling.
    }
}

เนื่องจากแอพจะออกจากพื้นหลังมันจะไม่ดูผิดกับผู้ใช้และจะไม่คล้ายกับความล้มเหลวโดยที่ส่วนติดต่อผู้ใช้จะถูกกู้คืนในครั้งต่อไปที่พวกเขาเรียกใช้แอป กล่าวอีกนัยหนึ่งกับผู้ใช้มันจะไม่แตกต่างจากระบบที่เริ่มต้นการยกเลิกแอพเมื่อแอพอยู่ในพื้นหลัง

แต่ถึงกระนั้นก็จะดีกว่าที่จะใช้วิธีการมาตรฐานมากขึ้นเพื่อให้ระบบทราบว่าแอปสามารถยกเลิก ตัวอย่างเช่นในกรณีนี้โดยการทำให้แน่ใจว่า GPS ไม่ได้ถูกใช้งานโดยหยุดการร้องขอการอัปเดตตำแหน่งรวมถึงการปิดการแสดงตำแหน่งปัจจุบันในมุมมองแผนที่หากมี ด้วยวิธีนี้ระบบจะจัดการกับการยกเลิกแอปในไม่กี่นาที (เช่น[[UIApplication sharedApplication] backgroundTimeRemaining]) หลังจากที่แอปเข้าสู่พื้นหลัง สิ่งนี้จะได้รับประโยชน์เหมือนกันทั้งหมดโดยไม่ต้องใช้รหัสเพื่อยกเลิกแอป

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
       // stop requesting location updates if not already done so
       // tidy up as app will soon be terminated (run a background task using beginBackgroundTaskWithExpirationHandler if needed).
    } else {
       // normal handling.
    }
}

และแน่นอนว่าการใช้exit(0)จะไม่เหมาะสมสำหรับแอปการผลิตโดยเฉลี่ยที่ทำงานในเบื้องหน้าตามคำตอบอื่น ๆ ที่อ้างอิงhttp://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.