Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 向服务器发送设备令牌_Iphone_Token_Devicetoken - Fatal编程技术网

Iphone 向服务器发送设备令牌

Iphone 向服务器发送设备令牌,iphone,token,devicetoken,Iphone,Token,Devicetoken,我已经阅读了很多这方面的教程,我只是想知道这是否是正确的方法 - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { NSLog(@"My token is: %@", deviceToken); NSString* newToken = [deviceToken description];

我已经阅读了很多这方面的教程,我只是想知道这是否是正确的方法

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
    NSLog(@"My token is: %@", deviceToken);

    NSString* newToken = [deviceToken description];

    newToken = [newToken stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    newToken = [newToken stringByReplacingOccurrencesOfString:@" " withString:@""]; 


    NSString *urlString = [NSString stringWithFormat:@"http://myhost.com./filecreate.php?token=%@",newToken];

    NSURL *url = [[NSURL alloc] initWithString:urlString];

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];

    NSData *urlData;
    NSURLResponse *response;
    urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:nil];

}
-(void)应用程序:(UIApplication*)应用程序DIDregisterforRemotionTificationswithDeviceToken:(NSData*)deviceToken
{
NSLog(@“我的令牌是:%@”,deviceToken);
NSString*newToken=[deviceToken描述];
newToken=[newToken stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@”“];
newToken=[newToken StringByReplacingOfString:@“with String:@”的发生率];
NSString*urlString=[NSString stringWithFormat:@]http://myhost.com./filecreate.php?token=%@“,纽顿];
NSURL*url=[[NSURL alloc]initWithString:urlString];
NSURLRequest*urlRequest=[nsurlRequestRequestWithURL:url];
NSData*urlData;
NSURLResponse*响应;
urlData=[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&响应错误:nil];
}
欢迎任何建议

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{

    const char* data = [deviceToken bytes];
    NSMutableString* token = [NSMutableString string];

    for (int i = 0; i < [deviceToken length]; i++) {
        [token appendFormat:@"%02.2hhX", data[i]];
    }


    NSString *urlString = [NSString stringWithFormat:@"http://myhost.com/filecreate.php?token=%@",token];

    NSURL *url = [[NSURL alloc] initWithString:urlString];

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];   
    NSData *urlData;
    NSURLResponse *response;
    urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:nil];

}
-(void)应用程序:(UIApplication*)应用程序DIDregisterforRemotionTificationswithDeviceToken:(NSData*)deviceToken
{
常量字符*数据=[deviceToken字节];
NSMutableString*标记=[NSMutableString];
对于(int i=0;i<[deviceToken length];i++){
[令牌格式:@“%02.2hhX”,数据[i]];
}
NSString*urlString=[NSString stringWithFormat:@]http://myhost.com/filecreate.php?token=%@“,代币];
NSURL*url=[[NSURL alloc]initWithString:urlString];
NSURLRequest*urlRequest=[nsurlRequestRequestWithURL:url];
NSData*urlData;
NSURLResponse*响应;
urlData=[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&响应错误:nil];
}
我的应用程序可以使用这两种代码,但正确的方法是什么?

正如mja在评论中所说,最好添加错误恢复机制(如果请求失败,您将丢失令牌)并使用异步请求(在后台发送令牌)

在AppDelegate.m中:

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
    NSString * token = [NSString stringWithFormat:@"%@", deviceToken];
    //Format token as you need:
    token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
    token = [token stringByReplacingOccurrencesOfString:@">" withString:@""];
    token = [token stringByReplacingOccurrencesOfString:@"<" withString:@""];

    [[NSUserDefaults standardUserDefaults] setObject:token forKey:@"apnsToken"]; //save token to resend it if request fails
    [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"apnsTokenSentSuccessfully"]; // set flag for request status
    [DataUpdater sendUserToken]; //send token
}
然后可以调用[DataUpdater sendUserToken];在控制器中,当internet连接出现时,或定期出现,或在-(void)viewdiload或-(void)viewwillearch方法中

我的建议是:
1) 我使用发送异步请求并检查服务器JSON响应

2) 有时,最好使用诸如在didFinishLaunchingWithOptions方法中使用推送通知之类的服务

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
完成以上代码行后,添加下面的方法

#pragma mark -
#pragma mark Push Notifications
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString  *token_string = [[[[deviceToken description]    stringByReplacingOccurrencesOfString:@"<"withString:@""]
                            stringByReplacingOccurrencesOfString:@">" withString:@""]
                           stringByReplacingOccurrencesOfString: @" " withString: @""];
NSString* strURL = [NSString stringWithFormat:@"http://www.sample.com?device_token=%@&type=IOS",token_string];
strURL=[strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",strURL);
NSData *fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSLog(@"content---%@", fileData);
}
#pragma标记-
#pragma标记推送通知
-(无效)应用程序:(UIApplication*)应用程序DIdRegisterForRemotionTificationswithDeviceToken:(NSData*)deviceToken
{
NSString*token_string=[[[[deviceToken description]stringByReplacingOccurrencesOfString:@''和string:@''一起出现
StringByReplacingOfString:@“和字符串:@]”发生;
NSString*strURL=[NSString stringWithFormat:@]http://www.sample.com?device_token=%@&类型=IOS”,标记_字符串];
strURL=[strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@“%@”,strURL);
NSData*fileData=[NSData DATA WITHCONTENTSOFURL:[NSURL URLWithString:strURL]];
NSLog(@“内容-%@”,文件数据);
}

看起来不错,但是,我想1,添加错误恢复机制(如果请求失败,您将丢失您的令牌!)b,使用asynchronous request.asynchronous?这是什么意思?请给我一些关于错误恢复机制的指南。代码可以工作,但我想知道这是否是正确的方法,因为我在某个地方读过
NSString*newToken=[deviceToken description]
这不是将数据输入字符串的正确方法。您的代码工作吗?我做了同样的事情,但我的设备令牌在发送到服务器时变成了
(null)
。@tnylee您是否在NSLog中获得它?请尝试打印“urlString”就在发送到服务器并查看之前。打印响应以查看服务器端发生了什么。@Spire是的,我在NSLog中得到了它,我也删除了“”符号。它仍然是
(null)
.Thx dude但这是一个非常古老的问题。我接受答案,这可能会对某人有所帮助。我认为您应该在存储信息后致电。didFinishLaunchingWithoptions中的代码必须添加才能获得推送通知
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
     (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
#pragma mark -
#pragma mark Push Notifications
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSString  *token_string = [[[[deviceToken description]    stringByReplacingOccurrencesOfString:@"<"withString:@""]
                            stringByReplacingOccurrencesOfString:@">" withString:@""]
                           stringByReplacingOccurrencesOfString: @" " withString: @""];
NSString* strURL = [NSString stringWithFormat:@"http://www.sample.com?device_token=%@&type=IOS",token_string];
strURL=[strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@",strURL);
NSData *fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSLog(@"content---%@", fileData);
}