Cách thoát ứng dụng iPhone đúng cách?


277

Tôi đang lập trình một ứng dụng cho iPhone và tôi cần buộc nó thoát ra do một số hành động của người dùng. Sau khi dọn dẹp bộ nhớ ứng dụng được phân bổ, phương thức thích hợp để gọi để chấm dứt ứng dụng là gì?


34
Chỉ có một cách thích hợp - Nút Home ..
beryllium

5
Tình huống duy nhất tôi có thể tưởng tượng bất cứ ai xem xét bỏ chương trình là tình huống sau: Ứng dụng bắt đầu, hiển thị các điều khoản sử dụng, từ chối chấp nhận sau đó thoát khỏi ứng dụng. Đây là điều mà các thương hiệu đôi khi gây áp lực cho nhà phát triển phải làm. Nhưng nó sai.
Daniel

6
@Daniel Thông thường bạn đặt từ chối trách nhiệm / điều khoản sử dụng (EULA) trên itunes kết nối khi bạn tải lên ứng dụng. Nếu người dùng tải xuống ứng dụng của bạn, điều đó có nghĩa là họ đã chấp nhận EULA của bạn
Paul de Lange

8
Có những lý do hoàn toàn hợp lệ để buộc phải thoát khỏi ứng dụng ios. Trường hợp của tôi là tôi đang phân phối các phiên bản beta trước khi ra mắt của ứng dụng. Các phiên bản beta mở ra tất cả các IAP miễn phí. Những thứ này có giới hạn thời gian và cần hết hạn sau một vài tuần. Vì vậy, tôi đang sử dụng câu trả lời dưới đây để tắt ứng dụng sau khi giai đoạn beta kết thúc. Tôi sẽ xóa cái này trong phiên bản LIVE. Nhưng vẫn là câu trả lời giúp tôi và là chính xác!
badweasel

5
Một lý do hợp lệ để thoát khỏi ứng dụng là nếu đó là một ứng dụng thực thi nền tồn tại lâu và ứng dụng sẽ chuyển sang trạng thái không còn cần chạy trong nền. Ví dụ, người dùng đăng xuất. Trong trường hợp này, sẽ rất hợp lý khi thoát để khi ứng dụng tiếp theo khởi động, nó sẽ khởi động sạch. Điều này sẽ hoạt động như một mạng lưới an toàn chống rò rỉ bộ nhớ, trong số các lý do khác. Lưu ý, trong trường hợp này, ứng dụng sẽ thoát khỏi nền , vì vậy người dùng sẽ không nhận thấy bất cứ điều gì sai.
frankodwyer

Câu trả lời:


217

Bạn đã thử chưa exit(0) chưa

Ngoài ra, [[NSThread mainThread] exit]mặc dù tôi đã không thử rằng nó có vẻ như là giải pháp phù hợp hơn.


