2016-04-20 27 views
10

Tôi hiện đang làm việc trên ứng dụng iOS có liên quan đến ghi và tải lên video (từ camera tích hợp) đến máy chủ.Tải lên các tệp video trong khi ứng dụng iOS ở chế độ nền?

Tất cả hoạt động tốt và hợp lý, nhưng đối với phiên bản mới, khách hàng đã yêu cầu một tính năng mới: tiếp tục quá trình này mà không cần ứng dụng hiển thị trên màn hình và đang hoạt động.

Hiện tại, bạn quay video, nó được lưu dưới dạng MP4 trên hệ thống tệp và chuỗi nền tải tệp lên máy chủ. Điều này tất cả xảy ra trong khi ứng dụng đang mở, lên đến đỉnh điểm trong một màn hình mà về cơ bản cho bạn biết cho đến khi quá trình kết thúc.

Nếu bạn nhấn nút home để "thu nhỏ" ứng dụng (Tôi không thông thạo thuật ngữ iOS, tha thứ cho tôi), hiện tại tất cả các quá trình tải lên đều bị tạm dừng. Khách hàng muốn có nó để bạn có thể giảm thiểu và làm một cái gì đó hoàn toàn khác nhau khi quá trình này tiếp tục, với một thông báo được hiển thị khi tải lên hoàn tất.

Hiểu biết của tôi là iOS cung cấp một số trường hợp đặc biệt để tải xuống, phát trực tuyến nhạc và vị trí.

Giả sử một lần bạn có thể có được mười phút hoặc thời gian nền trong khi ứng dụng của bạn được thu nhỏ để hoàn thành tác vụ - sau thời gian đó iOS sẽ dừng đột ngột mọi thứ cho đến khi ứng dụng hoạt động trở lại. Điều này dường như đã được thay đổi trong các phiên bản iOS mới hơn có nghĩa là bạn không thể dựa vào một con số cụ thể nữa - nhưng mười phút không thực sự đủ tốt.

Tôi có thể nghĩ ra các cách hacky lợi dụng các tính năng trên nhưng tôi lo ngại Apple có thể phát hiện ra điều này trong quá trình gửi iTunes. Thực sự tôi đang tìm kiếm một phương pháp sạch hơn - làm cách nào để tiếp tục tải lên video trong khi ứng dụng được thu nhỏ?

Tôi giả sử có giải pháp - Dropbox có thể xử lý tình huống này?

+0

Với kiến ​​thức của tôi, bạn không thể làm điều này, đặc biệt nếu 10 phút không đủ dài. iOS chỉ đơn giản là không muốn các ứng dụng hoạt động trong nền. –

Trả lời

12

Đáng ngạc nhiên là tôi đã nhận được một nơi nào đó với điều này, mặc dù khá một vài hướng dẫn cho thấy nó hầu như không thể và thậm chí là Dropbox admitting it has to do a hacky location-based thing.

Mã đã sử dụng lớp NSURLSession và để tải lên, bạn sử dụng phương thức uploadTaskWithStreamedRequest() của mình, chuyển yêu cầu HTTP và nhận lại thể hiện NSURLSessionUploadTask. Tuy nhiên, điều không rõ ràng với tôi là "tiếp tục" tác vụ dẫn đến các tệp được tải lên độc lập với phần còn lại của ứng dụng, tức là khi ứng dụng được thu nhỏ, tác vụ này tiếp tục cho đến khi hoàn thành hoặc iOS buộc nó tạm dừng.

Trong ý nghĩa, tôi đã đạt được những gì tôi đã yêu cầu mà không nhận ra, tuy nhiên nhiệm vụ này vẫn có thể bị gián đoạn bởi iOS sau vài giây. Phần còn lại của ứng dụng cũng bị tạm dừng, vì vậy giao tiếp bị cản trở cho đến khi ứng dụng được đưa trở lại mặt trước một lần nữa.

Bí quyết là hai phương pháp:

uploadTaskID = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({})

UIApplication().sharedApplication().endBackgroundTask(uploadTaskID)

với những tại chỗ, bất kỳ mã sau khi "bắt đầu" chức năng sẽ chạy bất kể ứng dụng được giảm thiểu, và sẽ làm như vậy cho đến khi chức năng "kết thúc" được gọi.Với một chút tinh chỉnh, tôi đã có thể nhận tệp để tải lên tuần tự và đăng thông báo khi quá trình được thực hiện.

Tôi chưa thấy giải pháp này được gợi ý vì vậy nó có thể là một ý tưởng tồi, nhưng dường như nó hoạt động.

+0

Đây là tiền. Hoạt động tốt hơn so với các giải pháp khác mà tôi đã tìm thấy. – brycejl

+0

Câu trả lời này là đá quý tinh khiết, nón tắt: D –

+0

Sử dụng các tác vụ tải lên URLSession với cấu hình nền có vẻ như đó là cách để đi. Nhưng điều này không thực sự hiệu quả với bạn, đúng không? Ngược lại, tài liệu (https://developer.apple.com/documentation/uikit/uiapplication/1623031-beginbackgroundtaskwithexpiratio) cho biết rằng việc sử dụng phương pháp của bạn chỉ cung cấp thời gian giới hạn cho tác vụ của bạn và "Nếu bạn không gọi endBackgroundTask: cho mỗi nhiệm vụ trước khi thời gian hết hạn, hệ thống sẽ giết chết ứng dụng. " Bạn vừa mới may mắn? Hoặc là "tinh chỉnh" bạn đề cập đến được sử dụng để có được khoảng thời gian này giới hạn? Bạn có thể xây dựng? – biomiker

Các vấn đề liên quan