【问题标题】:Send device token to PHP script via UIWebView通过 UIWebView 将设备令牌发送到 PHP 脚本
【发布时间】:2014-05-02 00:49:44
【问题描述】:

我目前正在开发一个与圣地亚哥的大都会交通系统一起使用的交通网络应用程序。对于 iOS,我计划使用包含三个项目的 TabBar,[Home] [Favorites] [Notifications]。 [Home] 指向主页(以及任何其他页面),[Favorites] 是您可以设置您最喜欢的公共汽车/无轨电车站的地方。

我计划在 [Favorites] 中设置一个通知,以便在巴士在 MTS 提供的预定时间到达之前发送给您。因此,例如,如果一辆公共汽车将在 10:30 到达,并且您将通知设置为提前 5 分钟到达以提醒您,那么您将在 10:25 收到一辆。

我想将帐户与设备令牌相关联,我在这里阅读了一些问题,例如Linking user account to device token for push notifications

我相信可以通过在我登录时将设备令牌发送到 UIWebView 以某种方式链接帐户。

希望有人可以帮助我。

编辑: 下面是Home.m中的Obj-C代码

#import "Home.h"

@implementation HomeViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *URL1 = [NSURL URLWithString:@"url"];

    NSURLRequest *Request1 = [NSURLRequest requestWithURL:URL1];

    [webView1 loadRequest:Request1];

}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"1");
    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
    NSString *deviceToken = [defaults objectForKey:@"deviceToken"];
    bool tokenIsSent = [defaults boolForKey:@"tokenIsSent"];
    NSString *newToken = [defaults stringForKey:@"newToken"];
    NSLog(@"2");
    NSString *urlString = [NSString stringWithFormat:@"url"];
    NSURL *url = [[NSURL alloc] initWithString:urlString];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
    NSData *usernameData;
    NSURLResponse *response;
    usernameData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:nil];
    NSString *username = [[NSString alloc] initWithData:usernameData encoding:NSUTF8StringEncoding];
    NSLog(@"3");

    if (deviceToken != nil && tokenIsSent == NO) {
        NSLog(@"4");
        NSString *urlString = [NSString stringWithFormat:@"url/s=%@&u=%@",newToken, username];
        NSURL *url = [[NSURL alloc] initWithString:urlString];
        NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
        NSData *urlData;
        NSURLResponse *response;
        urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:nil];
        NSString *info = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];
        if([info  isEqual: @"success"]){
            [defaults setBool:YES forKey:@"tokenIsSent"];
            NSLog(@"5");
        }else{
            [defaults setBool:NO forKey:@"tokenIsSent"];
            NSLog(@"6");
        }
        [defaults synchronize];
    } else {
        NSLog(@"7");
    }

}

【问题讨论】:

    标签: php ios iphone push-notification apple-push-notifications


    【解决方案1】:

    首先将令牌保存到NSUserDefaults

    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:deviceToken forKey:@"deviceToken"];
        [defaults setBool:NO forKey:@"tokenIsSent"];
        [defaults synchronize];
    }
    

    因为这是在appDelegate 中完成的,此时用户尚未登录,这就是为什么您需要使用上面示例中的其他值tokenIsSent 进行跟踪并将其设置为NO(假)。

    现在,一旦用户通过身份验证,您就可以将其发送到您的服务器并与该用户关联。

    NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];
    bool deviceToken = [defaults boolForKey:@"deviceToken"];
    bool tokenIsSent = [defaults boolForKey:@"tokenIsSent"];
    
    if (deviceToken != nil && tokenIsSent) {
     // it is not null , and it was not sent to PHP so send it
            if(success){
                [defaults setBool:YES forKey:@"tokenIsSent"];
            }else{
                [defaults setBool:NO forKey:@"tokenIsSent"];
            }
            [defaults synchronize];
    }
    

    如果没有调用 delgate,则需要实现它:

    @interface HomeViewController : UIViewController<UIWebViewDelegate>
    

    并确保您分配了该委托。

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        //Assign the delegate to WebView1
        WebView1.delegate = self
    
        //Perform the request
        NSURL *URL1 = [NSURL URLWithString:@"http://clovercloud.net/app/f/"];
        NSURLRequest *Request1 = [NSURLRequest requestWithURL:URL1];
        [webView1 loadRequest:Request1];
    
    }
    

    【讨论】:

    • 如果你看看我在 FreeGor 的回答中做的 cmets,你认为结合这个回答和NSURLRequest 可以成功地将帐户链接到设备?
    • @alexpja 设备注册推送服务时,你还不知道该设备关联了哪个账号,所以先保存,不要在用户认证后执行NSURLRequest
    • 我在 if-then 语句中收到 'Use of undeclared identifier 'tokenIsSent'
    • @alexpja 哦,我以为您会检索这些值,请查看我更新的答案。 success 只是一个布尔值,用于确保请求成功
    • 我将其插入我的webView1.m,对吗? - (void)webViewDidFinishLoad:(UIWebView *)webView1 不工作,如果我把它放到我的- (void)viewDidLoad 中,它会自动完成
    【解决方案2】:

    推送通知的注册是通过原生应用完成的,只能通过原生应用进行。更多详情见答案:

    How can a web application send push notifications to iOS devices?

    推送通知与某种视图无关。

    【讨论】:

    • 是否无法在 UIWebView 中请求当前在会话变量(如 $_SESSION['username'])中设置的内容,然后将用户名和令牌以原生代码(如 registertoken.php?u=USERNAME&amp;token=TOKEN)发送到 PHP 脚本?
    • @alexpja 你应该从 APNS 获取设备令牌,然后你可以从任何你想要的地方发送它,它与 PHP 无关。请参阅文档:developer.apple.com/library/ios/documentation/…
    • 我目前从设备本身获取设备令牌,并在 didRegisterForRemoteNotificationsWithDeviceToken 我创建了一个 NSURLRequest 以将其发送到我的 PHP 脚本。为了验证它是否有效,我将它链接到我用来发送通知的脚本和一个 GET 变量 s。将应用程序从 Xcode 运行到我的 iPad 上,我的 iPhone 收到了带有设备令牌的通知。不知道你在说什么。
    • 如果用户没有用户 ID 或用户名,我将 UUID 与 iCloud 存储一起用于识别令牌。用户登录后,我正在更新数据库中的这一行。
    【解决方案3】:

    您可以将设备令牌存储在NSUserDefaults 中。然后,您可以从 iOS 应用程序中任何需要的地方访问它。因此,您可以在登录时将 is 传递给 UIWebView,并将登录的用户与设备令牌链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-25
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多