2015年9月19日土曜日

【Microsoft Azure】通知ハブのObjective-Cサンプルがそのまま動作しないので指摘してみる

Objective-Cはすっかり忘却の彼方にあったのですが、ふとしたことで触って気がついたのでメモ。

まずはこちら、Azureの通知ハブの使い方。
https://azure.microsoft.com/ja-jp/documentation/articles/notification-hubs-ios-get-started/

結構細かく書いていて、コピペでもイケるんじゃないかと思わせる。
ただ、問題点が2つある。さらに、Xcode7+iOS9でもうひとつ。

1.認証エラーになる
正直なところ「ここでエラーになるのか」と思うのだが、401エラーなのでしょうがない。
「通知を送信する」の段落にある6のコード。SAS認証トークン作成部分。
// Construct authorization token string
        token = [NSString stringWithFormat:@"SharedAccessSignature sr=%@&sig=%@&se=%qu&skn=%@",
            targetUri, signature, expires, HubSasKeyName];
どうもここのパラメーターの並び順が違うようです。
srを一番最後にします。
// Construct authorization token string
        token = [NSString stringWithFormat:@"SharedAccessSignature sig=%@&se=%qu&skn=%@&sr=%@",
            signature, expires, HubSasKeyName, targetUri];
正直謎です...

2.正常な場合のHTTPの応答コード
次はREST APIのメソッド、APNSネイティブ通知の送信です。
https://msdn.microsoft.com/ja-jp/library/azure/dn223266.aspx
ここにある正常な応答コードは「200」と書かれていますが、どうも「201」のようです。
同じく「通知を送信する」の段落にある7のコード。
    // Send the REST request
    NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response;
        if (error || httpResponse.statusCode != 200)
        {
            NSLog(@"\nError status: %d\nError: %@", httpResponse.statusCode, error);
        }
        if (data != NULL)
        {
            xmlParser = [[NSXMLParser alloc] initWithData:data];
            [xmlParser setDelegate:self];
            [xmlParser parse];
        }
    }];
この中の「httpResponse.statusCode != 200」が「201」になるわけです。
    // Send the REST request
    NSURLSessionDataTask* dataTask = [session dataTaskWithRequest:request
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
    {
        NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response;
        if (error || httpResponse.statusCode != 201)
        {
            NSLog(@"\nError status: %d\nError: %@", httpResponse.statusCode, error);
        }
        if (data != NULL)
        {
            xmlParser = [[NSXMLParser alloc] initWithData:data];
            [xmlParser setDelegate:self];
            [xmlParser parse];
        }
    }];
なお、通知ハブのPythonでのチュートリアルでは「201」になっているので、これが正しいんでしょうね。
https://azure.microsoft.com/ja-jp/documentation/articles/notification-hubs-python-backend-how-to/

3.Xcode7から「Enable Bitcode」がデフォルトでYESに
Bitcodeについて調べるとこちらの方がXcode7でのコンパイル方法をブログで解説しています。(助かりました!)
http://qiita.com/Takumi_Mori/items/ace01198c43c8bac6df0
WindowsAzureMessaging.frameworkが「ENABLE_BITCODE」のオプションに対応した形式でビルドされていないので、Xcodeの「Build Settings」の「Build Options」の「Enable Bitcode」をNOにしてね、ってことです。

それよりも、サンプルをswiftにしていただきたい、今日この頃です。