85
Vì việc này là không có Apple (có thể khiến ứng dụng của bạn bị từ chối trong cửa hàng ứng dụng cho giao diện không chuẩn), hãy coi câu trả lời của August là "đúng." FYI, câu trả lời này (Brett's) là chính xác cho TẤT CẢ các chương trình C và NSThread cho tất cả các chương trình Ca cao.
Olie

21
Trong Tech Q & A QA1561, Apple không khuyến khích sử dụng lối thoát vì nó làm cho ứng dụng dường như bị sập. developer.apple.com/iphone/l
Library / qa / qa2008 / qa1561.html

8
[[NSThread mainThread] exit] khiến ứng dụng của bạn gặp sự cố, vì thoát không phải là một phương thức cá thể. exit (0) sẽ gửi ứng dụng đến nền trong iOS 4. Gọi lại exit (0) sẽ làm sập nó. Ít nhất là trong trình giả lập.
dùng123444555621

10
Tôi hiểu tại sao rất nhiều người khuyên chống lại điều này, nhưng làm thế nào về việc cung cấp cho chúng tôi một số tín dụng? Chúng ta đều là người lớn ở đây và chúng tôi muốn biết về tính năng này. Tôi thấy nó rất hữu ích cho các bản dựng QA nội bộ và, khi tôi lần đầu tiên tìm kiếm nó, rất vui khi thấy câu trả lời "không chính xác" này.
evanflash

7
@Kevin "Đừng làm vậy" không bao giờ là câu trả lời đúng. Đưa ra cảnh báo và từ chối nếu bạn thích, nhưng câu trả lời đúng duy nhất cho "làm thế nào để tôi làm điều này" là "đây là cách làm". Nếu tôi đang tìm cách làm một cái gì đó (có thể tôi muốn buộc nó thoát ra trong khi gỡ lỗi), mọi người sẽ tuyên bố chính đáng "bạn không!" và cố gắng chôn vùi câu trả lời tôi cần là một sự lãng phí thời gian của tôi. Tuy nhiên, nhiều người có thể có lý do xấu để làm điều gì đó, câu trả lời chính xác của StackOverflow là câu trả lời cho câu hỏi, bởi vì những người có lý do chính đáng cũng sẽ tìm kiếm theo cách của họ.
Glenn Maynard

274

Trên iPhone không có khái niệm bỏ ứng dụng. Hành động duy nhất khiến ứng dụng thoát ra là chạm vào nút Home trên điện thoại và đó không phải là thứ mà các nhà phát triển có quyền truy cập.

Theo Apple, ứng dụng của bạn không nên tự chấm dứt. Vì người dùng không nhấn nút Home, bất kỳ quay lại màn hình chính nào cũng mang lại cho người dùng cảm giác ứng dụng của bạn bị sập. Điều này gây nhầm lẫn, hành vi không chuẩn và nên tránh.


13
Như tôi đã nói, đó là hành vi không chuẩn và nên tránh. Ứng dụng iPhone không phải là ứng dụng dành cho máy tính để bàn. Đừng đối xử với họ như vậy.
ngày

8
Tôi có thể hiểu ý kiến ​​của Táo nhưng tôi có một tình huống tương tự, ứng dụng của tôi yêu cầu truy cập internet, nếu không có sẵn, họ có thể rời khỏi ứng dụng thay vì chỉ có một thông báo lỗi
Anthony Main

22
Chúng tôi có các ứng dụng giúp mọi người ngủ. Họ muốn ứng dụng chấm dứt sau một khoảng thời gian thiết lập để giảm hao pin. Tôi nghĩ trường hợp này có thể chấp nhận được - vì người dùng hy vọng sẽ ngủ và không thể thoát ứng dụng theo cách thủ công.
JamesSugrue

36
Tôi vẫn không đồng ý. Khi họ thức dậy, ứng dụng đã "biến mất" khiến người dùng tự hỏi chuyện gì đã xảy ra. Thay vào đó, hãy đặt hẹn giờ trong ứng dụng của bạn, sau đó khi hết thời gian, hãy nhàn rỗi ứng dụng - không có hoạt động. Một ứng dụng hoàn toàn không làm gì hết pin. Springboard cũng là một ứng dụng - nó không tắt chỉ để tiết kiệm năng lượng. Thay vào đó, nó chỉ đơn giản là chờ người dùng nhập liệu.
Tháng Tám

8
Điều này không thực sự trả lời câu hỏi. Nó chính xác 100%, nhưng tôi nghĩ lý tưởng sẽ là một nhận xét về câu hỏi của OP hoặc câu trả lời được chấp nhận.
Ben Zotto

49

exit (0) xuất hiện cho người dùng khi gặp sự cố, vì vậy hãy hiển thị thông báo xác nhận cho người dùng. Sau khi tạm dừng xác nhận (nhấn nút Home lập trình) và đợi 2 giây trong khi ứng dụng đang chạy nền với hình động rồi thoát ra sau chế độ xem của người dùng

-(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
Apple có chấp nhận "lối ra (0)" này không? Bởi vì một số người nói rằng apple sẽ từ chối ứng dụng của bạn khi bạn sử dụng lối thoát 0.
Gajendra K Chauhan

2
@GajendraKChauhan exit(0)không thành vấn đề. Điểm là ứng dụng của bạn có "hành vi bỏ". Tự bỏ hành vi bị cấm trong AppStore ngoại trừ một vài ứng dụng được tạo bởi các bên thứ 3 rất quan trọng. Ngoài ra, bắt chước hành vi nút home cũng có thể bị từ chối.
Eonil

41

Kiểm tra Q & A tại đây: https://developer.apple.com/l Library / content / qa / qa1561 / _index.html

H: Làm thế nào để tôi lập trình thoát khỏi ứng dụng iOS của mình?

Không có API nào được cung cấp để kết thúc một ứng dụng iOS một cách duyên dáng.

Trong iOS, người dùng nhấn nút Home để đóng ứng dụng. Nếu ứng dụng của bạn có các điều kiện không thể cung cấp chức năng dự định, cách tiếp cận được đề xuất là hiển thị cảnh báo cho người dùng cho biết bản chất của sự cố và các hành động có thể có mà người dùng có thể thực hiện - bật WiFi, bật Dịch vụ vị trí, v.v. Cho phép người dùng chấm dứt ứng dụng theo ý riêng của họ.

CẢNH BÁO: Không gọi exitchức năng. Các ứng dụng gọi điện exitsẽ xuất hiện khiến người dùng gặp sự cố, thay vì thực hiện chấm dứt duyên dáng và hoạt hình trở lại màn hình chính.

Ngoài ra, dữ liệu có thể không được lưu, bởi vì -applicationWillTerminate:và các UIApplicationDelegatephương thức tương tự sẽ không được gọi nếu bạn gọi thoát.

Nếu trong quá trình phát triển hoặc thử nghiệm, cần phải chấm dứt ứng dụng của bạn, abortchức năng hoặc assertmacro được khuyến nghị


2
Chỉ cần thêm một AlertView không có nút để tuân thủ điều này. Dễ dàng.
Schultz9999

Câu trả lời tuyệt vời, chỉ hoạt động với lối ra (0) và không biết nó thuộc về api riêng
Alex Cio

39

Nó không thực sự là một cách để thoát khỏi chương trình, nhưng là một cách để buộc mọi người bỏ.

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
Ít nhất là trên trình giả lập, nếu bạn làm điều này, cảnh báo sẽ vẫn ở đó khi người dùng mở lại ứng dụng. Vì vậy, tôi đề nghị cho họ ít nhất một nút.
cheshirekow

Sử dụng câu trả lời của Kalyan để ứng dụng thoát khi nhấn nút home.
Timur Kuchkarov

Vấn đề với điều này là nó không thực sự thoát khỏi ứng dụng, do đó, bất cứ điều gì nhà phát triển có thể muốn thực hiện bằng cách thoát (loại bỏ giao diện người dùng cũ / không hợp lệ, xóa hằng số, v.v.) sẽ không được thực hiện trừ khi người dùng vuốt ứng dụng đóng cửa.
Ben Leggiero

Điều này không giết ứng dụng.
Dustin

38

Truy cập thông tin của bạn.plist và kiểm tra khóa "Ứng dụng không chạy trong nền". Lần này khi người dùng nhấp vào nút home, ứng dụng sẽ thoát hoàn toàn.


1
Nhưng quá trình nền cũng được miễn nhiệm.
Gajendra K Chauhan

17

Thêm UIApplicationExitsOnSuspendtài sản trên application-info.plistđến true.


Có thể thay đổi cài đặt này trong thời gian chạy không? Ý tôi là, tôi muốn sống ở chế độ nền, ngoại trừ khi ứng dụng của tôi CHỌN thoát khỏi sự đình chỉ tiếp theo - trong thời gian đó tôi sẽ muốn giới thiệu UIApplicationExitsOnSuspend. Điều này có thể không?
Motti Shneor

13

Sau một số thử nghiệm, tôi có thể nói như sau:

  • sử dụng giao diện riêng tư: [UIApplication sharedApplication]sẽ khiến ứng dụng trông như bị sập, NHƯNG nó sẽ gọi- (void)applicationWillTerminate:(UIApplication *)application trước khi thực hiện;
  • việc sử dụng exit(0);cũng sẽ chấm dứt ứng dụng, nhưng nó sẽ trông "bình thường" (các biểu tượng của springboard xuất hiện như mong đợi, với hiệu ứng thu nhỏ), NHƯNG nó sẽ không gọi - (void)applicationWillTerminate:(UIApplication *)applicationphương thức ủy nhiệm.

Lời khuyên của tôi:

  1. Gọi thủ công - (void)applicationWillTerminate:(UIApplication *)application trên đại biểu.
  2. Gọi exit(0);.

Apple nói rằng không sử dụng lối thoát do "Ứng dụng thoát lệnh sẽ xuất hiện khiến người dùng gặp sự cố, thay vì thực hiện chấm dứt duyên dáng và hoạt hình trở lại màn hình chính" developer.apple.com/l
MickyD

8

ApplicationDelegate của bạn được thông báo về việc bỏ ý định của người dùng:

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

Khi tôi nhận được thông báo này, tôi chỉ cần gọi

        exit(0);

Mà làm tất cả các công việc. Và điều tốt nhất là, đó là ý định của người dùng để thoát, đó là lý do tại sao điều này không phải là một vấn đề gọi nó ở đó.

Trên Ứng dụng âm thanh của tôi, cần phải thoát ứng dụng sau khi mọi người đồng bộ hóa thiết bị của họ trong khi nhạc vẫn đang phát. Ngay sau khi đồng bộ hóa hoàn tất, tôi nhận được thông báo. Nhưng việc thoát khỏi ứng dụng ngay sau đó sẽ thực sự giống như một sự cố.

Vì vậy, thay vào đó tôi đặt cờ để THỰC SỰ thoát khỏi ứng dụng trên hành động nền tiếp theo. Không sao để làm mới ứng dụng sau khi đồng bộ hóa.


1
Đây không phải là một giải pháp tốt vì ứng dụng sẽ từ chức hoạt động vì những lý do khác, chẳng hạn như cuộc gọi điện thoại đến.
frankodwyer

Giải pháp là thêm một kiểm tra chỉ tồn tại nếu nó hữu ích để làm như vậy. Ví dụ: nếu người dùng ở trên màn hình bắt đầu. Sau đó, mọi thứ đều ổn ngay cả khi một danh bạ được gửi đến. Apple đã không từ chối điều này kể từ iOS 2 trong các ứng dụng của tôi. stackoverflow.com/a/43906936/712124
mèo

6

Ứng dụng của tôi đã bị từ chối gần đây bc Tôi đã sử dụng một phương pháp không có giấy tờ. Nghĩa đen

"Thật không may, nó không thể được thêm vào App Store vì nó đang sử dụng API riêng. Sử dụng các API không công khai, như được nêu trong Thỏa thuận cấp phép chương trình dành cho nhà phát triển iPhone phần 3.3.1 bị cấm:

"3.3.1 Ứng dụng chỉ có thể sử dụng API tài liệu theo cách do Apple quy định và không được sử dụng hoặc gọi bất kỳ API riêng tư nào."

API không công khai được bao gồm trong ứng dụng của bạn bị chấm dứtWithSuccess "


6

Apple nói:

"Cảnh báo: Không gọi chức năng thoát. Các ứng dụng gọi thoát sẽ xuất hiện khiến người dùng gặp sự cố, thay vì thực hiện chấm dứt duyên dáng và hoạt hình trở lại Màn hình chính."

Tôi nghĩ rằng đây là một giả định xấu. Nếu người dùng chạm vào nút thoát và một thông báo xuất hiện có nội dung như: "Ứng dụng sẽ thoát.", Nó dường như không bị sập. Apple nên cung cấp một cách hợp lệ để thoát khỏi một ứng dụng (không thoát (0)).


3
Họ gọi nó là nút Home, nó có thể được đặt ở dưới cùng của bất kỳ iDevice nào. Vì vậy, vì điều này không bao giờ có nhu cầu xây dựng nút thoát của riêng bạn.
Popeye

4

Điều này đã nhận được một câu trả lời tốt nhưng quyết định mở rộng một chút:

Bạn không thể chấp nhận ứng dụng của mình vào AppStore mà không cần đọc Nguyên tắc giao diện con người iOS của Apple. (họ có quyền từ chối bạn vì đã làm bất cứ điều gì chống lại họ) Phần "Đừng bỏ chương trình" http://developer.apple.com/l Library / ios html là một hướng dẫn chính xác về cách bạn nên đối xử trong trường hợp này.

Nếu bạn gặp sự cố với nền tảng Apple, bạn không thể dễ dàng tìm ra giải pháp cho, hãy tham khảo HIG. Có thể Apple đơn giản là không muốn bạn làm điều đó và họ thường (Tôi không phải là Apple nên tôi không thể đảm bảo luôn) nói như vậy trong tài liệu của họ.


3

Hừm, bạn có thể 'phải' thoát khỏi ứng dụng nếu, giả sử, ứng dụng của bạn yêu cầu kết nối internet. Bạn có thể hiển thị một cảnh báo và sau đó làm một cái gì đó như thế này:

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

9
Không, bạn không phải chấm dứt nó. Ví dụ, ứng dụng iTunes, khi nó không thể phát hiện ra một kết nối thích hợp, chỉ cần đưa ra một màn hình cho biết chúng không được kết nối. Nó không bỏ, nó chỉ đơn giản là thông báo cho người dùng về những gì đang xảy ra. Sau đó, người dùng thoát ra bằng cách nhấn vào nút home.
tháng 8

1
Tuy nhiên, ứng dụng la bàn sẽ thoát nếu không thể hoạt động.
Josh Lee

3

Chúng ta không thể bỏ ứng dụng sử dụng exit(0), abort()chức năng, như Apple ngăn cản mạnh mẽ việc sử dụng các chức năng này. Mặc dù bạn có thể sử dụng chức năng này cho mục đích phát triển hoặc thử nghiệm.

Nếu trong quá trình phát triển hoặc thử nghiệm cần phải chấm dứt ứng dụng của bạn, chức năng hủy bỏ hoặc xác nhận macro được khuyến nghị

Vui lòng tìm chủ đề Hỏi & Đáp này của Apple để có thêm thông tin.

Khi sử dụng chức năng này tạo ấn tượng như ứng dụng đang bị sập. Vì vậy, tôi đã nhận được một số đề xuất như chúng tôi có thể hiển thị Thông báo với thông báo chấm dứt để người dùng biết về việc đóng ứng dụng, do không có chức năng nhất định.

Nhưng Hướng dẫn Giao diện Con người iOS để Bắt đầu và Dừng Ứng dụng , đề nghị Không bao giờ sử dụng nút Thoát hoặc Đóng để chấm dứt Ứng dụng. Thay vào đó sau đó họ đang đề nghị hiển thị thông điệp thích hợp để giải thích tình huống.

Ứng dụng iOS không bao giờ hiển thị tùy chọn Đóng hoặc Thoát. Mọi người ngừng sử dụng một ứng dụng khi họ chuyển sang một ứng dụng khác, quay lại Màn hình chính hoặc đặt thiết bị của họ ở chế độ ngủ.

Không bao giờ thoát khỏi ứng dụng iOS theo chương trình. Mọi người có xu hướng giải thích điều này như một vụ tai nạn. Nếu một cái gì đó ngăn ứng dụng của bạn hoạt động như dự định, bạn cần nói với người dùng về tình huống và giải thích những gì họ có thể làm về nó.


2

Ngoài những điều trên, tốt, câu trả lời tôi chỉ muốn thêm, suy nghĩ về việc làm sạch bộ nhớ của bạn.

Sau khi ứng dụng của bạn thoát, HĐH iPhone sẽ tự động dọn sạch mọi thứ mà ứng dụng của bạn để lại, do đó giải phóng tất cả bộ nhớ theo cách thủ công chỉ có thể tăng thời gian ứng dụng của bạn thoát ra.


Vui lòng sửa đổi câu trả lời của bạn trong kịch bản hiện tại của IOS4.0 và 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

Tôi đã sử dụng phương pháp [[NSMutableArray new] addObject: nil] được đề cập ở trên để buộc thoát (sự cố) ứng dụng mà không thực hiện cuộc gọi hàm thoát (0).

Tại sao? Bởi vì ứng dụng của tôi sử dụng ghim chứng chỉ trên tất cả các lệnh gọi API mạng để ngăn chặn các cuộc tấn công trung gian. Chúng bao gồm các cuộc gọi khởi tạo mà ứng dụng tài chính của tôi thực hiện khi khởi động.

Nếu xác thực chứng chỉ không thành công, tất cả các cuộc gọi khởi tạo của tôi đều bị lỗi và khiến ứng dụng của tôi ở trạng thái không xác định. Để người dùng về nhà và sau đó quay lại ứng dụng sẽ không giúp ích gì, trừ khi ứng dụng đã bị HĐH thanh trừng, nó vẫn chưa được xử lý và không đáng tin cậy.

Vì vậy, trong trường hợp này, chúng tôi cho rằng tốt nhất nên bật một cảnh báo thông báo cho người dùng rằng ứng dụng đang hoạt động trong môi trường không an toàn và sau đó, khi họ nhấn "Đóng", buộc thoát ứng dụng bằng phương pháp đã nói ở trên.


Tôi không thể thấy điều gì ngăn bạn hiển thị một cảnh báo trần tục toàn màn hình duy nhất, nói với người dùng rằng ứng dụng không thể sử dụng được vì những lý do "ghim chứng chỉ" đó và đó là lý do. Người dùng cuối cùng sẽ đóng ứng dụng. Có thể bạn không biết, nhưng iOS có quyền giết quá trình của bạn (duy trì trạng thái của nó) và khôi phục lại sau đó và "vòng đời" của ứng dụng iOS không thực sự nằm trong tay bạn. Sự cố của bạn - chỉ đơn giản là sự cố và HĐH có thể chọn khôi phục ứng dụng bằng mọi cách.
Motti Shneor

Wow, bài ba tuổi. Dù sao, kiến ​​trúc ứng dụng mới thực hiện khá nhiều điều đó, với nút thử lại thử lại API và làm rơi màn hình khối hoặc đưa chúng trở lại màn hình khối với một lỗi mới.
Michael Long

Cấu trúc ứng dụng cũ gần như không cho phép bất kỳ cách tốt nào để thử lại các lệnh gọi API khởi động và ứng dụng ở trạng thái không nhất quán mà không có chúng. Chúng tôi có thể đã sử dụng màn hình chặn vĩnh viễn, nhưng điều đó đòi hỏi người dùng phải tự thoát khỏi ứng dụng và quyết định rằng không phải người dùng nào cũng biết CÁCH bấm đúp và buộc thoát ứng dụng. Ngày nay dễ dàng hơn, nhưng khá ẩn ba năm trước.
Michael Long

1
[[UIApplication sharedApplication] terminateWithSuccess];

Nó hoạt động tốt và tự động gọi

- (void)applicationWillTerminateUIApplication *)application delegate.

để loại bỏ cảnh báo thời gian biên dịch thêm mã này

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

5
Đây là một phương pháp riêng tư, Diego Mercado đã giải thích ở trên rằng ứng dụng của anh đã bị từ chối, vậy thì tại sao lại mạo hiểm như vậy.
RVN

Sử dụng API riêng sẽ khiến ứng dụng bị Apple từ chối.
ZYiOS

2
cho ứng dụng doanh nghiệp - đây có thể là một giải pháp.
dùng1140780

- (IBAction) exitApp: (id) người gửi {SEL selector = NSSelectorFromString (@ "terminatingWithSuccess"); [tự thực hiệnSelector: bộ chọn vớiObject: [UIApplication sharedApplication]]; }
unom

@unmircea đã vượt qua đánh giá?
Awesome-o

1

Bạn không nên gọi trực tiếp chức năng exit(0) vì nó sẽ thoát ứng dụng ngay lập tức và sẽ có vẻ như ứng dụng của bạn bị sập. Vì vậy, tốt hơn để hiển thị cho người dùng một cảnh báo xác nhận và để họ tự làm điều này.

Swift 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)
}

