Предложение о том, как связать токен APN с зарегистрированным пользователем (через телефонную или UIWebView)

Аналогичный вопрос здесь: jQueryMobile, Phonegap и Device Token – iOS

Сценарий заключается в том, что у меня есть это веб-приложение PhoneGap, а родной iOS помогает мне зарегистрировать устройство в APN, и я получил токен устройства в своей базе данных сервера.

Вопрос 1: Как связать зарегистрированного пользователя (через UIWebView) с этим токеном устройства с помощью PhoneGap?

  • Теперь я должен написать собственный плагин и передать токен устройства во время регистрации пользователя. Есть ли лучшая альтернатива?

Вопрос 2: Поскольку device_token может время от времени меняться, как мне переназначить этого пользователя на это device_token?

  • Возможно, всякий раз, когда пользователь вводит логин, я делаю window.plugins. PluginName .getDeviceToken и синхронизировать его?
  • {user_id:123, old_device_token: 'xxxx..', new_device_token: 'xxx...'} ?

Fyi, это приложение построено для события, и клиент запросил людей для обмена сообщениями в этом мобильном приложении. Как вы нажимаете новое сообщение на «John Doe», когда он получил сообщение от своего друга? – Вопрос в том, как связать «Джон Доу» с конкретным device_token?

Это не может быть слишком специфичным для iOS, так как это приложение также должно быть развернуто на Android (C2DM).

Любая помощь приветствуется!

Изменить: Возможное решение?

Это неудивительное исследование:

  1. [Родной] Приложение запущено – начата регистрация APN и получено устройство device_token
  2. [Родной] Сохраните это устройство_token в локальном хранилище (CoreData / SqlLite или Списки свойств?) И отправьте его на сервер, чтобы сделать регистрацию device_token
  3. [WebView] Всякий раз, когда пользователь вводит логин или регистрацию, это device_token будет запрашиваться через PhoneGap, хешируется и отправляется серверу для входа, сравнения и ссылки.

Любой непредвиденный сценарий проблематичен?

EDIT: ответ

