(設定などから)位置情報サービスが有効になっているアプリがあり、ALAssetsLibraryを使用してデバイスからすべての写真を読んでいます。
iPhone4 iOS 4.2.1では完全に機能しますが、同じコードと同じアセットは、どの3gsのiOS(4.0から4.2.1まで)でも機能しません。
問題は、3gsで常に無効なCLLocationを取得することです。
iPhone4の同じ画像(両方のデバイスにコピーされた)でも有効なCLLocationが返されますが、3gsでは無効になります。画像画像自体は両方のデバイスで有効であり、CLLocationのみが無効です。クラッシュは発生せず、コードは無効なブロックにステップインしません。無効なCLLocationデータを除けば、すべて正常に機能します。
同じアセット、同じコード、同じiOSバージョン(4.2.1)の出力:
iPhone4:<+51.23816667、-0.57700000> +/- 0.00m(速度-1.00 mps /コース-1.00)@19/02/201101:59:28グリニッジ標準時
3gs:<nan、nan> +/- 0.00m(速度-1.00 mps /コース-1.00)@ 2011-02-19 01:20:35 +0000
(無効な場所の日付は現在の時刻であることに注意してください)
このようなCLLocationを取得しています:
CLLocation* location = [asset valueForProperty:ALAssetPropertyLocation];
CLLocationCoordinate2D coord = [location coordinate];
if ( !CLLocationCoordinate2DIsValid(coord) ) return;
ビューコントローラDidLoadで呼び出されたALAssetsLibraryコードは、次のようになります(完全に標準)。
ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
void (^assetEnumerator)(struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
if(result != NULL)
{
[self myFunction:result withIndex:index];
}
};
void (^assetGroupEnumerator)(struct ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop) {
if(group != nil)
{
numberOfAssets = [group numberOfAssets];
[group enumerateAssetsUsingBlock:assetEnumerator];
}
};
[library enumerateGroupsWithTypes:ALAssetsGroupAll
usingBlock:assetGroupEnumerator
failureBlock: ^(NSError *error) {
NSLog(@"Oh no!");
}];
最後に、ネイティブフォトアプリでは、写真は3gsの正しい場所に表示されるため、どこかにそのデータが必要です。どういうわけかそれを読み取れません。
それがデバイス(3gs)の問題であるかどうかは完全にはわかりませんが、通常は問題ではありません...