Sử dụng:

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

0

Người dùng nên quyết định khi thoát ứng dụng. Tôi không nghĩ rằng đó là một tương tác người dùng tốt khi một ứng dụng thoát. Do đó, không có API đẹp cho nó, chỉ có nút home có một.

Nếu có lỗi: Triển khai nó tốt hơn hoặc Thông báo cho người dùng. Nếu phải có khởi động lại: Thực hiện tốt hơn thông báo cho người dùng.

Nghe có vẻ ngu ngốc, nhưng đó là thực tế xấu để thoát khỏi ứng dụng mà không để người dùng quyết định và không thông báo cho anh ta. Và vì có một nút home cho sự tương tác của người dùng, Apple tuyên bố, không nên có 2 điều cho cùng một chức năng (thoát khỏi một ứng dụng).


0

Thoát một ứng dụng theo cách khác ngoài nút home thực sự không phải là iOS-esque cách tiếp cận .

Tôi đã làm người trợ giúp này, mặc dù, không sử dụng những thứ riêng tư:

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

Nhưng vẫn không có nghĩa là để sản xuất trong trường hợp của tôi. Nó là để thử nghiệm các báo cáo sự cố hoặc để khởi động lại nhanh sau khi thiết lập lại Dữ liệu lõi. Chỉ cần làm cho nó an toàn không bị từ chối nếu chức năng còn lại trong mã sản xuất.


