0

Newsstandバックグラウンドで最新号をダウンロードしたいアプリを作成しています。これを可能にする適切なバックグラウンド モード キーが設定されています。

ペイロードをアプリにプッシュします。例:

{"aps": {"badge": 1,"content-available":"1"}}

しかし、アプリケーションがフォアグラウンドにない場合、バックグラウンドでダウンロードを開始できるようにプッシュ通知が送信されたことをどのように知ることができますか? アプリがフォアグラウンドにある場合、didReceiveRemoteNotification:アプリがフォアグラウンドにないか、実行されていないときに何をすべきかについて混乱しています。

ドキュメントによると:

通知が配信されたときにアプリケーションがフォアグラウンドで実行されていない場合、アプリケーションはバックグラウンドでアクティブ化され (または、必要に応じてバックグラウンドで起動され)、課題アセットをダウンロードします。それ以外の場合は、プッシュ通知と同じように通知を処理します。プッシュ通知の送信方法と処理方法については、ローカルおよびプッシュ通知プログラミング ガイドを参照してください。

クライアント アプリケーションはそのサーバーと通信し、ダウンロードする課題アセットの場所を示す URL を取得します。また、サーバーから問題の名前と日付を取得する必要がある場合もあります。このフェーズでは、ユーザーがサブスクリプションの資格があることを検証したり、その他の必要な承認を実行したりすることもできます。

ただし、ダウンロードを開始するためにどの方法を使用するかについては決して述べていません。

4

2 に答える 2

2

ユーザーがプッシュ通知に応答してアプリを起動した場合 (たとえば、ロック画面または通知センターからアプリをスライドさせた場合)、またはアプリが既に実行されている場合にのみ、アプリはプッシュ通知を受け取ります。また、プッシュ通知は配信を保証するものではありません。

アップデート:

ご指摘のとおり、Newstand アプリの場合は、UIRemoteNotificationTypeNewsstandContentAvailabilityアクセス許可を使用して、新しい問題のバックグラウンド ダウンロードを有効にする必要があります。ただし、それには独自の一連の技術的課題がないわけではありません。

「...アプリは 24 時間に 1 回だけバックグラウンド ダウンロードを開始できます。iOS は、24 時間に 2 回以上バックグラウンド ダウンロードを開始しようとする通知を無視します。」

ユーザーはバックグラウンド ダウンロードを無効にできますか?

はい。ユーザーは [設定] でアプリごとに Newsstand のプッシュ通知によるバックグラウンド ダウンロードを無効にすることができます。UIApplication の enabledRemoteNotificationTypes プロパティによって返される有効なタイプのセットで UIRemoteNotificationTypeNewsstandContentAvailability を探すことにより、アプリのバックグラウンド ダウンロードが無効になっているかどうかを判断できます。

から: http://developer.apple.com/library/ios/#technotes/tn2280/_index.html

テスト中に、1 日にあまりにも多くのコンテンツ更新を送信している可能性は十分にあります。

于 2012-12-19T20:52:06.327 に答える
1

「ユーザーがプッシュ通知に応答してアプリを起動した場合(たとえば、ロック画面上または通知センターからアプリをスライドさせた場合)、またはアプリがすでに実行されている場合にのみ、アプリはプッシュ通知を受信します。」

Newsstand通知(ペイロードにcontent-available:1がある)の場合、上記のステートメントは正しくありません。それを受け取ると、iOSはバックグラウンドでアプリを起動し(実行されていない場合)、アプリデリゲートのdidFinishLaunchingWithOptionsメソッドが呼び出されます。起動オプションディクショナリのUIApplicationLaunchOptionsRemoteNotificationKeyの値をチェックして、アプリケーションが通知によって起動されたかどうかを確認できます。

NSDictionary *payload = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];    


    if(payload && [[payload objectForKey:kContentAvailablePush] caseInsensitiveCompare:@"1"] == NSOrderedSame)
    {
        NSLog(@"app launched by Newsstand Remote notification. payload %@", payload);
        [self scheduleNewsStandDownload:payload];        
    }

メソッドscheduleNewsStandDownloadでは、ホストされているコンテンツのパス/日付などを取得して、ニューススタンドキューに追加するだけです。以下は擬似コードです。

NKLibrary *nkLib = [NKLibrary sharedLibrary];
NKIssue *nkIssue = [nkLib issueWithName:<your content id>];
if(!nkIssue)
   nkIssue = [nkLib addIssueWithName:<your content id>  date:<your content date>];


    NKAssetDownload *nkAssetDownloadGridCover = [nkIssue addAssetWithRequest:<urlRequest for the content>];        
    [nkAssetDownloadGridCover downloadWithDelegate:self];
于 2012-12-20T19:38:14.160 に答える