0

私はコンテンツアプリを持っており、Apple Push Notification Serviceを使用して、現在非常に長いApp Storeの提出をバイパスして、新しいコンテンツをユーザーに通知したいと思います。ユーザーが通知を受信すると、ダウンロード更新ボタンが有効になります。ユーザーは私のウェブサイトからSQLファイルと画像をダウンロードします。SQLファイルは挿入ステートメントを実行し、画像はディスクにダウンロードされます。

現在、コンテンツ(文字列とバンドル画像参照)をUIWebViewにロードしています。画像はコンテンツの一部として表示されます。SQLファイルを実行して新しいコンテンツを挿入するにはどうすればよいですか?次に、バンドルからではなく、ディスク上の画像の参照を開始する必要がありますか?これは、AppStoreの更新送信を使用しているときに画像を配置する場所です。

SQLファイルの場合、ダウンロードが完了したら、おそらくイベントベースのコードを実行できます。ただし、新しいコンテンツを表示するには、読み取り専用データベースを再ロードする必要があります。ユーザーはアプリを再起動する必要がありますか?

4

2 に答える 2

0

データベースはアプリに対して読み取り専用であると言ったように、既存のデータベースを変更するために SQL ステートメントを実行する代わりに、APN で新しいデータベース ファイルのダウンロードをトリガーし、それをディスクに書き込むだけです。(データベースが非常に大きく、ダウンロード サイズが考慮される場合に小さな変更のみを行う場合を除きます)。

いずれにせよ、バンドルからデータベースをロードする場合、データベースは読み取り専用になるため、挿入ステートメントを実行することはできません。書き込み可能なコピーを作成する必要があります。更新プロセスでこのコピー全体を置き換えるということは、各デバイスで SQL が正しく実行されているかどうかを心配する必要がないことを意味します。たとえば、アプリが挿入の途中で終了した場合はどうなりますか?

画像についても同様に、バンドルからロードするのではなく、最初の起動時に書き込み可能な画像ディレクトリにコピーした方が簡単です。そのため、常に同じ場所で画像を検索し、更新があったかどうかを気にしません。更新後に不要になったものはすべてクリーンアップして、必要以上にユーザーのストレージを消費しないようにしてください。

于 2009-10-21T15:27:40.613 に答える
0

もちろん、そうすることができます。

  • プッシュ通知ペイロードにカスタム フィールドを追加します。私の場合、「msgId」は必要なフィールドにすることができます。

    $body = array();
    $body['device_tokens'] = str_replace(' ', '', $_REQUEST["Token"]);
    $body['msgId'] = $MP_ID;
    $body['aps'] = array('alert' => $alertShort);
    $payload = json_encode($body);
    
  • ペイロードをAPNサーバーに送信します(サンドボックスサーバー/公式サーバー、状況によって異なります)

  • コードを追加してAPNを受け取ります

        -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
          NSLog(@"I got notification");
    
          [NSThread detachNewThreadSelector:@selector(handleRemoteNotification:) toTarget:self withObject:userInfo];
         }
    
    
    - (void)handleRemoteNotification:(NSDictionary *)userInfo {
      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    
      [UIApplication sharedApplication].applicationIconBadgeNumber++;// = [[[userInfo objectForKey:@"aps"] objectForKey:@"badge"] integerValue];
    
          if ([userInfo objectForKey:@"msgId"]) {
              iRetrievingAPNMessage++;
              NSString *msgId = [[NSString alloc] initWithString:[userInfo objectForKey:@"msgId"]];
              NSMutableString *theURL = [[NSMutableString alloc] init];
              [theURL appendFormat:@"http://yourDATAFeedPROGRAM.php?msgID=%@",msgId];
    
              MIPFileConnection *APNMsgConnection = [[MIPFileConnection alloc] initWithTargetURL:theURL useCache:NO];
              APNMsgConnection.delegate = self;
              [APNMsgConnection start];
    
              NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
              do {
              } while ((iRetrievingAPNMessage > 0) &&
                       [runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);
              NSLog(@"done");
          }
          [pool release];
      }
    
      - (void)updateDB:(NSDictionary *)msgDic {
          // do anything to update your sql db.
          // ATTENTION, the files located in bundle cannot be replaced.
          // so you need to duplicate your sql into cache/document path.
          // then you can update it successfully.
      }
    
    
      -(void)connectionDidFinishLoading:(NSURLFileConnection *)connection {
          CFPropertyListRef plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (CFDataRef)connection.receiveData, kCFPropertyListImmutable, NULL);
    
              if (plist) {
                  NSDictionary *tmpDic = (NSDictionary *)plist;
    
                  [self performSelectorOnMainThread:@selector(updateDB:) withObject:[tmpDic copy] waitUntilDone:NO];
    
                  [tmpDic release];
              }
              iRetrievingAPNMessage--;
      }
    

「updateDB」で疑似コードと偽の URL を使用しました。テスト用の Web URL に置き換えてください。上記のアクションは機能します。問題ありませんでした。しかし、アプリがバックグラウンドにあるときに、通知に画像を表示させることはできません。

于 2012-04-03T05:53:36.413 に答える