0

Swift 4.2 (hoặc cũ hơn)

Thư viện được gọi Darvincó thể được sử dụng.

import Darwin

exit(0) // Here you go

NB: Điều này không được áp dụng trong các ứng dụng iOS.

Làm điều này sẽ giúp bạn đăng nhập sự cố.


0

Trong iPadOS 13, giờ đây bạn có thể đóng tất cả các phiên cảnh như thế này:

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

Cái này sẽ gọi applicationWillTerminate(_ application: UIApplication) đại biểu ứng dụng của bạn và chấm dứt ứng dụng cuối cùng.

Nhưng hãy cẩn thận với hai điều:

Thông tin thêm về các cảnh trong iOS / iPadOS 13: https://developer.apple.com/documentation/uikit/app_and_envir/scenes


-1

Thoát khỏi một ứng dụng theo cách khác

Tôi đã làm người trợ giúp này, mặc dù, không sử dụng những thứ riêng tư:

Thoát (0);


-1

Có thể thích hợp để thoát khỏi một ứng dụng nếu đó là một ứng dụng tồn tại lâu cũng thực thi trong nền, ví dụ để có được các cập nhật vị trí (sử dụng các cập nhật vị trí khả năng cho điều đó).

Ví dụ: giả sử người dùng đăng xuất khỏi ứng dụng dựa trên vị trí của bạn và đẩy ứng dụng xuống nền bằng nút home. Trong trường hợp này, ứng dụng của bạn có thể tiếp tục chạy, nhưng có thể thoát khỏi nó hoàn toàn có ý nghĩa. Nó sẽ tốt cho người dùng (giải phóng bộ nhớ và các tài nguyên khác không cần sử dụng) và tốt cho sự ổn định của ứng dụng (nghĩa là đảm bảo ứng dụng được khởi động lại định kỳ khi có thể là mạng an toàn chống rò rỉ bộ nhớ và bộ nhớ thấp khác các vấn đề).

