-1

問題があり、それを修正する方法がわかりません。

Viewcontroller.m

-(void)application:(UIApplication *)application     didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSLog(@"APN device token: %@", deviceToken);
NSString *deviceTokenString = [NSString stringWithFormat:@"%@",deviceToken];
}

- (void)viewDidLoad
{
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.domain.com/blabla.php"]];
[request setHTTPMethod:@"POST"];

NSString *post =[[NSString alloc] initWithFormat:@"udid=%@&submit=",deviceTokenString];
[request setHTTPBody:[post dataUsingEncoding:NSUTF8StringEncoding]];

NSURLResponse *response;
NSError *err;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

[super viewDidLoad];
}

アプリケーション didRegisterForRemoteNotificationsWithDeviceToken からの deviceTokenString を投稿で viewDidLoad にしたいのですが、うまくいきません。

ViewController.h にこのコードがある場合

@interface ViewController : UIViewController {
NSString *deviceTokenString;
}

@property(nonatomic, retain) NSString *deviceTokenString;

deviceToken ではなく、「Null」のみを返します。

誰かが私を助けてくれることを願っています:)

4

3 に答える 3

1

UIApplication のデリゲート クラスと UIViewController クラスの 2 つの異なるクラスを扱っています。あるクラスで定義されたインスタンス変数は、クラスのプロパティとしても定義されていない限り、既定では他のクラスに公開されません。

あなたの場合、deviceTokenStringオブジェクトの View Controller クラスにプロパティを定義しました。したがって、View Controller のこのプロパティを、このオブジェクトへのアクセスに関心のある他のクラスに公開しました。

メソッド内の UIApplicationDelegate オブジェクト内でdidReceiveRemote...、システムによって NSString オブジェクトがパラメータ name で渡されますdeviceToken。このオブジェクトを受け取ったら、それに対して他の操作を行う必要はありません (つまりstringWithFormat:)。

アプリで発生する可能性があるものと発生しない可能性があるものは、競合状態と呼ばれるものです。viewDidLoadアプリがdidReceiveTokenメッセージを受信する前に発生する可能性があります。これに注意してください。

didReceiveRemote...問題を解決するには、次のようにメソッドで viewController オブジェクトにアクセスする必要があります。

-(void)didReceiveToken... {
      UIViewController *myViewController = self.viewController; //how do you initially set up this object?
      myViewController.deviceTokenString = deviceToken;
}

これが最善の方法であるとは言いませんが、問題は解決します。また、プロパティを設定したときに何が起こるかなど、他のことも省略します。viewDidLoad でそれを行うことは、物事を自動的に行う簡単な方法です。これを回避する方法は、それ自体が別の質問/チュートリアルである Key-Value-Observing を使用することです。

幸運を。

于 2013-07-15T21:00:04.300 に答える
1

deviceToken ではなく、「Null」のみを返します。

これは、インスタンス変数と同じ名前のローカル変数を宣言したためです。あなた-application:didRegisterForRemoteNotificationsWithDeviceToken:が持っている:

NSString *deviceTokenString = [NSString stringWithFormat:@"%@",deviceToken];

という名前のローカル変数を作成しますdeviceTokenString。その変数は、メソッドが終了するとすぐに消えます。インスタンス変数を設定することはないので、それにアクセスしようとすると-viewDidLoadnil になります。

この問題を解決するには、上記の行を次のように変更します。

deviceTokenString = [NSString stringWithFormat:@"%@",deviceToken];

インスタンス変数であるを使用してdeviceTokenStringいるため、値は ivar に割り当てられ、メソッドの最後まで保持されます。

于 2013-07-15T20:49:37.927 に答える
0

-(void)application 関数で NSString deviceTokenString を再宣言しています。そのローカル宣言は、インターフェイスで宣言されたプロパティに取って代わります。したがって、そのアプリケーション関数がスコープ外になると、作成した (スタック上にある) NSString オブジェクトは存在しなくなります。

-(void)application 関数から NSString * を削除します

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

      NSLog(@"APN device token: %@", deviceToken);
      deviceTokenString = [NSString stringWithFormat:@"%@",deviceToken];
}

これで問題が解決するはずです

于 2013-07-15T20:46:57.473 に答える