2009-07-23 24 views
0

私はコンテンツアプリを持っており、現在非常に長いApp Storeの投稿をバイパスして、Apple Push Notification Serviceを使用して新しいコンテンツをユーザーに通知したいと考えています。ユーザーが通知を受け取ると、ダウンロード更新ボタンが有効になります。ユーザーは私のウェブサイトからSQLファイルと画像をダウンロードします。 sqlファイルはinsert文を実行し、イメージはディスクにダウンロードされます。プッシュ通知サービス経由で画像を追加しますか?

現在、コンテンツ(文字列とバンドル画像参照)をUIWebViewに読み込みます。画像はコンテンツの一部として表示されます。新しいコンテンツを挿入するためにSQLファイルをどのように実行すればよいですか?それから、App Storeアップデートの提出を使ってイメージを置くバンドルではなく、ディスク上のイメージの参照を開始する必要がありますか?

SQLファイルの場合、ダウンロードが完了したらイベントベースのコードを実行する可能性があります。しかし、新しいコンテンツを見るためには、読み込み専用データベースを再ロードする必要があります。ユーザーはアプリを再起動する必要がありますか?

答えて

0

あなたのデータベースはあなたのアプリケーションには読み込み専用であると言いますが、既存のデータベースを変更するためにSQL文を実行する必要はなく、新しいデータベースファイルをダウンロードしてディスクに書き込みます。 (あなたのデータベースが非常に大きく、わずかな変更を加えている場合、ダウンロードサイズが考慮される場合を除きます)。

いずれにしても、バンドルからデータベースをロードすると、読み込み専用になりますので、insert文を実行することはできません。書き込み可能なコピーを作成する必要があります。このコピーを更新プロセスで置き換えると、各デバイスで正しく実行されているSQLについて心配する必要はありません。例えばアプリが中途半端に終了するとどうなりますか?

同様にイメージの場合、バンドルから読み込まれるのではなく、最初の起動時に書込み可能なイメージディレクトリにコピーされた場合、いつも同じ場所を探して、存在するかどうかは気にしません更新されました。あなたが必要以上にユーザーのストレージを食べていないように、更新後も不要になったものはすべて掃除してください。

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サーバーへペイロードを送信

  • -(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--; 
        } 
    

私が使用した擬似APNを受け取るためのコードを追加します(/公式サーバーサンドボックスサーバーは、あなたの状況に依存します) 「updateDB」内のコード、および偽のURLは、テスト用のWeb URLに置き換えてください。上記の動作はうまくいく、私はそれを大丈夫でした。しかし、私のアプリがバックグラウンドにあるときに通知を強制的に画像を表示することはできません。

関連する問題