Điều này có thể (mặc dù có lẽ không nên, xem bên dưới :-) đạt được với một cái gì đó như:

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

Vì ứng dụng sẽ thoát khỏi nền nó sẽ không nhìn nhầm với người dùng và sẽ không giống với sự cố, cung cấp giao diện người dùng được khôi phục vào lần tiếp theo họ chạy ứng dụng. Nói cách khác, đối với người dùng, nó sẽ trông không khác gì một hệ thống chấm dứt ứng dụng bắt đầu khi ứng dụng ở chế độ nền.

Tuy nhiên, tốt hơn là nên sử dụng một cách tiếp cận tiêu chuẩn hơn để cho hệ thống biết rằng ứng dụng có thể bị chấm dứt. Ví dụ: trong trường hợp này, bằng cách đảm bảo GPS không được sử dụng bằng cách dừng yêu cầu cập nhật vị trí, bao gồm tắt hiển thị vị trí hiện tại trên chế độ xem bản đồ nếu có. Bằng cách đó, hệ thống sẽ xử lý chấm dứt ứng dụng một vài phút (tức là [[UIApplication sharedApplication] backgroundTimeRemaining]) sau khi ứng dụng vào nền. Điều này sẽ nhận được tất cả các lợi ích tương tự mà không phải sử dụng mã để chấm dứt ứng dụng.

- (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.
    }
}

Và tất nhiên, việc sử dụng exit(0)sẽ không bao giờ phù hợp với ứng dụng sản xuất trung bình chạy ở nền trước, theo các câu trả lời khác tham khảo http://developer.apple.com/iphone/l Library / qa / qa2008 / qa1561.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.