2009-07-23 2 views
0

У меня есть приложение для контента и вы хотите уведомить пользователей о новом контенте с помощью службы Apple Push Notification Service, минуя очень длинные представления в App Store. После того, как пользователь получит уведомление, активируется кнопка обновления загрузки. Пользователь загрузит файл sql плюс изображения с моего сайта. Файл sql выполнит инструкции вставки, и изображения загрузятся на диск.Добавить изображения через Push Notification Service?

В настоящее время я загружаю контент (строки и ссылки на ссылки) в UIWebView. Изображения отображаются как часть содержимого. Как я могу выполнить sql-файл для вставки нового контента? Тогда мне также нужно будет начать ссылаться на изображения на диске, а не из пакета, где я помещаю изображения при использовании представлений об обновлении App Store?

Для файла sql я могу, вероятно, запустить код на основе событий после завершения загрузки. Но тогда база данных только для чтения должна быть перезагружена для просмотра нового контента. Будет ли пользователь перезагружать приложение?

ответ

0

Как вы сказали, база данных предназначена только для чтения для вашего приложения, я просто попробую APN запустить загрузку нового файла базы данных и записать его на диск вместо того, чтобы выполнять инструкции SQL для изменения существующего db. (Если ваша база данных не очень большая, и вы делаете небольшое изменение, когда размер загрузки будет рассмотрен).

В любом случае, если вы загружаете базу данных из пакета, она будет доступна только для чтения, поэтому вы не сможете выполнять инструкции вставки на ней - вам нужно будет сделать запись для записи. После того, как процесс обновления полностью заменит эту копию, вам не нужно беспокоиться о правильности выполнения 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 (песочница сервер/официальный сервер, в зависимости от ситуации)

  • добавить код получить 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, пожалуйста, замените его своим веб-адресом тестирования. Вышеуказанное действие работает, я сделал это нормально. Но я не могу заставить уведомление показывать изображение, когда мое приложение находится в фоновом режиме.