2013-10-04 14 views
18

Yeni iOS7 API (NSURLSession) ile arka plan indirme hakkında Apple belgeleri okuduktan sonra, biraz hayal kırıklığına uğradım. Ben ... Elma hiçbir arka planda ağ kullanılabilirliği üzerinde duraklama/özgeçmiş yönetmek (veya bunu yapmak için bir seçenek sunmak) ama emindiNSURLSession arka plan indir - ağ hatası üzerinden devam

Yani belgeleri okuyarak, bu elimizde ne olduğunu:

https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/URLLoadingSystem/NSURLSessionConcepts/NSURLSessionConcepts.html

When any task completes, the NSURLSession object calls the delegate’s URLSession:task:didCompleteWithError: method with either an error object, or nil if the task completed successfully. If the task is a resumable download task, the NSError object’s userInfo dictionary contains a value for the NSURLSessionDownloadTaskResumeData key. Your app should use reachability APIs to determine when to retry, and should then call downloadTaskWithResumeData: or downloadTaskWithResumeData:completionHandler: to create a new download task to continue that download. Go to step 3 (creating and resuming task objects).

Şimdiye kadar çözüm anlıyorum ama sorum şu: ağının kaybını işlemek ve arka planda indirilmeye devam etmek en iyisidir nedir mimarisi?

Tarafımdan erişilebilirliği kullanıyorum ve ağ her kullanılabilir olduğunda, tüm görevleri (oluştururken NSArray üzerinde başvurulan) devam ettiririm ve ağ kaybolduğunda bunları askıya alırım. Bu ön planda çalışır ancak arka plan için ben şu konularda ihtiyaç: Ben bütün görevleri bağlantısı olmadan arka planda giderseniz uygulamamı ön planda hiçbir bağlantısı varsa

  • askıya kalır ve olmaz ağ mevcutsa geri geldi…

  • Arka planda ağı kaybetme, tüm karşıdan yüklemeleri/görevleri durdur. Senaryo: Ön planda

    • , benim görevleri indirmeye başlamak
    • ben arka plana ve 10s peşine "aireplan modu"
    • için Tüm görevler bir hata var geçin. Yani URLSession: task: didCompleteWithError yönteminde: Onları downloadTaskWithResumeData kullanarak devam ettiririm veya yapamazsam (bazılarının yeterli özgeçmişi olmadığından) özgeçmiş olarak yeni bir görev oluşturuyorum (ağa geri dönülmüyorsa) o zamanda).
    • O zaman arka planda hâlâ gibi ağ geri uygulamayı başlatırken olmadan olduğunda ben bu noktaları ele nasıl ben ...

bir "özgeçmiş" tetikleyemez kadar

  • wifi koymak ? Bir şey mi özledim? Ben arka planda hâlâ gibi

  • +0

    Hayal kırıklığınızı paylaşıyorum. Bu konuda Apple'dan bir cevap beklediğinizi belirtiyorsunuz. Onlardan haber aldın mı? Çözünürlük nedir? – gavdotnet

    +0

    Apple ile bolca alışveriş yaptık ama üretken değildi, rekabeti, tezlerin dikkatini çeken (ancak sonuçların zamanında garanti edilmeden) dikkat çeken bayrağı kullanmasıdır. Bu mod benim amacım değildi, fazla odaklanmadım ama testim başarılı değildi. Bu bölümü test ettiyseniz, bilgi almak için hala ilginç olacaktır. – Gros

    cevap

    3

    Ben ağ geri uygulamayı başlatırken olmadan olduğunda ... Bir "özgeçmiş" tetikleyemez

    uygulaması getirme tarafından başlatılan siz "arkaplan getirme" kullanabilirsiniz

    , sonra ağı kontrol edebilir ve indirme görevini devam ettirebilirsiniz.

    +0

    Bu bir çözüm olabilir… Şu an Apple'dan bir cevap bekliyorum. – Gros

    +0

    @Gros, Apple'dan bunun hakkında bir cevap aldınız mı? Aynı sorunu yaşıyorum. – Keith

    +0

    Bu konuda herhangi bir kelime? – Siriss

    2

    NSURLSession'ı arka plan yapılandırmalarıyla oluşturmalısınız, ardından göreviniz bir arka plan ibranına gönderilir ve tamamlandığında uygulamanız çağrılır.

    2

    Uygulama: Uygulama temsilci

    application:handleEventsForBackgroundURLSession:completionHandler: 
    

    - completionHandler uğramadan - askıya iken cihaz bağlantısı kesilirse sonra Uygulama arka planda asmak neden olur.Bu şekilde, uygulama hala erişilebilirlik bildirimlerini dinleyebilir ve bir ağ bağlantısı tekrar kullanılabilir olduğunda indirme işlemini yeniden başlatabilir. Ancak, bu oldukça tehlikeli bir yaklaşımdır ve Apple'ın uygulama mağazası gönderim kurallarını geçemeyebilir. Ayrıca, uygulama ön plandayken bağlantı kaybolduğunda ve uygulama askıya alınırken bağlantı tekrar ele alındığında bu yaklaşım pek yardımcı olmaz. Arka planda benim indirmeleri duraklatmak için application:handleEventsForBackgroundURLSession:completionHandler: bildirimin

    • Yapılan kullanımını: Sonunda

      aşağıdaki yaptım.
    • Bağlantı durumunu kontrol etmek ve duraklatılmış yüklemeleri yeniden başlatmak için aralıklı arka plan getirme bildiriminin kullanılmasını (örn. application:performFetchWithCompletionHandler:completionHandler) kullanın. (hat-İpucu @gugupluto)

    Bu, en iyi indirme performansını sağlamaz ve kullanıcıların uygulamayı yeniden açtıklarında "arka plan indirme" işleminin neden bitmediğini merak etmelerine neden olabilir. Şimdilik Apple için en iyisini yapabiliriz.

    +0

    Uygulamaya, tamamlama işleyicisini geçmesi için belirli bir süre (yaklaşık 30 saniye) geçtiğini ve bunu yapmazsa, o zaman bir bekçi tarafından öldürüleceğini söyleyebilirim, * Xcode aracılığıyla başlatılan, bazı geliştiricilerin tamamlama işleyicisini dikkate almamalarını sağlayan hata ayıklama, geçerli olmadığında geçerli bir geçici çözümdür. –

    +0

    @oscahie Bu mantıklı olurdu ama iPad 4th genimde test ettiğimde bu benim şahit olduğum şey değildi. Uygulamanın süresiz olarak arka planda kaldığı ve ağ erişilebilirlik bildirimlerine yanıt verdiği görüldü. – gavdotnet