У меня есть мое полное рабочее решение, размещенное в ответе. Посмотрите здесь: https://stackoverflow.com/a/9628592/534862

  • Обновить количество значков для push-уведомлений в ios7
  • Отправка и получение push-уведомлений через AWS SNS
  • Является ли iOS прекратить доставку молчащих push-уведомлений, если пользователь игнорирует слишком много, не открывая приложение?
  • UDID для Push Notification вместо токена устройства?
  • Флажок «Push notifications» отключен для существующего идентификатора приложения на портале разработки iOS
  • Как автоматически увеличить значок уведомлений iOS с помощью Firebase Cloud Messaging?
  • Определите, открывается ли пользователь из приложения
  • iOS Быстрое получение уведомления о нажатии, когда приложение на переднем плане
  • 3 Solutions collect form web for “Предложение о том, как связать токен APN с зарегистрированным пользователем (через телефонную или UIWebView)”

    Хорошо, я наконец сделал плагин, который, кажется, работает

    1 – Убедитесь, что проект PhoneGap Xcode обновлен для iOS 4 SDK.

    2 – Создайте папку PushToken в папке «Плагины», добавьте к ней следующие файлы PushToken.m и PushToken.h, а затем перетащите папку в папку «Плагин» в XCode, используя «Создать группы для любых добавленных папок»,

    3 – Добавьте файлы PushToken.js в вашу папку www на диске и добавьте ссылки (файлы) в файлы .js как теги в html-файле (-ах)

    4 – Добавить новую запись с ключом PushToken и строковое значение PushToken для плагинов в PhoneGap.plist

    PushToken.h

     #import <Foundation/Foundation.h> #import <PhoneGap/PGPlugin.h> @interface PushToken : PGPlugin{ NSString* callbackID; } @property (nonatomic, copy) NSString* callbackID; - (void) getToken:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; @end 

    PushToken.m

     #import "PushToken.h" #import "AppDelegate.h" @implementation PushToken @synthesize callbackID; -(void)getToken:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options { self.callbackID = [arguments pop]; NSString *token = ((AppDelegate *)[[UIApplication sharedApplication] delegate]).token; PluginResult* pluginResult = [PluginResult resultWithStatus:PGCommandStatus_OK messageAsString:[token stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; if(token.length != 0) { [self writeJavascript: [pluginResult toSuccessCallbackString:self.callbackID]]; }else { [self writeJavascript: [pluginResult toErrorCallbackString:self.callbackID]]; } } @end 

    PushToken.js

     var PushToken = { getToken: function(types, success, fail) { return PhoneGap.exec(success, fail, "PushToken", "getToken", types); } }; 

    Как использовать

     PushToken.getToken( ["getToken"] , function(token) { console.log("Token : "+token); }, function(error) { console.log("Error : \r\n"+error); } ); 

    AppDelegate.h

     @interface AppDelegate : PhoneGapDelegate { NSString* invokeString; NSString* token; } @property (copy) NSString* invokeString; @property (retain, nonatomic) NSString* token; 

    AppDelegate.m

     - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { self.token = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""] stringByReplacingOccurrencesOfString: @" " withString: @""]; NSLog(@"My token is: %@", self.token); } 

    Я работал над PhoneGap 1.1

    Надеюсь это поможет

    Для полноты, это мое решение после использования решения @TDeBailleul. Повернулся к Кордове. (Протестировано только на iOS. После того, как я закончил версию Android, я опубликую плагин для этого:

    Окружающая среда

    • Кордова 1.5.0 (ранее PhoneGap)
    • Xcode 4.3.1
    • iOS 5.1
    • Mac OS X 10.7.3
    • Не используйте автоматический подсчет ссылок (ARC), чтобы избежать ошибки компиляции
    • Пройдите этот длинный учебник, чтобы получить сертификат Push Notification

    Рабочий поток

    1. [Родной] приложение запущено – начата регистрация APN, а device_token – на стороне сервера
    2. [Native] Application хранит токен в AppDelegate и, чтобы получить токен, используйте PushToken в следующих кодах
    3. [WebView] Каждый раз, когда пользователь вводит логин или регистрацию, маркер будет вызываться через плагин Cordova (ранее PhoneGap), хешируется и отправляется на сервер для входа, сопоставления и соединения пользователя с конкретным устройством.

    Итак, ниже приведены мои полные рабочие коды, которые выполняют естественное вытягивание токена. Серверная часть – это просто привязка учетных записей к устройствам. Вы должны знать, как это сделать через ваше любимое приложение на стороне сервера.

    AppDelegate.h

     @interface AppDelegate : NSObject < UIApplicationDelegate, UIWebViewDelegate, CDVCommandDelegate > { ... NSString* token; ... } ... ... ... @property (retain, nonatomic) NSString* token; 

    AppDelegate.m

    Примечание. Я новичок Obj-C, и я включил свою попытку отправить токен на свой сервер. Если вам не нужен механизм проводки, сохраните первые 5 строк (til ' self.token = dt ) в didRegisterForRemoteNotificationsWithDeviceToken

     ... @synthesize token; ... - (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions { ... [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; return YES; } - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"Did finish launching with device token %@", deviceToken); NSString *dt = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; dt = [dt stringByReplacingOccurrencesOfString:@" " withString:@""]; self.token = dt; NSString *dv = [[UIDevice currentDevice] systemVersion]; NSString *dn = [[UIDevice currentDevice] systemName]; NSString *nick = [[UIDevice currentDevice] name]; NSString *model = [[UIDevice currentDevice] model]; NSString *uniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier]; NSMutableString *postData = [NSMutableString stringWithString: @"&deviceToken="]; [postData appendString:dt]; [postData appendFormat:@"&uniqueIdentifier=%@&application_uuid=5ade8400-e29c-41d4-a716-3641972a2ec6", uniqueIdentifier]; [postData appendFormat:@"&source=ios&name=%@&model=%@&systemName=%@&systemVersion=%@", nick, model, dn, dv]; NSString* escapedURLString = [postData stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; @try { NSData *postData = [escapedURLString dataUsingEncoding:NSUTF8StringEncoding]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString:@"{YOUR URL TO POST TOKEN TO SERVER}"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval: 180]; NSString *postLength = [[NSString alloc] initWithFormat: @"%d", [postData length]]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postData]; NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; if (conn) { //?? }else{ //?? } } @catch (NSException *exception) { NSLog(@"Exception %@", exception); } } ... 

    PushToken.h

     #import <Foundation/Foundation.h> #import <CORDOVA/CDVPlugin.h> @interface PushToken : CDVPlugin { NSString* callbackID; } @property (nonatomic, copy) NSString* callbackID; - (void) getToken:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; @end 

    PushToken.m

     #import "PushToken.h" #import "AppDelegate.h" @implementation PushToken @synthesize callbackID; - (void)getToken:(NSMutableArray *)arguments withDict:(NSMutableDictionary *)options { NSLog(@"Did called getToken"); self.callbackID = [arguments pop]; NSString *token = ((AppDelegate *)[[UIApplication sharedApplication] delegate]).token; CDVPluginResult *pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:[token stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; if (token.length != 0) { [self writeJavascript: [pluginResult toSuccessCallbackString:self.callbackID]]; }else{ [self writeJavascript: [pluginResult toErrorCallbackString:self.callbackID]]; } } @end 

    PushToken.js

     var PushToken = { /** * Get token from the device * @param {array} types - By default is ['getToken'] * @param {function} success Success callback, with token * @param {function} fail Failure callback, with null */ getToken: function(types, success, fail) { return Cordova.exec(success, fail, "PushToken", "getToken", types); }, /** * For the sake of iOS, we need an install function */ install: function() { window.plugins = window.plugins || {}; window.plugins.PushToken = PushToken; } }; /** * For the rest of the devices */ window.plugins = window.plugins || {}; window.plugins.PushToken = PushToken; 

    Применение

     document.addEventListener('deviceready', function() { if (typeof PushToken == 'object') { PushToken.install(); } PushToken.getToken(['getToken'], function(token) { callback(token); }, function() { callback(null); }); }); 

    И вы сможете получить свой токен со стороны Javascript;)

    Повеселись!

    ура

    Предыдущие ответы – действительно отличные способы решения этой проблемы, и они делают это очень формально. Однако, если вам нужен быстрый и грязный метод решения проблемы, вы можете просто сделать это:

    в нижней части doRegisterForRemoteNotificationsWithDeviceToken добавить

     NSString* jsString = [NSString stringWithFormat:@"var deviceToken = \"%@\";", deviceToken]; [self.viewController.webView stringByEvaluatingJavaScriptFromString:jsString]; 

    В вашем javascript

     deviceId = (typeof deviceToken !== "undefined") ? deviceToken : null; 
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.